๐ŸŽฅ ์ ˆ๋‘์ฒด ์ปฌ๋ง๊ณผ์˜ ์ „์Ÿ

okorionยท2025๋…„ 4์›” 20์ผ
post-thumbnail

๐Ÿงฑ ์ ˆ๋‘์ฒด ์ปฌ๋ง ์ด์Šˆ

๐ŸŒ€ ๋ฌธ์ œ ์ƒํ™ฉ

Three.js์—์„œ Points ๊ฐ์ฒด๋ฅผ ์ด์šฉํ•ด ์ž…์ž ๊ธฐ๋ฐ˜์œผ๋กœ ์˜ค๋ธŒ์ ํŠธ๋ฅผ ๊ตฌ์„ฑํ•˜๊ณ  ์žˆ์—ˆ๋Š”๋ฐ, ์ด์ƒํ•˜๊ฒŒ๋„ ํŠน์ • ์นด๋ฉ”๋ผ ์œ„์น˜๋‚˜ ๊ฑฐ๋ฆฌ์—์„œ ์ผ๋ถ€ ์˜ค๋ธŒ์ ํŠธ๊ฐ€ ๋ Œ๋”๋ง๋˜์ง€ ์•Š๋Š” ํ˜„์ƒ์ด ๋ฐœ์ƒํ–ˆ๋‹ค.

์ง์ ‘์ ์ธ ์›์ธ์„ ์ถ”์ ํ•ด๋ณธ ๊ฒฐ๊ณผ, ์ด๋Š” Three.js์˜ ์ ˆ๋‘์ฒด ์ปฌ๋ง(Frustum Culling) ๋•Œ๋ฌธ์— ๋ฐœ์ƒํ•œ ์ด์Šˆ์˜€๋‹ค.

โ— ์ ˆ๋‘์ฒด ์ปฌ๋ง์ด๋ž€?
์นด๋ฉ”๋ผ์˜ ์‹œ์•ผ(์ ˆ๋‘์ฒด) ๋ฐ–์— ์žˆ๋Š” ์˜ค๋ธŒ์ ํŠธ๋ฅผ ์ž๋™์œผ๋กœ ๋ Œ๋”๋ง ๋Œ€์ƒ์—์„œ ์ œ์™ธํ•˜์—ฌ ์„ฑ๋Šฅ์„ ์ตœ์ ํ™”ํ•˜๋Š” ๊ธฐ์ˆ ์ด๋‹ค.

ํ•˜์ง€๋งŒ ๋‚ด๊ฐ€ ๋™์ ์œผ๋กœ ์ƒ์„ฑํ•œ THREE.Points ์˜ค๋ธŒ์ ํŠธ๋Š” boundingSphere๊ฐ€ ์ž๋™์œผ๋กœ ์—…๋ฐ์ดํŠธ๋˜์ง€ ์•Š์•„์„œ ์ ˆ๋‘์ฒด ๋ฐ–์œผ๋กœ ์ธ์‹๋˜์—ˆ๊ณ , ๊ทธ ๊ฒฐ๊ณผ ๋ Œ๋”๋ง๋˜์ง€ ์•Š๋Š” ์ƒํ™ฉ์ด ๋ฒŒ์–ด์กŒ๋˜ ๊ฒƒ์ด๋‹ค.

์ ˆ๋‘์ฒด ์•ˆ์ ˆ๋‘์ฒด ๋ฐ–

๐Ÿ” ์ ˆ๋‘์ฒด(Frustum)๋ž€?

Three.js์™€ ๊ฐ™์€ 3D ๊ทธ๋ž˜ํ”ฝ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์—์„œ ์ ˆ๋‘์ฒด(Frustum)๋Š” ์นด๋ฉ”๋ผ๊ฐ€ "๋ณผ ์ˆ˜ ์žˆ๋Š” ๊ณต๊ฐ„"์„ ์˜๋ฏธํ•œ๋‹ค.
์ •ํ™•ํžˆ ๋งํ•˜๋ฉด ์นด๋ฉ”๋ผ๊ฐ€ ๋ฐ”๋ผ๋ณด๋Š” ๋ฐฉํ–ฅ์„ ๊ธฐ์ค€์œผ๋กœ ์ž˜๋ฆฐ ํ”ผ๋ผ๋ฏธ๋“œ ํ˜•ํƒœ์˜ ๊ณต๊ฐ„์ด๋ฉฐ, ์ด ๊ณต๊ฐ„ ์•ˆ์— ์žˆ๋Š” ๊ฐ์ฒด๋“ค๋งŒ ๋ Œ๋”๋ง๋œ๋‹ค.
์ด๋Š” GPU ๋ฆฌ์†Œ์Šค๋ฅผ ์ ˆ์•ฝํ•˜๊ณ  ๋ Œ๋”๋ง ์„ฑ๋Šฅ์„ ๋†’์ด๊ธฐ ์œ„ํ•œ ์ค‘์š”ํ•œ ์ตœ์ ํ™” ๊ธฐ๋ฒ• ์ค‘ ํ•˜๋‚˜๋‹ค.


๐Ÿ“ท ์ ˆ๋‘์ฒด ๊ตฌ์กฐ ์ด๋ฏธ์ง€

  • Near Plane: ๊ฐ€์žฅ ๊ฐ€๊นŒ์šด ๋ Œ๋”๋ง ๊ฑฐ๋ฆฌ (๋ณดํ†ต 0.1 ~ 0.5)
  • Far Plane: ๊ฐ€์žฅ ๋จผ ๋ Œ๋”๋ง ๊ฑฐ๋ฆฌ (๊ธฐ๋ณธ 1000 ๋˜๋Š” ๊ทธ ์ด์ƒ)
  • Frustum ์•ˆ์— ๋“ค์–ด ์žˆ๋Š” ์˜ค๋ธŒ์ ํŠธ๋งŒ ๋ Œ๋”๋ง๋จ
  • ๋ฐ”๊นฅ์— ์žˆ๋Š” ์˜ค๋ธŒ์ ํŠธ๋Š” ์ ˆ๋‘์ฒด ์ปฌ๋ง(Frustum Culling) ์— ์˜ํ•ด ๋ Œ๋”๋ง๋˜์ง€ ์•Š์Œ

๐Ÿ” ๋””๋ฒ„๊น… ๋ฐ ํ•ด๊ฒฐ ๊ณผ์ •

๐Ÿ“Œ ์•„๋ž˜๋Š” ๋””๋ฒ„๊น… ์ค‘ ์ง„ํ–‰ํ–ˆ๋˜ ๋‹จ๊ณ„๋ณ„ ๋กœ๊ทธ๋‹ค.

  1. ํ˜„์ƒ ์žฌํ˜„
    • ์นด๋ฉ”๋ผ๋ฅผ ์œ„๋กœ ์ด๋™์‹œํ‚ค๋ฉด ํŠน์ • Y๊ฐ’ ์ด์ƒ์—์„œ ์˜ค๋ธŒ์ ํŠธ๊ฐ€ ์‚ฌ๋ผ์ง.(์ƒ์„ฑ์€ ํ™•์ธ๋จ)
    • Points๊ฐ€ ๋ถ„๋ช…ํžˆ ์”ฌ์— ์กด์žฌํ•˜์ง€๋งŒ ํ™”๋ฉด์— ๋ณด์ด์ง€ ์•Š์Œ.
  2. ๋ฌธ์ œ ์›์ธ ํŒŒ์•…
    • geometry.computeBoundingSphere() ๋ฅผ ๋ช…์‹œ์ ์œผ๋กœ ํ˜ธ์ถœํ•˜์ง€ ์•Š์•„ Three.js ๋‚ด๋ถ€์—์„œ ์ ˆ๋‘์ฒด ๊ต์ฐจ ํŒ์ •์ด ์ œ๋Œ€๋กœ ๋˜์ง€ ์•Š์Œ.
  3. ํ•ด๊ฒฐ ๋ฐฉ๋ฒ• ์ ์šฉ
    • ๋™์ ์œผ๋กœ ์ƒ์„ฑํ•œ geometry์— ์ˆ˜๋™์œผ๋กœ computeBoundingSphere()๋ฅผ ํ˜ธ์ถœ
    • ์ž„์˜์˜ boundingSphere๋ฅผ ์ง์ ‘ ์„ค์ •ํ•˜๋Š” ๋ฐฉ์‹๋„ ์‹œ๋„:
    geometry.computeBoundingSphere();
    geometry.boundingSphere = new THREE.Sphere(new THREE.Vector3(0, 0, 0), 25);
  1. ๋ Œ๋”๋ง ์ •์ƒํ™” ํ™•์ธ
    • ํ•ด๋‹น ์ฒ˜๋ฆฌ๋ฅผ ์ ์šฉํ•œ ์ดํ›„, ์˜ค๋ธŒ์ ํŠธ๊ฐ€ ์ •์ƒ์ ์œผ๋กœ ๋ณด์ด๊ธฐ ์‹œ์ž‘ํ–ˆ๊ณ  ์ปฌ๋ง๋„ ๋” ์ด์ƒ ๋ฌธ์ œ๋˜์ง€ ์•Š์Œ.
    • boundingBox๋Š” ์‹คํŒจ

๐Ÿ’ก ๋ฐฐ์šด ์ 

  • Points, InstancedMesh ๋“ฑ ๋™์ ์œผ๋กœ ๊ตฌ์„ฑํ•œ Geometry์—๋Š” bounding ์ •๋ณด๊ฐ€ ์—…๋ฐ์ดํŠธ ๋˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ๊ฐ€ ์žˆ์œผ๋ฏ€๋กœ, ์ ˆ๋‘์ฒด ์ปฌ๋ง์„ ๊ณ ๋ คํ•œ ๋ณ„๋„์˜ ์ฒ˜๋ฆฌ๊ฐ€ ํ•„์š”ํ•˜๋‹ค.
  • Three.js์—์„œ ์„ฑ๋Šฅ ์ตœ์ ํ™”๋ฅผ ์œ„ํ•ด ์ œ๊ณต๋˜๋Š” ๊ธฐ๋Šฅ๋“ค์ด ๋•Œ๋กœ๋Š” ์˜คํžˆ๋ ค ๋ Œ๋”๋ง ์ด์Šˆ์˜ ์›์ธ์ด ๋  ์ˆ˜ ์žˆ์Œ.
  • ํŠนํžˆ ๋ณต์žกํ•œ ์ธํ„ฐ๋ž™์…˜์„ ๋„์ž…ํ•  ๊ฒฝ์šฐ, ๋‹จ์ˆœํ•œ ๋ Œ๋”๋ง ์ด์ƒ์„ ์˜์‹ฌํ•˜๊ณ  ๋‚ด๋ถ€ ๊ตฌ์กฐ๋ฅผ ์ ๊ฒ€ํ•  ํ•„์š”๊ฐ€ ์žˆ๋‹ค.
  • ๋™์ ์œผ๋กœ BoundingSphere๋ฅผ ๊ณ„์‚ฐํ•ด์ฃผ๋Š” ๊ฒƒ๋ณด๋‹ค ์ตœ์ ํ™”๋ฅผ ์œ„ํ•ด BoundingSphere์˜ ์ดˆ๊ธฐ ๊ฐ’์„ ์„ค์ •ํ•ด์ค„ ํ•„์š”๊ฐ€ ์žˆ๋‹ค.

๐Ÿ”œ

์ด๋ฒˆ ์ ˆ๋‘์ฒด ์ปฌ๋ง ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋ฉฐ, ์ด์ œ ๋น„์ฃผ์–ผ์ ์œผ๋กœ ๋ณด๋‹ค ์•ˆ์ •๋œ ํ™˜๊ฒฝ์„ ๋งŒ๋“ค ์ˆ˜ ์žˆ๊ฒŒ ๋˜์—ˆ๋‹ค.

profile
okorion's Tech Study Blog.

0๊ฐœ์˜ ๋Œ“๊ธ€