λ‚΄κ°€ μ΄ˆκΈ°μ— μƒκ°ν–ˆλ˜ 방법은 μ •μ‚¬κ°ν˜•μ˜ λ²”μœ„λ₯Ό μ§€μ •ν•˜κ³ , νŠΉμ • μ§€μ μ˜ 값을 μ •μ‚¬κ°ν˜• 쀑심을 κΈ°μ€€μœΌλ‘œ λŒ€μΉ­μ μ— μžˆλŠ”κ°’κ³Όμ˜ μ€‘κ°„κ°’μœΌλ‘œ μ •μ˜ν•˜λŠ” λ°©λ²•μž„.


μ΄λ ‡κ²Œ 되면 λ…Έμ΄μ¦ˆλ§΅μ΄ 쀑앙을 κΈ°μ€€μœΌλ‘œ λŒ€μΉ­μ΄ 되기 λ•Œλ¬Έμ—, μ •μ‚¬κ°ν˜•μ˜ κ°€μž₯μžλ¦¬μ—μ„œλŠ” μ •ν™•νžˆ 두 κ°’μ˜ 쀑간값을 μ΄μš©ν•˜κ³ , μ€‘μ‹¬μ—μ„œλŠ” 본래의 λ…Έμ΄μ¦ˆκ°’μ„ μ΄μš©ν•˜κ³ ,

κ·Έ 사이에선 κ·Έ λ‘˜μ˜ λ³΄κ°„λœ 값을 μ΄μš©ν•˜λŠ” 방법을 μƒκ°ν•˜κ³  μžˆμ—ˆμŒ


μ–΄μ°Œλλ˜ 연속적이긴 ν• ν…Œλ‹ˆκΉ 이어지긴 ν• κ±°μž„. 근데 λΆˆν™•μ‹€ν•΄μ„œ 이것저것 μ°Ύμ•„λ΄€μŒ



μ†”μ§νžˆ 아무도 κ΄€μ‹¬μ—†κ² μ§€λ§Œ, 감탄이 λ‚˜μ™€μ„œ 적어보렀고



https://gamedev.stackexchange.com/questions/23625/how-do-you-generate-tileable-perlin-noise

정석적인 방법은 λ…Έμ΄μ¦ˆν•¨μˆ˜λ₯Ό 직접 λ§Œλ“€μ–΄μ„œ, λžœλ€κ°’ 자체λ₯Ό 반볡되게 λ‚˜μ˜€κ²Œ ν•˜λŠ”κ±°λΌλŠ”λ°,


λ‚œ 아직도 νŽ„λ¦°/μ‹¬ν”Œλ ‰μŠ€ λ…Έμ΄μ¦ˆμ—μ„œ 이 λžœλ€κ°’μ„ κ΅¬ν•˜λŠ”κ²Œ λ‚œν•΄ν•˜κ²Œ λŠκ»΄μ§€λ”λΌ


viewimage.php?id=2abcdd23dad63db0&no=24b0d769e1d32ca73cec84fa11d028316f6e59db3d00f81430124d7066ef965df45268bfb505b02b395662db8bad043b41e8d08f5b82e26a6027980addd959d6983ec5

μ—¬κΈ°μ„œ ν™”μ‚΄ν‘œκ°€ κ·ΈλΌλ””μ–ΈνŠΈλΌκ³  κ·Έλƒ₯ (x,y)값이라 μƒκ°ν•˜λ©΄ 됨


grad[]λ°°μ—΄μ—λŠ” 각 μ’Œν‘œμ— λ“€μ–΄κ°ˆ 수 μžˆλŠ” κ·ΈλΌλ””μ–ΈνŠΈ 값듀을 넣어두고

perm[길이 : 256? 512?]배열에 λžœλ€ν•œ μˆ˜λ“€μ„ λ„£μ–΄λ‘ . μ„€μ •ν•œ μ‹œλ“œκ°’μ— 따라 이 배열이 μž¬μ •λ ¬μ΄ λœλ‹€λŠ”λ“―ν•¨. 이건 잘 λͺ¨λ₯΄κ² λ‹€


grad[]에 μš”μ†Œκ°€ 8κ°œκ°€ μžˆλ‹€λ©΄

(x,y)μ’Œν‘œμ— λŒ€μ‘ν•˜λŠ” κ·ΈλΌλ””μ–ΈνŠΈ 값은 grad[perm[x + perm[y]] % 8] 라고 함.


될것 κ°™λ‹€λŠ” λŠλ‚Œμ€ λ“œλŠ”λ° perm[x + perm[y]]κ°€ 정말 λžœλ€ν•œ 값을 내놓을지가 μ°μ°ν•˜κ²Œ 느껴짐

perm[]에 λžœλ€ν•œ μˆ˜κ°€ λ“€μ–΄μžˆμœΌλ‹ˆ λ‹Ήμ—°νžˆ λžœλ€ν•˜κ²Œ λ‚˜μ˜€κ² μ§€λ§Œ, κ·Έλƒ₯ 생전 μ²˜μŒλ³΄λŠ” 방식이라 μ‹ κΈ°ν•  따름.


μ•„λ¬΄νŠΌ μ—¬κΈ°μ„œ (x,y)μ’Œν‘œμ— λŒ€μ‘ν•˜λŠ” κ·ΈλΌλ””μ–ΈνŠΈ 값을 κ΅¬ν•˜κΈ° μœ„ν•΄ get(x,y)λ₯Ό μ‚¬μš©ν•˜λŠ” λŒ€μ‹ , get(x%4, y%4)λ₯Ό μ‚¬μš©ν•œλ‹€λ©΄, κ·Έλ¦¬λ“œ 4μΉΈλ§ˆλ‹€ λ°˜λ³΅λ˜λŠ” νŒ¨ν„΄μ΄ λ‚˜μ˜€κ² μ§€.



이건 λ…Έμ΄μ¦ˆ ν•¨μˆ˜λ₯Ό 직접 μˆ˜μ •ν•΄μ•Ό ν•˜κ³ , λ‹€λ₯Έ 방법을 μ°Ύμ•„λ΄€μŒ.

λ°”λ‘œ 밑에 μžˆλ”λΌ


μ§„μ§œ 상상도 λͺ»ν•œ λ°©λ²•μ΄μ˜€μŒ.

https://www.gamedev.net/blog/33/entry-2138456-seamless-noise/

https://ronvalstar.nl/creating-tileable-noise-maps

4dλ…Έμ΄μ¦ˆλ₯Ό μ΄μš©ν•˜λŠ” λ°©μ‹μž„.


κ·Έκ±Έ μ„€λͺ…ν•˜κΈ°μ— μ•žμ„œ

μš°μ„  1dλ…Έμ΄μ¦ˆλ₯Ό λ£¨ν”„μ‹œν‚€λŠ” 방법은


viewimage.php?id=2abcdd23dad63db0&no=24b0d769e1d32ca73cec84fa11d028316f6e59db3d00f81430124d7066ef965df45268bfb505b02b395662db8bad043b41e8d08f5b82e23e6029c85b8a8e0ad6fbdec4

2D λ…Έμ΄μ¦ˆ μœ„μ— 원을 그리면 됨.

원을 따라가며 값듀을 내보면, 이 값은 λ°˜λ³΅λ˜λŠ” λ…Έμ΄μ¦ˆ 값이 λ˜κ² μ§€.


μ• μ΄ˆμ— 이것뢀터 μ§„μ§œ 창의적인 아이디어라고 생각함. λ¬Όλ‘  이 방법 μžμ²΄λŠ” λ‹€λ₯Έκ³³μ—μ„œ λ¨Όμ € μ“°μ˜€κ² μ§€λ§Œ



μ›ν•˜λŠ” λ²”μœ„κ°€ 0~12라면,

noise(0)은 12μ‹œλΆ€λΆ„, noise(1)은 1μ‹œλΆ€λΆ„, noise(7)은 7μ‹œλΆ€λΆ„, noise(2.24)λŠ” 2.24μ‹œ λΆ€λΆ„μ˜ λ…Έμ΄μ¦ˆκ°’μ„ ꡬ해주면 됨.

μ›ν˜•μ΄κΈ°λ•Œλ¬Έμ—, 12λ§ˆλ‹€ 반볡이 λ κ±°μž„.



2dλ…Έμ΄μ¦ˆλŠ” μ–΄λ–»κ²Œ λ£¨ν”„μ‹œν‚€λƒλ©΄, 3d곡간, ꡬ에 2d평면을 λ§€ν•‘μ‹œμΌœμ£Όλ©΄ λ§ˆμ°¬κ°€μ§€λ‘œ λ°˜λ³΅λ˜λŠ” ν˜•νƒœκ°€ λ‚˜μ˜΄.

근데 2d평면을 3d에 λ§€ν•‘μ‹œμΌ°κΈ°λ•Œλ¬Έμ—, μ‹¬ν•œ μ™œκ³‘μ΄ μƒκΈ°κ²Œ 됨.

1dμ—μ„œλŠ” 2d평면에 μ™„λ²½ν•˜κ²Œ μ’Œν‘œλ§ˆλ‹€ λ™μΌν•œ 거리만큼 λ–¨μ–΄μ Έ 있게 λ§€ν•‘ν•  수 μžˆμ—ˆμ§€λ§Œ,

3dμ—μ„œλŠ” κ·ΈλŸ°μ‹μœΌλ‘œ μ™„λ²½ν•˜κ²Œ ꡬ에 2d평면이 λ§€ν•‘λœ μ’Œν‘œλ₯Ό κ΅¬ν•˜λŠ” 곡식이 μ–΅μ§€λ‘œ κΎΈκ²¨μ„œ λ§€ν•‘ν•˜λŠ” 방법 μ™Έμ—λŠ” μ—†λŠ” 것 κ°™μŒ.



κ·Έλž˜μ„œ μœ— 링크와 이 λ§ν¬μ—μ„œ 4d λ…Έμ΄μ¦ˆλ₯Ό μ΄μš©ν•˜λŠ” λ‹€λ₯Έ 방법을 μ†Œκ°œν–ˆλŠ”λ°, 이게 ν•΅μ‹¬μž„.


xμ’Œν‘œ, yμ’Œν‘œλ₯Ό λ”°λ‘œλ”°λ‘œ μ•„κΉŒ 1dλ…Έμ΄μ¦ˆλ₯Ό μ΄μš©ν•˜λ“― 2d평면에 μ›ν˜•μœΌλ‘œ λ§€ν•‘μ‹œμΌœμ€˜μ„œ,


(x,y)λ₯Ό ꡬ할 λ•Œ, x에 λŒ€μ‘ν•˜λŠ” 2dν‰λ©΄μ˜ μœ„μΉ˜ (x1,y1)을 κ΅¬ν•˜κ³ , y에 λŒ€μ‘ν•˜λŠ” 2dν‰λ©΄μ˜ μœ„μΉ˜ (x2,y2)λ₯Ό ꡬ함.


그리고 λ…Έμ΄μ¦ˆ4D noise(x1,y1,x2,y2)둜 값을 κ΅¬ν•˜λ©΄ 됨.


νƒ€μΌμ˜ 경계λ₯Ό μ–΄λ–€ λ°©μ‹μœΌλ‘œ λ„˜λ”λΌλ„, μƒμ„±λœ (x1,y1,x2,y2)λŠ” λΆ€λ“œλŸ½κ²Œ 연속적인 μ’Œν‘œκ°€ 됨.



κ·Έλž˜μ„œ 이걸 μ™œ μ•Œμ•„λ΄€λƒλ©΄, μ œν•œλœ 크기의 볡셀 맡을 절차적 μƒμ„±μœΌλ‘œ λ§ˆμ„, λ„μ‹œ λ“± μ„Έμ„Έν•œ λ””ν…ŒμΌκΉŒμ§€ κ³„νšν•΄μ„œ λ§Œλ“€κ±΄λ°,

이게 λ§Œμ•½ 타일링이 λœλ‹€λ©΄? 마치 λ¬΄ν•œλ§΅μ²˜λŸΌ 반볡되게 μ§€ν˜•μ„ λ‘œλ“œμ‹œν‚¬ 수 μžˆλ‹€λ©΄?

μ§€κ΅¬μ²˜λŸΌ ν•œλ°©ν–₯으둜 계속 κ±Έμ–΄κ°”μ„λ•Œ μ›λž˜ 자리둜 λŒμ•„μ˜¬ 수 μžˆλ‹€λ©΄?