๋ฐ‘๋ฐ”๋‹ฅ ์ฝ”๋”ฉ์€ ๋๋‚ฌ๊ณ  ์ด์ œ ์ปจํ…์ธ  ์ œ์ž‘์— ์ง‘์ค‘ํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋˜์–ด์„œ

๊ฐ€๋” ์ผ์ง€ ๊ฐ™์€๊ฑฐ ์˜ฌ๋ฆผ


๊ทธ๋ฆฌ๊ณ  ๋ง‰ ์‹œ์ž‘ํ•œ ๋ธ”๋กœ๊ทธ ํ™๋ณด๋„ ์ข€

https://devanzblog.wordpress.com/



๋งˆ์ธํฌ๋ž˜ํ”„ํŠธ๊ฐ™์ด ์ •ํ•ด์ง„ ๊ทœ์น™์œผ๋กœ ๊ฒŒ์ž„ ๋‚ด์˜ ์ปจํ…์ธ ๋ฅผ ์ž๋™ ์ƒ์„ฑํ•˜๋Š” ๊ฒƒ์„
โ€˜์ ˆ์ฐจ์  ์ปจํ…์ธ  ์ƒ์„ฑ(Procedural Content Generation)โ€™์ด๋ผ๊ณ  ํ•จ..

๋งˆ์ธํฌ๋ž˜ํ”„ํŠธ๊ฐ€ ์–ด๋–ป๊ฒŒ ์ง€ํ˜•์„ ๋งŒ๋“œ๋Š”์ง€ ์กฐ์‚ฌํ•˜๋‹ค๋ณด๋ฉด ์˜ˆ์ œ๋“ค ๋งŽ์ด ๋‚˜์˜ค๋Š”๋ฐ ์š”์•ฝํ•˜๋ฉด
2์ฐจ์›ย ์ขŒํ‘œ๊ฐ’์„ ๋…ธ์ด์ฆˆ ํ•จ์ˆ˜์— ๋„ฃ์–ด์„œ ๊ฐ’์„ ์–ป๊ณ  ์ด๊ฒƒ์„ ๋†’์ด๋กœ ์‚ผ์•„ ๊ทธ ์•„๋žซ๋ถ€๋ถ„์„ ๋ธ”๋ก์œผ๋กœ ๋ฉ”์šฐ๋Š” ๊ฑฐ์ž„.
๋…ธ์ด์ฆˆ ํ•จ์ˆ˜๋Š”ย ์™„์ „ ๋ฌด์ž‘์œ„๊ฐ€ ์•„๋‹ˆ๋ผ ์–ด๋–ค ํŒจํ„ด์ด ์žˆ๋Š” ๋žœ๋ค ๊ฐ’์„ ๋‚ด๋†“๋Š” ํ•จ์ˆ˜์ž„. ํŽ„๋ฆฐ์ด๋‹ˆ ๋ญ๋‹ˆ ๋งŽ์Œ.
์œ ๋‹ˆํ‹ฐ์—๋„ Mathf.PerlinNoise ๋ผ๋Š”๊ฑฐ ์žˆ์œผ๋‹ˆ๊นŒ ๊ฐ„๋‹จํ•˜๊ฒŒ ๋งŒ๋“ค์–ด ๋ณผ ์ˆ˜ ์žˆ์Œ.

์ด๋Ÿฐ ๊ฐ„๋‹จํ•œ ๊ทœ์น™์œผ๋กœ๋„ ๊ทธ๋Ÿด๋“ฏํ•œ ์ง€ํ˜•์„ ๋งŒ๋“ค ์ˆ˜ ์žˆ์Œ.
ํ•˜์ง€๋งŒ ์ด ๋ฐฉ๋ฒ•์€ ๋†’์ด๋ฅผ ๊ฒฐ์ •ํ•˜๊ณ  ๊ทธ ์•„๋ž˜๋ฅผ ์ „๋ถ€ ๋ฉ”์šฐ๊ธฐ ๋•Œ๋ฌธ์—ย ๋™๊ตด์ด๋‚˜ ์ ˆ๋ฒฝ๊ณผ ๊ฐ™์€ ์ง€ํ˜•์€ ํ‘œํ˜„ํ•  ์ˆ˜๊ฐ€ ์—†์Œ.

์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋ ค๋ฉด
3์ฐจ์› ์ขŒํ‘œ๋ฅผ ๋ชจ๋‘ ์ˆœํšŒํ•˜๋ฉด์„œย ๋…ธ์ด์ฆˆ ๊ฐ’์ด 0๋ณด๋‹ค ํด ๊ฒฝ์šฐ ๋ธ”๋ก์„ ๋†“๊ณ , ๊ทธ๋ ‡์ง€ ์•Š์„ ๊ฒฝ์šฐ ๋น„์›Œ ๋‘๋Š” ๋ฐฉ๋ฒ•
์„ ์‚ฌ์šฉํ•˜๋ฉด ๋จ. ๋…ธ์น˜๋Š” ์ด๊ฒƒ์„ โ€˜๋ฐ€๋„โ€™๋ผ๊ณ  ํ‘œํ˜„ํ•จ.

๋…ธ์ด์ฆˆ์— ์–ด๋–ค ๊ฐ€๊ณต๋„ ๊ฑฐ์น˜์ง€ ์•Š๊ณ  ๊ทธ๋Œ€๋กœ ์‚ฌ์šฉํ•˜๊ฒŒ ๋˜๋ฉด
๋†’์ด์— ์ƒ๊ด€์—†์ด ๋…ธ์ด์ฆˆ ํ•จ์ˆ˜์˜ ๊ฐ’์ด ๋ฌด์ž‘์œ„๋กœ ๋ถ„ํฌํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์‹ค์ œ๋กœ๋Š” ๋ฏธ๋กœ๊ฐ™์€ 3์ฐจ์› ๋™๊ตด์ด ๋งŒ๋“ค์–ด์ง.
๊ทธ๋ž˜์„œ ๋†’์ด๊ฐ€ ๋†’์•„์งˆ ์ˆ˜๋ก ๊ฐ’์ด 0์„ ๋„˜์ง€ ๋ชปํ•˜๋„๋ก ์ œํ•œ์„ ์ฃผ์–ด์•ผ ํ•จ.
๋˜ ํ•œํŽธ์œผ๋กœ๋Š” ๋ฐ”๋‹ฅ์— ๊ตฌ๋ฉ์ด ๋šซ๋ฆฌ์ง€ ์•Š๋„๋ก ์ผ์ • ๋†’์ด๊นŒ์ง€๋Š” ๊ฐ’์ด 0 ์ด์ƒ์ด ๋˜๋„๋ก ํ•ด์•ผ ํ•จ.

๋‚œ ๋…ธ์ด์ฆˆ ๊ฐ€๊ณต ํ•จ์ˆ˜๋ฅผ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ •์˜ํ•ด์„œย ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•จ.
์กฐ๊ธˆ๋งŒ ์ƒ๊ฐํ•ด ๋ณด๋ฉด ์ง๊ด€์ ์œผ๋กœ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ํ•จ์ˆ˜์ž„. ์•„๋‹˜ ๋ง๊ณ .

private float GetTerrainNoise(FastNoise noise, int x, int y, int z)
{
ย  ย  float scale = 4f;
ย  ย  // ์ตœ์†Œ ๋†’์ด
ย  ย  float offset = 8f;
ย  ย  // [-1, 1] ๋ฒ”์œ„์˜ ๊ฐ’
ย  ย  float rawNoise = noise.GetNoise(x, y, z);
ย  ย  // offset์„ ๋”ํ•˜๊ณ  ํ˜„์žฌ y์ขŒํ‘œ๋ฅผ ๋บŒ์œผ๋กœ์จ ์ตœ์†Œ ๋†’์ด์™€ ์ตœ๋Œ€ ๋†’์ด๋ฅผ ๊ณ ๋ คํ•  ์ˆ˜ ์žˆ๋‹ค.
ย  ย  float value = rawNoise * scale + offset - y;
ย 
ย  ย  return value;
}


y ์ขŒํ‘œ๋ฅผ ๋นผ๋Š” ๋ฐฉ๋ฒ•์ด ์ž˜ ๋จนํž˜


height map ๋ฐฉ์‹์œผ๋กœ๋Š” ํ‘œํ˜„ํ•  ์ˆ˜ ์—†๋Š” ์ง€ํ˜•๋„ ๋‚˜ํƒ€๋‚จ


๊ฒฐ๋ก  :
๋…ธ์ด์ฆˆ ํ•จ์ˆ˜๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๊ฐ€ ๋„๋ ธ์œผ๋‹ˆ ์ ๋‹นํžˆ ๊ฐ€์ ธ๋‹ค ์“ฐ๋ฉด ๋˜๊ณ ,
์ค‘์š”ํ•œ ๊ฒƒ์€ ๋…ธ์ด์ฆˆ๋ฅผ ๊ฐ€๊ณตํ•˜๋Š” ํ•จ์ˆ˜๋ฅผ ์–ด๋–ป๊ฒŒ ์ •์˜ํ•  ๊ฒƒ์ด๋ƒ ํ•˜๋Š” ๊ฑฐ์ž„.
๊ทธ๋ฆฌ๊ณ  3์ฐจ์› ๋…ธ์ด์ฆˆ๋ฅผ ๋ฐ€๋„๋กœ ํ™œ์šฉํ•˜๊ธฐ ์œ„ํ•œ ๊ธฐ์ดˆ์ ์ธ ๊ฐ€๊ณต ํ•จ์ˆ˜๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Œ.

density = noiseย *ย scaleย +ย offsetย โ€“ย y

  • noise : ๋…ธ์ด์ฆˆ ํ•จ์ˆ˜์˜ ํ•จ์ˆ˜๊ฐ’ [-1, 1]
  • scale : ์ง€ํ˜•์˜ ๊ตด๊ณก์˜ ์ •๋„๋ฅผ ๊ฒฐ์ •ํ•˜๋Š” ์‹คํ—˜๊ฐ’
  • offset : ์ง€ํ˜•์˜ ์ตœ์†Œ ๋†’์ด
  • y : ๋†’์ด๊ฐ€ ๋†’์•„์งˆ ์ˆ˜๋ก ๋ธ”๋ก์˜ ๋“ฑ์žฅ ํ™•๋ฅ ์„ ๋‚ฎ์ถ”๊ธฐ ์œ„ํ•ด y ์ขŒํ‘œ ๊ฐ’์„ ๋นผ ์คŒ.