ç§ã®ãµã€ãã§æã人æ°ã®ããèšäºã®1ã€ã¯ã
å€è§åœ¢ãããã®
çæã«é¢ãããã®ã§ã ïŒHabréã§ã®
翻蚳 ïŒã ãã®ãããªã«ãŒããäœæããã«ã¯ãå€ãã®åŽåãå¿
èŠã§ãã ããããç§ã¯ããããå§ããã®ã§ã¯ãªããããã§èª¬æãã
ã¯ããã«åçŽãªã¿ã¹ã¯ããå§ããŸããã ãã®ç°¡åãªææ³ã«ããã50è¡æªæºã®ã³ãŒãã§ãã®ãããªã«ãŒããäœæã§ããŸãã
ãã®ãããªã«ãŒãã®
æãæ¹ã¯èª¬æããŸãããèšèªãã°ã©ãã£ãã¯ã¹ã©ã€ãã©ãªããã©ãããã©ãŒã ãªã©ã«äŸåããŸãã
é
åã«ãããããŒã¿ã
å
¥åããæ¹æ³ã説æããŸãã
ãã€ãº
2Dããããçæããæšæºçãªæ¹æ³ã¯ãPerlinãã€ãºãã·ã³ãã¬ãã¯ã¹ãã€ãºãªã©ãå¶éãããåšæ³¢æ°åž¯åã®ãã€ãºããã«ãã£ã³ã°ãããã¯ãšããŠäœ¿çšããããšã§ãã ãã€ãºé¢æ°ã¯æ¬¡ã®ããã«ãªããŸãã
ãããäžã®åãã€ã³ãã«0.0ã1.0ã®æ°å€ãå²ãåœãŠãŸãã ãã®ç»åã§ã¯ã0.0ã¯é»ã§ã1.0ã¯çœã§ãã
Cã«äŒŒãèšèªã®æ§æã§åã°ãªãããã€ã³ãã®è²ãèšå®ããæ¹æ³ã¯æ¬¡ã®ãšããã§ãã
for (int y = 0; y < height; y++) { for (int x = 0; x < width; x++) { double nx = x/width - 0.5, ny = y/height - 0.5; value[y][x] = noise(nx, ny); } }
ã«ãŒãã¯ãJavascriptãPythonãHaxeãC ++ãCïŒãJavaãããã³ä»ã®ã»ãšãã©ã®äžè¬çãªèšèªã§åãããã«æ©èœãããããå¿
èŠãªèšèªã«å€æã§ããããã«Cã®ãããªæ§æã§ç€ºããŸãã ãã¥ãŒããªã¢ã«ã®æ®ãã®éšåã§ã¯ãæ°ããé¢æ°ãè¿œå ãããšãã«ã«ãŒãã®æ¬äœãã©ã®ããã«å€åãããïŒè¡ã®
value[y][x]=âŠ
ïŒã瀺ããŸãã ãã¢ã§ã¯å®å
šãªäŸã瀺ããŸãã
äžéšã®ã©ã€ãã©ãªã§ã¯ã0.0ãã1.0ã®ç¯å²ã§å€ãè¿ãããã«ãçµæã®å€ãã·ãããŸãã¯ä¹ç®ããå¿
èŠããããŸãã
身é·
ãã€ãºèªäœã¯åãªãæ°åã®éãŸãã§ãã ç§ãã¡ã¯ããã«
æå³ãäžããå¿
èŠããããŸãã æåã«èããããããšã¯ããã€ãºå€ãé«ãã«ãã€ã³ãããããšã§ãïŒããã¯ãé«ããããããšåŒã°ããŸãïŒã äžèšã®ãã€ãºãåããé«ããšããŠæç»ããŸãããïŒ
å
åŽã®ã«ãŒããé€ããŠãã³ãŒãã¯ã»ãŒåããŸãŸã§ããã ããã¯æ¬¡ã®ããã«ãªããŸãã
elevation[y][x] = noise(nx, ny);
ã¯ããããã ãã§ãã ãããããŒã¿ã¯åããŸãŸã§ããããããã§ã¯
value
ã§ã¯ãªãã
elevation
ïŒé«ãïŒãšåŒã³
value
ã
ããããã®äžããããŸãããããã以äžã¯ãããŸããã äœãæªãã®ïŒ
é »åºŠ
ãã€ãºã¯ã©ã®
åšæ³¢æ°ã§ãçæã§ã
ãŸã ã ãããŸã§ã®ãšãããåšæ³¢æ°ã1ã€ã ãéžæããŸããã ãããã©ã®ããã«åœ±é¿ãããèŠãŠã¿ãŸãããã
ã¹ã©ã€ã㌠ïŒå
ã®èšäºïŒã§
å€ãå€æŽããŠãããŸããŸãªåšæ³¢æ°ã§äœãèµ·ãããã確èªããŠãã ããã
ã¹ã±ãŒã«ãå€æŽããã ãã§ãã æåã¯ããã¯ããŸã圹ã«ç«ããªãããã§ãããããã§ã¯ãããŸããã
çè«ã説æãããã1ã€ã®
ãã¥ãŒããªã¢ã« ïŒHabréã§ã®
翻蚳 ïŒããããŸãïŒåšæ³¢æ°ãæ¯å¹
ããªã¯ã¿ãŒãããã³ã¯ãã€ãºããã«ãŒãã€ãºãªã©ã®æŠå¿µã
elevation[y][x] = noise(freq * nx, freq * ny);
åšæ³¢æ°ã®éæ°ã§ãã
æ³¢é·ãæãåºãããšãæã
圹ç«ã¡ãŸãã åšæ³¢æ°ã2åã«ãããšããµã€ãºã¯ååã«ãªããŸãã æ³¢é·ã2åã«ãããšããã¹ãŠåã«ãªããŸãã æ³¢é·ã¯ããã¯ã»ã«/ã¿ã€ã«/ã¡ãŒãã«ããŸãã¯ãããçšã«éžæãããã®ä»ã®åäœã§æž¬å®ãããè·é¢ã§ãã åšæ³¢æ°ã«é¢é£ããŠããŸãïŒ
wavelength = map_size / frequency
ã
ãªã¯ã¿ãŒã
é«ãããããããé¢çœãããããã«ã
ç°ãªãåšæ³¢æ°ã®ãã€ãºãè¿œå ããŸã ã
elevation[y][x] = 1 * noise(1 * nx, 1 * ny); + 0.5 * noise(2 * nx, 2 * ny); + 0.25 * noise(4 * nx, 2 * ny);
1ã€ã®ãããã§ã倧ããªäœåšæ³¢äžãšå°ããªé«åšæ³¢äžãæ··åšãããŸãããã å
ã®èšäºã®
ã¹ã©ã€ããŒãåãããŠãå°ããªäžãããã¯ã¹ã«è¿œå ããŸãã
ä»ã§ã¯ãç§ãã¡ãå¿
èŠãšãããã©ã¯ã¿ã«ææžã®ããã§ãïŒ äžãäžåäžãªå±±ãæã«å
¥ããããšã¯ã§ããŸããããŸã å¹³éã¯ãããŸããã ãããè¡ãã«ã¯ãå¥ã®ãã®ãå¿
èŠã§ãã
åé
åž
ãã€ãºé¢æ°ã¯ã0ã1ïŒãŸãã¯ãã©ã€ãã©ãªã«å¿ããŠ-1ã+1ïŒã®å€ãæäŸããŸãã ãã©ãããã¬ãŒã³ãäœæããã«
ã¯ãé«ãã环ä¹ããŸãã ïŒå
ã®èšäºã®ïŒ
ã¹ã©ã€ããŒãåãããŠãç°ãªãè§åºŠãååŸããŸãã
e = 1 * noise(1 * nx, 1 * ny); + 0.5 * noise(2 * nx, 2 * ny); + 0.25 * noise(4 * nx, 4 * ny); elevation[y][x] = Math.pow(e, exponent);
é«ãå€ã¯
å¹³éãŸã§ã®å¹³åã®é«ããäœãããäœãå€ã¯å±±ã®ããŒã¯ã«åãã£ãŠå¹³åã®é«ããäžããŸãã ããããçç¥ããå¿
èŠããããŸãã ã¹ãé¢æ°ã¯åçŽãªã®ã§äœ¿çšããŸãããä»»æã®æ²ç·ã䜿çšã§ããŸãã ãã£ãšè€éãª
ãã¢ããããŸãã
çŸå®çãªæšé«ããããã§ããã®ã§ããã€ãªãŒã ãè¿œå ããŸãããïŒ
ãã€ãªãŒã
ãã€ãºã¯æ°å€ãäžããŸããã森æãç æŒ ãæµ·ã®å°å³ãå¿
èŠã§ãã æåã«ã§ããããšã¯ãå°ããªé«ããæ°Žã«å€ããããšã§ãã
function biome(e) { if (e < waterlevel) return WATER; else return LAND; }
ãããŒãããã¯ãã§ã«æç¶ãçã«çæãããäžçã®ããã«ãªã£ãŠããŸãïŒ æ°ŽãèãéªããããŸãã ããããããã«å¿
èŠãªå Žåã¯ã©ãã§ããããïŒ æ°Žãç ãèã森æããµãã³ããç æŒ ãéªã®ã·ãŒã±ã³ã¹ãäœæããŸãããã
é«ãã«åºã¥ãææž function biome(e) { if (e < 0.1) return WATER; else if (e < 0.2) return BEACH; else if (e < 0.3) return FOREST; else if (e < 0.5) return JUNGLE; else if (e < 0.7) return SAVANNAH; else if (e < 0.9) return DESERT; else return SNOW; }
ãããŒãããã¯çŽ æŽãããã§ããïŒ ã²ãŒã ã§ã¯ãå€ãšãã€ãªãŒã ãå€æŽã§ããŸãã Crysisã«ã¯ããã«å€ãã®ãžã£ã³ã°ã«ããããŸãã Skyrimã«ã¯ãã£ãšå€ãã®æ°·ãšéªããããŸãã ããããã©ã®ããã«æ°å€ãå€æŽããŠãããã®ã¢ãããŒãã¯ããªãå¶éãããŸãã å°åœ¢ã¿ã€ãã¯é«ãã«å¯Ÿå¿ãããããã¹ããªããã圢æããŸãã ããããããé¢çœãããããã«ã¯ãäœãä»ã®ãã®ã«åºã¥ããŠãã€ãªãŒã ãéžæããå¿
èŠããããŸãã 湿床ã®
2çªç®ã®ãã€ãºããããäœæããŸãããã
äžèšã¯é«ãã®ãã€ãºã§ãã äž-湿床ãã€ãºæ¬¡ã«ãé«ããšæ¹¿åºŠã
äžç·ã«äœ¿çšããŸãããã 以äžã«ç€ºãæåã®ç»åã§ã¯ãy軞ã¯é«ãïŒäžã®ç»åããååŸïŒãx軞ã¯æ¹¿åºŠïŒ2çªç®ã®ç»åã¯é«ãïŒã§ãã ããã«ãããé
åçãªããããåŸãããŸãã
2ã€ã®ãã€ãºå€ã«åºã¥ãç·©åå°ããªé«ãã¯æµ·ãšæµ·å²žã§ãã é«æã¯å²©ãå€ãéªãå€ãã ãã®éã«ãå¹
åºããã€ãªãŒã ãååŸããŸãã ã³ãŒãã¯æ¬¡ã®ããã«ãªããŸãã
function biome(e, m) { if (e < 0.1) return OCEAN; if (e < 0.12) return BEACH; if (e > 0.8) { if (m < 0.1) return SCORCHED; if (m < 0.2) return BARE; if (m < 0.5) return TUNDRA; return SNOW; } if (e > 0.6) { if (m < 0.33) return TEMPERATE_DESERT; if (m < 0.66) return SHRUBLAND; return TAIGA; } if (e > 0.3) { if (m < 0.16) return TEMPERATE_DESERT; if (m < 0.50) return GRASSLAND; if (m < 0.83) return TEMPERATE_DECIDUOUS_FOREST; return TEMPERATE_RAIN_FOREST; } if (m < 0.16) return SUBTROPICAL_DESERT; if (m < 0.33) return GRASSLAND; if (m < 0.66) return TROPICAL_SEASONAL_FOREST; return TROPICAL_RAIN_FOREST; }
å¿
èŠã«å¿ããŠãã²ãŒã ã®èŠä»¶ã«å¿ããŠããããã¹ãŠã®å€ãå€æŽã§ããŸãã
ãã€ãªãŒã ãå¿
èŠãªãå Žåãæ»ãããªã°ã©ããŒã·ã§ã³ïŒ
ãã®èšäºãåç
§ ïŒã§è²ãäœæã§ããŸãã
ãã€ãªãŒã ãšåŸé
ã®äž¡æ¹ã«ã€ããŠãåäžã®ãã€ãºå€ã§ã¯ååãªå€åæ§ãåŸãããŸãããã2ã€ã§ååã§ãã
æ°å
åã®ã»ã¯ã·ã§ã³ã§ã¯ã
枩床ã®ä»£ããã«
é«åºŠã䜿çšããŸããã é«ããé«ãã»ã©ã枩床ã¯äœããªããŸãã ãã ããå°ççãªç·¯åºŠã枩床ã«åœ±é¿ããŸãã é«ããšç·¯åºŠã®äž¡æ¹ã䜿çšããŠæž©åºŠãå¶åŸ¡ããŸãããïŒ
極ïŒç·¯åºŠã倧ããïŒã®è¿ãã®æ°åã¯å¯ããå±±ã®é äžïŒé«ããé«ãïŒã®æ°åãå¯ãã§ãã ãããŸã§ã®ãšãããç§ã¯ãããããŸãäžçæžåœã«è§£æ±ºããŠããŸããããããã®ãã©ã¡ãŒã¿ãŒã«é©åãªã¢ãããŒããããã«ã¯ãå€ãã®åŸ®èª¿æŽãå¿
ââèŠã§ãã
å£ç¯çãªæ°åå€åããããŸãã å€ãšå¬ã«ã¯ãååçãšååçãæãããªãå¯ããªããŸãããèµ€éã§ã¯ç¶æ³ã¯ããŸãå€ãããŸããã ããã§ãå€ãã®ããšãã§ããŸããããšãã°ãåè¶é¢šãšæµ·æµãæ°åã«å¯Ÿãããã€ãªãŒã ã®åœ±é¿ã枩床ã«å¯Ÿããæµ·æŽã®å¹³ååå¹æãã·ãã¥ã¬ãŒãã§ããŸãã
島ã
ããã€ãã®ãããžã§ã¯ãã§ã¯ãå°å³ã®å¢çç·ãæ°Žã§ããå¿
èŠããããŸããã ããã«ãããäžçã¯1ã€ä»¥äžã®å³¶ã«ãªããŸãã ãããè¡ãã«ã¯å€ãã®æ¹æ³ããããŸãããããªãŽã³ããããžã§ãã¬ãŒã¿ãŒã§ããªãåçŽãªãœãªã¥ãŒã·ã§ã³ã䜿çšããŸãããé«ãã
e = e + a - b*d^c
ãšããŠå€æŽããŸããïŒ
d
ã¯äžå¿ããã®è·é¢ïŒ0-1ã®ã¹ã±ãŒã«ïŒïŒã å¥ã®ãªãã·ã§ã³ã¯ã
e = (e + a) * (1 - b*d^c)
ã§ãã å®æ°
a
ã¯ãã¹ãŠãäžãã
b
ã¯ç«¯ãäžãã
c
ã¯äœäžçãå¶åŸ¡ããŸãã
ç§ã¯ããã«å®å
šã«æºè¶³ããŠããããã§ã¯ãªã ããŸã ãŸã 調æ»ãå¿
èŠã§ãã ãã³ããã¿ã³ãŸãã¯ãŠãŒã¯ãªããè·é¢ã§ããïŒ äžå¿ãŸã§ã®è·é¢ã«äŸåããã®ãã端ãŸã§ã®è·é¢ã«äŸåããã®ãïŒ è·é¢ã2ä¹ããããç·åœ¢ã«ãããããŸãã¯ä»ã®çšåºŠã«ããå¿
èŠããããŸããïŒ ããã¯å ç®/æžç®ããŸãã¯ä¹ç®/é€ç®ããŸãã¯ä»ã®äœãã§ããããïŒ å
ã®èšäºã§ã¯ãAddãa = 0.1ãb = 0.3ãc = 2.0ã
è©ŠãããMultiplyãa = 0.05ãb = 1.00ãc = 1.5ã
è©ŠããŸãã æé©ãªãªãã·ã§ã³ã¯ããããžã§ã¯ãã«ãã£ãŠç°ãªããŸãã
ãªãæšæºçãªæ°åŠé¢æ°ã«åºå·ããã®ã§ããïŒ ç§ã®
èšäºã§RPGã®æå· ïŒHabréã§ã®
翻蚳ïŒã«ã€ããŠè¿°ã¹ãããã«ã誰ããïŒç§ãå«ãïŒå€é
åŒãææ°ååžãªã©ã®æ°åŠé¢æ°ã䜿çšããŸãããã³ã³ãã¥ãŒã¿ãŒäžã§ã¯ãããã«éå®ããããšã¯ã§ããŸããã ã«ãã¯ã¢ããããŒãã«
e = e + height_adjust[d]
ã䜿çšããŠã
ä»»æã®ãã©ãŒã¡ãŒã·ã§ã³é¢æ°ã䜿çšããŠããã§äœ¿çšã§ããŸãã ãããŸã§ã®ãšãããç§ã¯ãã®åé¡ãç 究ããŠããŸããã
ã¹ãã€ã¯ãã€ãº
é«ãã环ä¹ãã代ããã«ã絶察å€ã䜿çšããŠéãããŒã¯ãäœæã§ããŸãã
function ridgenoise(nx, ny) { return 2 * (0.5 - abs(0.5 - noise(nx, ny))); }
ãªã¯ã¿ãŒããè¿œå ããã«ã¯ã倧ããªåšæ³¢æ°ã®æ¯å¹
ãå€åãããŠãè¿œå ããããã€ãºãå±±ã ããåä¿¡ã§ããããã«ããŸãã
e0 = 1 * ridgenoise(1 * nx, 1 * ny); e1 = 0.5 * ridgenoise(2 * nx, 2 * ny) * e0; e2 = 0.25 * ridgenoise(4 * nx, 4 * ny) * (e0+e1); e = e0 + e1 + e2; elevation[y][x] = Math.pow(e, exponent);
ç§ã¯ãã®ãã¯ããã¯ã®çµéšãããŸããªãã®ã§ãããŸã䜿ãæ¹æ³ãåŠã¶ããã«å®éšããå¿
èŠããããŸãã ã¹ãã€ã¯ã®ããäœåšæ³¢ãã€ãºãšã¹ãã€ã¯ã®ãªãé«åšæ³¢ãã€ãºãæ··ããããšãèå³æ·±ããããããŸããã
ãã©ã¹
é«ãã次ã®nã¬ãã«ã«äžžãããšããã©ã¹ãåŸãããŸãã
ããã¯ãé«ãåååžé¢æ°ã
e = f(e)
圢åŒã§é©çšããçµæã§ãã äžèšã§ã¯ã
e = Math.pow(e, exponent)
ã䜿çšããŠå±±ã®ããŒã¯ãã·ã£ãŒãã«ããŸããã ããã§ã¯ã
e = Math.round(e * n) / n
ã䜿çšããŠãã©ã¹ãäœæããŸãã éã¹ãããé¢æ°ã䜿çšããå Žåããã©ã¹ãäžžãããããç¹å®ã®é«ãã§ã®ã¿çºçãããããšãã§ããŸãã
ããªãŒã®é
眮
éåžžãé«ããšæ¹¿åºŠã«ãã©ã¯ã¿ã«ãã€ãºã䜿çšããŸããããæšãç³ãªã©ã®äžçééã®ãªããžã§ã¯ããé
眮ããããã«ã䜿çšã§ããŸãã é«ãã«ã¯ãäœåšæ³¢æ°ã®é«æ¯å¹
ïŒãã¬ãããã€ãºãïŒã䜿çšããŸãã ãªããžã§ã¯ããé
眮ããã«ã¯ãé«åšæ³¢æ°ïŒããã«ãŒãã€ãºãïŒã§é«æ¯å¹
ã䜿çšããå¿
èŠããããŸãã ãã«ãŒãã€ãºãã¿ãŒã³ã¯å·ŠåŽã«è¡šç€ºãããŸãã å³åŽã¯ããã€ãºãé£æ¥ããå€ããã倧ããå Žæã§ãã
for (int yc = 0; yc < height; yc++) { for (int xc = 0; xc < width; xc++) { double max = 0;
ãã€ãªãŒã ããšã«ç°ãªãRãéžæãããšãæš¹æšã®å¯å€å¯åºŠãååŸã§ããŸãã
ãã®ãããªãã€ãºã䜿çšããŠããªãŒãé
眮ã§ããã®ã¯çŽ æŽãããããšã§ãããä»ã®ã¢ã«ãŽãªãºã ãããå¹æçã§ãããããåäžãªååžãäœæããããšããããããŸãããã¢ãœã³ã¹ãããããŽã¡ã³ã¿ã€ã«ããŸãã¯ã°ã©ãã£ãã¯ãã£ã¶ãªã³ã°ã§ãã
ç¡éãšãã®å
ãž
äœçœ®ïŒxãyïŒã§ã®ãã€ãªãŒã ã®èšç®ã¯ãä»ã®ãã¹ãŠã®äœçœ®ã®èšç®ãšã¯ç¡é¢ä¿ã§ãã ãã®
ããŒã«ã«èšç®ã«ã¯ã2ã€ã®äŸ¿å©ãªããããã£ããããŸãã䞊åã§èšç®ã§ããç¡éã®å°åœ¢ã§äœ¿çšã§ããŸãã
å·ŠåŽã®ããããã ïŒå
ã®èšäºïŒã«
ããŠã¹ã«ãŒãœã«ã眮ããå³åŽã«ããããçæããŸãã ã«ãŒãå
šäœãçæããããšãªãïŒããã«ä¿åããããšãªãïŒãã«ãŒãã®ä»»æã®éšåãçæã§ããŸãã
å®è£
ãã€ãºã䜿çšããŠå°åœ¢ãçæããããšã¯äžè¬çãªãœãªã¥ãŒã·ã§ã³ã§ãããã€ã³ã¿ãŒãããã§ã¯å€ãã®ç°ãªãèšèªãšãã©ãããã©ãŒã ã®ãã¥ãŒããªã¢ã«ãèŠã€ããããšãã§ããŸãã ç°ãªãèšèªã§ã«ãŒããçæããããã®ã³ãŒãã¯ã»ãŒåãã§ãã 以äžã«ã3ã€ã®ç°ãªãèšèªã§ã®æãåçŽãªã«ãŒãã瀺ããŸãã
- JavascriptïŒ
let gen = new SimplexNoise(); function noise(nx, ny) {
- C ++ïŒ
module::Perlin gen; double noise(double nx, double ny) {
- PythonïŒ
from opensimplex import OpenSimplex gen = OpenSimplex() def noise(nx, ny):
ãã¹ãŠã®ãã€ãºã©ã€ãã©ãªã¯ã»ãšãã©åãã§ãã
Pythonã® opensimplexãC ++ã®libnoise ããŸãã¯JavaScriptã®
simplex-noiseãè©ŠããŠãã ããã æãäžè¬çãªèšèªã«ã¯ãå€ãã®ãã€ãºã©ã€ãã©ãªããããŸãã ãŸãã¯ãPerlinãã€ãºãã©ã®ããã«æ©èœããããåŠã¶ããšããèªåã§ãã€ãºãèªèããããšãã§ããŸãã
ããŸããã§ããã䜿çšã®èšèªã®ããŸããŸãªãã€ãºã©ã€ãã©ãªã§ã¯ãã¢ããªã±ãŒã·ã§ã³ã®è©³çŽ°ã¯ãããã«ç°ãªãå ŽåããããŸãïŒ0.0ã1.0ã®ç¯å²ã®æ»ãå€ã-1.0ã+1.0ã®ç¯å²ã®æ»ãå€ãªã©ïŒããåºæ¬çãªèãæ¹ã¯åãã§ãã å®éã®ãããžã§ã¯ãã§ã¯ãã¯ã©ã¹ã§
noise
é¢æ°ãš
gen
ãªããžã§ã¯ããã©ããããå¿
èŠããããŸããããããã®è©³çŽ°ã¯ç¡é¢ä¿ãªã®ã§ãããããã°ããŒãã«ã«ããŸããã
ãã®ãããªåçŽãªãããžã§ã¯ãã§ã¯ãã©ã®ãããªãã€ãºã䜿çšããŠãããŸããŸãããããŒãªã³ãã€ãºãã·ã³ãã¬ãã¯ã¹ãã€ãºãOpenSimplexãã€ãºãå€ãã€ãºãããããã€ã³ããªãã»ããããã€ã€ã¢ã³ãã¢ã«ãŽãªãºã ãéããŒãªãšå€æãªã©ã§ãã ããããã«é·æãšçæããããŸãããåæ§ã®ã«ãŒããžã§ãã¬ãŒã¿ãŒã§ã¯ãã»ãŒåãåºåå€ãäœæããŸãã
ããã
ã®ã¬ã³ããªã³ã°ã¯ãã©ãããã©ãŒã ãšã²ãŒã ã«äŸåãããããå®è£
ããŸããã§ããã ãã®ã³ãŒãã¯ãé«ããšãã€ãªãŒã ãçæããããã«ã®ã¿å¿
èŠã§ããããã®ã¬ã³ããªã³ã°ã¯ã²ãŒã ã§äœ¿çšãããã¹ã¿ã€ã«ã«äŸåããŸãã ãããžã§ã¯ãã§ã³ããŒã移æ€ã䜿çšã§ããŸãã
å®éš
ãªã¯ã¿ãŒããæ··åãããã¯ãŒããã¯ãŒã«äžããé«ããšæ¹¿åºŠãçµã¿åãããŠãã€ãªãŒã ãäœæããããšãæ€èšããŸããã
ããã§ã¯ããããã®ãã©ã¡ãŒã¿ãŒããã¹ãŠè©Šãããšãã§ããã€ã³ã¿ã©ã¯ãã£ããªã°ã©ãã調ã¹ãŠãã³ãŒãã®æ§æã瀺ããŸãã
ãµã³ãã«ã³ãŒãã次ã«ç€ºããŸãã
var rng1 = PM_PRNG.create(seed1); var rng2 = PM_PRNG.create(seed2); var gen1 = new SimplexNoise(rng1.nextDouble.bind(rng1)); var gen2 = new SimplexNoise(rng2.nextDouble.bind(rng2)); function noise1(nx, ny) { return gen1.noise2D(nx, ny)/2 + 0.5; } function noise2(nx, ny) { return gen2.noise2D(nx, ny)/2 + 0.5; } for (var y = 0; y < height; y++) { for (var x = 0; x < width; x++) { var nx = x/width - 0.5, ny = y/height - 0.5; var e = (1.00 * noise1( 1 * nx, 1 * ny) + 0.50 * noise1( 2 * nx, 2 * ny) + 0.25 * noise1( 4 * nx, 4 * ny) + 0.13 * noise1( 8 * nx, 8 * ny) + 0.06 * noise1(16 * nx, 16 * ny) + 0.03 * noise1(32 * nx, 32 * ny)); e /= (1.00+0.50+0.25+0.13+0.06+0.03); e = Math.pow(e, 5.00); var m = (1.00 * noise2( 1 * nx, 1 * ny) + 0.75 * noise2( 2 * nx, 2 * ny) + 0.33 * noise2( 4 * nx, 4 * ny) + 0.33 * noise2( 8 * nx, 8 * ny) + 0.33 * noise2(16 * nx, 16 * ny) + 0.50 * noise2(32 * nx, 32 * ny)); m /= (1.00+0.75+0.33+0.33+0.33+0.50); } }
é£ç¹ããããŸããé«ããšæ¹¿åºŠã®ãã€ãºã®ããã«ãç°ãªãã·ãŒãã䜿çšããå¿
èŠããããŸããããã§ãªããã°ããããã¯åãã§ããããšãå€æããã«ãŒãã¯ããã»ã©é¢çœãèŠããŸããã Javascriptã§ã¯
ãprng-parkmillerã©ã€ãã©ãªã䜿çš
ããŸã ã C ++ã§ã¯ã2ã€ã®åå¥ã®
linear_congruential_engineãªããžã§ã¯ãã䜿çšã§ã
ãŸã ã Pythonã§ã¯ã
random.Randomã¯ã©ã¹ã® 2ã€ã®åå¥ã®ã€ã³ã¹ã¿ã³ã¹ãäœæã§ããŸãã
èã
ãããçæã®
åçŽãã®ããã«ãã®ã¢ãããŒãã奜ãã§ãã ããã¯é«éã§ããããŸãšããªçµæãçæããããã«éåžžã«å°ãªãã³ãŒããå¿
èŠã§ãã
ãã®ã¢ãããŒãã«ããã圌ã®å¶éã¯å¥œãã§ã¯ãããŸããã ããŒã«ã«èšç®ã§ã¯ãåãã€ã³ãã¯ä»ã®ãã¹ãŠã®ãã€ã³ãããç¬ç«ããŠããŸãã ãããã®ç°ãªãé åã¯
äºãã«æ¥ç¶ãããŠ
ããŸãã ã ãããäžã®åå Žæã¯åãããã§ãã ããšãã°ããå°å³äžã«3ã5ã€ã®æ¹ãããããªã©ã®ã°ããŒãã«ãªå¶éããæé«å³°ã®é äžããæµ·ã«æµããå·ãªã©ã®ã°ããŒãã«ãªæ©èœã¯ãããŸããã ãŸããè¯ãç»åãååŸããããã«ã¯ãé·æéãã©ã¡ãŒã¿ãèšå®ããå¿
èŠããããšããäºå®ã奜ãã§ã¯ãããŸããã
ãªãæšå¥šããã®ã§ããïŒ ããã¯ãç¹ã«ã€ã³ãã£ãŒãºã²ãŒã ãã²ãŒã ãžã£ã ã«ãšã£ãŠã¯è¯ãåºçºç¹ã ãšæããŸãã ç§ã®åéã®2人ã
ã²ãŒã ã³ã³ãã¹ãã®ãã
ã«ããã30æ¥ã§
çæ°ã®
é åã®åæããŒãžã§ã³ãæžããã å°å³ã®äœæãæäŒã£ãŠã»ãããšé ŒãŸããŸããã ç§ã¯ãã®ææ³ïŒããã³ããŸã圹ã«ç«ããªãããšãå€æããä»ã®ããã€ãã®é¢æ°ïŒã䜿çšãããããã®ããããäœæããŸããã æ°ãæåŸããã¬ã€ã€ãŒããã®ãã£ãŒãããã¯ãåãåããã²ãŒã ã®èšèšãæ
éã«ç 究ããåŸã
ããã§èª¬æ
ãããããã€ããªãŽã³ã«åºã¥ããããé«åºŠãªããããžã§ãã¬ãŒã¿ãŒãäœæããŸããïŒHabréã§ã®
翻蚳 ïŒã ãã®ã«ãŒããžã§ãã¬ãŒã¿ãŒã¯ããã®èšäºã§èª¬æããææ³ã䜿çšããŸããã ãã€ãºã䜿çšããŠããŸã£ããç°ãªãæ¹æ³ã§ããããäœæããŸãã
è¿œå æ
å ±
ãã€ãºé¢æ°ã§ã§ããããšã¯
ãããããããŸãã ã€ã³ã¿ãŒããããæ€çŽ¢ãããšãä¹±æ°æµã倧波ãããã®ãããã«ããã©ã¯ã¿ã«ãæ¯å¹
æžè¡°ããã©ã¹ããããã€ãã€ãºã解æç埮åããã¡ã€ã³ã¯ãŒãã³ã°ãªã©ã®ãªãã·ã§ã³ãèŠã€ããããšãã§ããŸãã
ãã®ããŒãžãã€ã³ã¹ãã¬ãŒã·ã§ã³ã®æºãšããŠäœ¿çšã§ããŸãã ããã§ã¯ããããèæ
®ãããç§ã®èšäºã¯åçŽãã«çŠç¹ãåœãŠãŠããŸãã
ãã®ãããžã§ã¯ãã¯ã以åã®ãããçæãããžã§ã¯ãã®åœ±é¿ãåããŸããã
- ç§ã¯æåã®Real of the Mad Godã«ãŒããžã§ãã¬ãŒã¿ãŒã« Perlinã®å
šäœçãªãã€ãºã䜿çšããŸããã ã¢ã«ãã¡ãã¹ãã®æåã®6ãæé䜿çšããŠãããã¢ã«ãã¡ãã¹ãäžã«æ±ºå®ããã²ãŒã ãã¬ã€èŠä»¶ã®ããã«ç¹å¥ã«äœæããããããã€ããªãŽã³ã®ããããžã§ãã¬ãŒã¿ãŒã«çœ®ãæããŸããã èšäºã®ãã€ãªãŒã ãšãã®è²ã¯ããããã®ãããžã§ã¯ãããåãããŠããŸãã
- ãªãŒãã£ãªä¿¡å·ã®åŠçãç 究ãããšããåšæ³¢æ°ãæ¯å¹
ããªã¯ã¿ãŒãããã€ãºã®ãè²ããªã©ã®æŠå¿µã説æãããã€ãºãã¥ãŒããªã¢ã«ãæžããŸããã ãµãŠã³ãã§æ©èœããåãæŠå¿µã¯ããã€ãºããŒã¹ã®ã«ãŒãçæã«ãé©çšãããŸãã ãã®ãšããç§ã¯çã®ãã¢ææžçæãäœæããŸãããããŸã å®æããŠããŸããã
- å¢çãèŠã€ããããã«å®éšããããšããããŸãã é
åçãªããããäœæããããã«æäœéå¿
èŠãªã³ãŒãã®éãç¥ããããšæããŸããã ãã®ãããããžã§ã¯ãã§ã¯ãã³ãŒãã®ãŒãè¡ã«å°éããŸãã-ãã¹ãŠã¯ç»åãã£ã«ã¿ãŒïŒä¹±æµããããå€ãè²ã®ã°ã©ããŒã·ã§ã³ïŒã§è¡ãããŸãã ããã¯ç§ã幞ãã§æ²ãããããŸããã ç»åãã£ã«ã¿ãŒã«ãã£ãŠãããçæãã©ã®çšåºŠå®è¡ã§ããŸããïŒ ååã«å€§ããã ãæ»ãããªè²ã®ã°ã©ããŒã·ã§ã³ã®ã¹ããŒã ãã«ã€ããŠäžã§èª¬æãããã¹ãŠã¯ããã®å®éšããåãããŠããŸãã ãã€ãºã¬ã€ã€ãŒã¯ä¹±æµã€ã¡ãŒãžãã£ã«ã¿ãŒã§ãã ãªã¯ã¿ãŒãã¯äºãã«éãåããããç»åã§ãã 床ããŒã«ã¯ãPhotoshopã§ã¯ãæ²ç·è£æ£ããšåŒã°ããŸãã
å°ãæ°ã«ãªãã®ã¯ãã²ãŒã éçºè
ããã€ãºããŒã¹ã®å°åœ¢ïŒäžç¹å€äœãå«ãïŒãçæããããã«èšè¿°ããã³ãŒãã®ã»ãšãã©ãããµãŠã³ããã£ã«ã¿ãŒãšã€ã¡ãŒãžãã£ã«ã¿ãŒã®ã³ãŒããšåãã§ãããšããããšã§ãã äžæ¹ã§ããããæ°è¡ã®ã³ãŒãã§ããªããŸãšããªçµæãåŸãããããããã®èšäºãå·çããŸããã ããã¯ã
ãã°ããç°¡åã«åç
§ã§ãããã€ã³ãã§ãã éåžžããã®ãããªã«ãŒãã¯é·ãé䜿çšããŸããããã²ãŒã ãã¶ã€ã³ã«é©ããã¿ã€ãã®ã«ãŒããèŠã€ãã£ããããã«ãããè€éãªããããžã§ãã¬ãŒã¿ãŒã«çœ®ãæããŸãã ããã¯ç§ã«ãšã£ãŠæšæºçãªãã¿ãŒã³ã§ããéåžžã«åçŽãªãã®ããå§ããŠã䜿çšããŠããã·ã¹ãã ãããããç解ããåŸã«ã®ã¿çœ®ãæããŸãã
ãã€ãºã䜿ã£ãŠã§ããããšã¯ä»ã«ã
ãããããããŸãããç§ãèšåããèšäºã§ã¯ã»ãã®ãããã§ãã
Noise Studioãè©ŠããŠãããŸããŸãªæ©èœãã€ã³ã¿ã©ã¯ãã£ãã«ãã¹ãããŠãã ããã