Three.js: ๊ธฐ๋Šฅ ์š”์ฒญ: ๊ณต๊ฐ„ ๊ฒ€์ƒ‰ ํŠธ๋ฆฌ๋ฅผ ํ†ตํ•ด ๋ ˆ์ด์บ์Šคํ„ฐ ์ถฉ๋Œ ๊ฐ์ง€ ์„ฑ๋Šฅ ํ–ฅ์ƒ

์— ๋งŒ๋“  2017๋…„ 12์›” 11์ผ  ยท  36์ฝ”๋ฉ˜ํŠธ  ยท  ์ถœ์ฒ˜: mrdoob/three.js

VR ์ปจํŠธ๋กค๋Ÿฌ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ˆ˜๋งŽ์€ 3D ๊ฐœ์ฒด์™€ ์ƒํ˜ธ ์ž‘์šฉํ•  ์ˆ˜ ์žˆ๋Š” WebVR-Vive-Dragging ๊ณผ ์œ ์‚ฌํ•œ VR ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ์„ ๊ตฌ์ถ•ํ–ˆ์Šต๋‹ˆ๋‹ค. ์ฆ‰, ์‚ฌ์šฉ์ž๋Š” VR ์ปจํŠธ๋กค๋Ÿฌ๋กœ ๊ฐœ์ฒด๋ฅผ ์žก๊ณ  ์ด๋™ํ•˜๊ฑฐ๋‚˜ ํฌ๊ธฐ๋ฅผ ์กฐ์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋ฌธ์ œ : ์žฅ๋ฉด์— ๋ณต์žกํ•œ 3D ๊ฐœ์ฒด๊ฐ€ ์žˆ๋Š” ๊ฒฝ์šฐ(์˜ˆ: THREE.Mesh ๊ฐœ์ฒด์— ์ •์  ์ˆ˜๊ฐ€ ๋งค์šฐ ๋งŽ์€ ํ˜•์ƒ์ด ์žˆ๋Š” ๊ฒฝ์šฐ) ์ถฉ๋Œ ๊ฐ์ง€ ์ค‘ ๋ ˆ์ด์บ์ŠคํŒ…์ด ๋งค์šฐ ๋Š๋ ค์ง‘๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ๋ฌธ์ œ๋Š” ํ•œ ๊ฐœ์ฒด์˜ ๊ธฐํ•˜ํ•™์ด ๋ณต์žกํ•˜๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

Octree ๋˜๋Š” R-Tree ์™€ ๊ฐ™์€ ๋น ๋ฅธ ๊ณต๊ฐ„ ๊ฒ€์ƒ‰์„ ์œ„ํ•œ ํŠธ๋ฆฌ ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ์ง€์˜ค๋ฉ”ํŠธ๋ฆฌ๋ฅผ ๋” ์ž‘์€ ๋ฉ์–ด๋ฆฌ๋กœ ๋ถ„ํ• ํ•  ์ˆ˜ ์žˆ๋Š” threeocttree ๋ฅผ ์ฐพ์•˜์ง€๋งŒ ์•ฝ๊ฐ„ ์˜ค๋ž˜๋œ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค(Three.js r60).

๋‚ด๊ฐ€ ์•„๋Š” ํ•œ THREE.Mesh ๊ฐœ์ฒด์˜ raycast ๋ฉ”์„œ๋“œ์—๋Š” ์ด๋ฏธ ์ผ๋ถ€ ์„ฑ๋Šฅ ์ตœ์ ํ™”๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค(์‹ค์ œ ๋ ˆ์ด์บ์ŠคํŠธ๋ฅผ ์ˆ˜ํ–‰ํ•˜๊ธฐ ์ „์— ๊ฒฝ๊ณ„ ์ƒ์ž์™€ ๊ตฌ๋ฅผ ๋จผ์ € ํ™•์ธ). ๊ณต๊ฐ„ ํƒ์ƒ‰ ํŠธ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ด์™€ ๊ฐ™์€ ๋˜ ๋‹ค๋ฅธ ๊ฒ€์‚ฌ ๋‹จ๊ณ„๋ฅผ ๊ฐ–๋Š” ๊ฒƒ์ด ์˜๋ฏธ๊ฐ€ ์žˆ์ง€ ์•Š์„๊นŒ์š”?! ์–ด๋–ป๊ฒŒ ์ƒ๊ฐํ•ด?

์•ˆ๋ถ€

Enhancement

๊ฐ€์žฅ ์œ ์šฉํ•œ ๋Œ“๊ธ€

๊ณผ๊ฑฐ์— threejs์— ํฌํ•จ๋  ๊ณต๊ฐ„ ์ธ๋ฑ์Šค๋ฅผ ์ œ์•ˆํ•œ ์ ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ๋ฐฉํ–ฅ์œผ๋กœ ์ž‘์—…์ด ์žˆ์—ˆ๊ณ  ๊ธฐ์กด oct-tree ์˜ˆ์ œ๊ฐ€ ๊ทธ ์ค‘ ํ•˜๋‚˜์ž…๋‹ˆ๋‹ค. ๊ถ๊ทน์ ์œผ๋กœ ์ด ๊ธฐ๋Šฅ์„ ์ผ๋ฅ˜ ์‹œ๋ฏผ์œผ๋กœ ์‚ผ๋Š” ๊ฒƒ๊ณผ ๊ด€๋ จํ•˜์—ฌ ํ•ต์‹ฌ ์ปค๋ฎค๋‹ˆํ‹ฐ์˜ ๊ด€์‹ฌ์ด ๋ถ€์กฑํ•˜๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

๊ธฐ๋ณธ ๋ฐฐํฌํŒ(์˜ˆ์ œ ์•„๋‹˜)์— ํฌํ•จํ•  ์ถฉ๋ถ„ํ•œ ๊ด€์‹ฌ๊ณผ ์˜๋„๊ฐ€ ์žˆ๋Š” ๊ฒฝ์šฐ ๋‚ด BVH ์ฝ”๋“œ๋ฅผ ํ”„๋กœ์ ํŠธ์— ๊ธฐ๋ถ€ํ•  ์ˆ˜ ์žˆ์–ด ๊ธฐ์ฉ๋‹ˆ๋‹ค.
๋‚ด ์ฝ”๋“œ๋Š” ๋‘ ๊ฐ€์ง€ ์ธก๋ฉด์— ์ค‘์ ์„ ๋‘ก๋‹ˆ๋‹ค.

  • ์—ญ๋™์ ์ธ ์žฅ๋ฉด

    • ๋น ๋ฅธ ์‚ฝ์ž…

    • ๋น ๋ฅธ ์‚ญ์ œ

    • refitting(๋‹ค์‹œ ์‚ฝ์ž…ํ•  ํ•„์š” ์—†์ด ๋…ธ๋“œ๊ฐ€ ๋ชจ์–‘์„ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ๋Š” ๊ธฐ๋Šฅ)

  • ์ฟผ๋ฆฌ ์†๋„

2๊ฐ€์ง€ ๊ตฌํ˜„์ด ์žˆ์Šต๋‹ˆ๋‹ค.

  • ๋ฐ”์ด๋„ˆ๋ฆฌBVH

    • ByteBuffer๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋งค์šฐ ์ปดํŒฉํŠธํ•จ

    • DataView๋ฅผ ํ†ตํ•œ UintX ๋ฐ FloatX ์œ ํ˜• ํ˜ผํ•ฉ

    • ์ง๋ ฌํ™”์— ์ ํ•ฉ

    • lzma ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์™€ ๊ฐ™์€ ํ‘œ์ค€ ๋„๊ตฌ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์••์ถ•ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

    • ๋ถˆ๋ณ€

    • ๋นŒ๋“œ ์†๋„๊ฐ€ ๊ณ ๋„๋กœ ์ตœ์ ํ™”๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.

    • BufferGeometry์—์„œ๋งŒ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค.

    • SAH ์ตœ์ ํ™”

    • ๊ด‘์„  ์ฟผ๋ฆฌ

  • BVH

    • ๊ฒฐ๊ณผ์ ์œผ๋กœ ๊ฐœ์ฒด ํŠธ๋ฆฌ๋Š” ์ด์ง„ ๊ตฌํ˜„๋ณด๋‹ค ํ›จ์”ฌ ํฝ๋‹ˆ๋‹ค.

    • ๋ณ€ํ•˜๊ธฐ ์‰ฌ์šด

    • ๋น ๋ฅธ ๋Œ€๋Ÿ‰ ์‚ฝ์ž…

    • ๋น ๋ฅธ ๋‹จ์ผ ํ•ญ๋ชฉ ์‚ฝ์ž…

    • ์žฌ์žฅ์ฐฉ

    • ์Šคํƒ, ์žฌ๊ท€ ๋ฐ ์Šคํƒ ์—†๋Š” ์ˆœํšŒ ๊ตฌํ˜„(๋‹ค๋ฅธ ์„ฑ๋Šฅ ํŠน์„ฑ)

    • SAH ์ตœ์ ํ™”

    • ์ ˆ๋‘์ฒด ์ฟผ๋ฆฌ

    • ๋ ˆ์ด ์ฟผ๋ฆฌ

๊ฐœ์ธ์ ์œผ๋กœ, ๋‚˜๋Š” ๊ณต๊ฐ„ ์ธ๋ฑ์Šค ์—†์ด๋Š” ์‚ด ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ์€ n^2์™€ log(n) ์„ฑ๋Šฅ์˜ ์ฐจ์ด์ž…๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, ํ˜„์žฌ ํ”„๋กœ์ ํŠธ์—์„œ ๋‹ค์Œ ๋ถ€๋ถ„์€ ๊ณต๊ฐ„ ์ธ๋ฑ์Šค์— ์˜์กดํ•ฉ๋‹ˆ๋‹ค.

  • ๊ฒฝ์—ฝ ์‹œ์Šคํ…œ(๋‚˜๋ฌด, ๊ฝƒ, ๋ค๋ถˆ ๋“ฑ)
  • ๋ชจ๋“  ๊ฐœ์ฒด ๋ฐฐ์น˜(์บ๋ฆญํ„ฐ ๋ฐ ์ง‘)
  • ์„ ํƒ(๋งˆ์šฐ์Šค ํด๋ฆญ๊ณผ ๊ฐ™์€ ์ƒํ˜ธ ์ž‘์šฉ์— ์‚ฌ์šฉ)

http://server1.lazy-kitty.com/komrade

์ง€ํ˜•์—๋Š” ์•ฝ 1m ํด๋ฆฌ๊ณค์ด ์žˆ์œผ๋ฉฐ ์ˆ˜์ฒœ ๊ทธ๋ฃจ์˜ ๋‚˜๋ฌด๋ฅผ ๋ฐฐ์น˜ํ•˜๊ณ  ์—ฌ๊ธฐ์— ์‹ค์‹œ๊ฐ„ ๋ ˆ์ด์บ์ŠคํŠธ๋ฅผ ์‹คํ–‰ํ•˜๋Š” ๊ฒƒ์€ ํŠนํžˆ ์ €์‚ฌ์–‘ ์žฅ์น˜์˜ ๊ฒฝ์šฐ ์ ˆ๋Œ€ ํ•ด์„œ๋Š” ์•ˆ ๋ฉ๋‹ˆ๋‹ค.

๋ชจ๋“  36 ๋Œ“๊ธ€

๋ช…๋ฐฑํžˆ ๋งํ•  ์œ„ํ—˜์ด ์žˆ์ง€๋งŒ ์ด๋ฏธ repo( examples/js/Octree.js )์— ์žˆ๋Š” threeocttree ๋ฒ„์ „์„ ์‚ฌ์šฉํ•ด ๋ณด์…จ์Šต๋‹ˆ๊นŒ?

๋‚˜๋Š” three.js ์—์„œ ๊ณต๊ฐ„ ๊ฒ€์ƒ‰ ํŠธ๋ฆฌ์˜ ํ•˜๋“œ ์™€์ด์–ด ์‚ฌ์šฉ์— ํˆฌํ‘œํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ์•Œ๊ณ ๋ฆฌ์ฆ˜์˜ ์˜ค๋ฒ„ํ—ค๋“œ/๋ณต์žก์„ฑ์€ ๋งŽ์€ ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ์—์„œ ์„ฑ๋Šฅ ํ–ฅ์ƒ์˜ ๊ท ํ˜•์„ ์ดˆ๊ณผํ•ฉ๋‹ˆ๋‹ค.

์‹ค์ œ ๋ ˆ์ด์บ์ŠคํŠธ๋ฅผ ์ˆ˜ํ–‰ํ•˜๊ธฐ ์ „์— ๋จผ์ € ๊ฒฝ๊ณ„ ์ƒ์ž์™€ ๊ตฌ๋ฅผ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.

์ด๋Š” ํ•ฉ๋ฆฌ์ ์ด๋ฉฐ ์ถฉ๋ถ„ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์‚ฌ์šฉ์ž๊ฐ€ ๊ณ ๊ธ‰ ์‚ฌ์šฉ ์‚ฌ๋ก€์™€ ๊ด€๋ จํ•˜์—ฌ ๋” ๋งŽ์€ ์„ฑ๋Šฅ์ด ํ•„์š”ํ•œ ๊ฒฝ์šฐ ์–ธ๊ธ‰๋œ ์˜ˆ๋ฅผ ์‹œ์ž‘์ ์œผ๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ฅํŠธ๋ฆฌ๊ฐ€ ์ข‹์€ ์„ ํƒ์ด ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์ ‘๊ทผ ๋ฐฉ์‹์ด ๋งค์šฐ ์ •๊ตํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋Œ€ํ™”ํ˜• 3D ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ์—์„œ R-Tree ์†”๋ฃจ์…˜์„ ๋ณธ ์ ์ด ์—†์Šต๋‹ˆ๋‹ค(์•Œ๊ณ ๋ฆฌ์ฆ˜์ด ๊ณต๊ฐ„ ๋ถ„ํ•  ๋Œ€์‹  ๋ฐ์ดํ„ฐ๋ฅผ ์ˆ˜ํ–‰ํ•จ).

์•ˆ๋…•ํ•˜์„ธ์š”, ๋‹ต๋ณ€ํ•ด์ฃผ์…”์„œ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค.
@Mugen87 ๋งŽ์€ ์‚ฌ์šฉ ์‚ฌ๋ก€์—์„œ ๊ทธ๋ ‡๊ฒŒ ๋น ๋ฅธ ๊ฒ€์ƒ‰์ด ํ•„์š”ํ•˜์ง€ ์•Š๋‹ค๋Š” ๋ฐ ๋™์˜ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ 3D ๊ฐœ์ฒด์™€ ์ƒํ˜ธ ์ž‘์šฉํ•˜๋Š” ๋ฉ”์ปค๋‹ˆ์ฆ˜์ด ์žˆ๋Š” ๊ฒฝ์šฐ(๋Œ€๋ถ€๋ถ„ ์‚ฌ์šฉ๋˜๋Š” ๊ฒฝ์šฐ) THREE.Raycaster ์˜ ๊ฒฝ๊ณ„ ์ƒ์ž/๊ตฌ์ฒด๋ฅผ ๋จผ์ € ํ™•์ธํ•˜๋Š” ๋‹จ๊ณ„(ํ•ฉ๋ฆฌ์ ์ด๋ผ๋Š” ๋ฐ ์ „์ ์œผ๋กœ ๋™์˜ํ•ฉ๋‹ˆ๋‹ค )์—์„œ ์‹ค์ œ ๋ ˆ์ด์บ์ŠคํŠธ๋ฅผ ์ˆ˜ํ–‰ํ•  ๋•Œ ์„ ํ˜• ์‹œ๊ฐ„ ๋…ธ๋ ฅ์— ๋Œ€ํ•œ ์ผ์ •ํ•œ ์‹œ๊ฐ„์ด ์ƒ๋‹นํžˆ ํฝ๋‹ˆ๋‹ค. ํ•˜๋‚˜์˜ ์ „์—ญ ๊ฒ€์ƒ‰ ํŠธ๋ฆฌ ๋Œ€์‹  ์ผ์ข…์˜ "๊ธฐํ•˜ํ•™ ๊ฒ€์ƒ‰ ํŠธ๋ฆฌ"๋ฅผ ์ƒ์ƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ง€์˜ค๋ฉ”ํŠธ๋ฆฌ๊ฐ€ ๋ณ€๊ฒฝ๋˜์ง€ ์•Š๋Š” ํ•œ(์ข…์ข… ๋ณ€ํ˜•์ด ์ง€์˜ค๋ฉ”ํŠธ๋ฆฌ ๋ณ€๊ฒฝ๋ณด๋‹ค ํ›จ์”ฌ ๊ฐ€๋Šฅ์„ฑ์ด ๋†’์Œ) ๊ฒ€์ƒ‰ ํŠธ๋ฆฌ๋ฅผ ์—…๋ฐ์ดํŠธํ•  ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.

๊ทธ๋ž˜์„œ ๊ณต๊ฐ„ ๊ฒ€์ƒ‰ ํŠธ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•œ ์ด๋Ÿฌํ•œ ์ข…๋ฅ˜์˜ ์ตœ์ ํ™”๊ฐ€ three.js ์—์„œ ๋” ์ค‘์š”ํ•œ ๋ถ€๋ถ„์ด ๋  ์ˆ˜ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์ด๊ฒƒ์ด ์ถ”๊ฐ€์ ์ธ ๋ณต์žก์„ฑ๊ณผ ์˜ค๋ฒ„ํ—ค๋“œ๋ฅผ ์œ ๋ฐœํ•œ๋‹ค๋Š” ๊ฒƒ๋„ ์ดํ•ดํ•ฉ๋‹ˆ๋‹ค.

@moraxy ์˜ˆ์ œ ๋ฒ„์ „์„ ์‚ดํŽด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌํ•œ ๊ธฐ๋Šฅ์ด ์˜๋ฏธ๊ฐ€ ์žˆ๋Š”์ง€ ์•Œ๊ณ  ์‹ถ์—ˆ์Šต๋‹ˆ๋‹ค.

๋‹ค์‹œ ํ•œ ๋ฒˆ ๊ฐ์‚ฌ๋“œ๋ฆฝ๋‹ˆ๋‹ค.

๋” ๊ฐ„๋‹จํ•œ ๊ฒ€์ƒ‰ ํŠธ๋ฆฌ๋ฅผ THREE.BufferGeometry ์— ํ†ตํ•ฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด computeBoundingBox ์— ๋Œ€ํ•œ ํ˜ธ์ถœ์€ ํ•ด๋‹น ์ •์ ์„ ์ฐธ์กฐํ•˜๋Š” ์ผ์ข…์˜ ์ฝ๊ธฐ ์ „์šฉ ๊ฒ€์ƒ‰ ํŠธ๋ฆฌ๋ฅผ ๊ตฌ์ถ•ํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. THREE.BufferGeometry ๋Š”

์ธ์Šคํ„ด์Šคํ™”ํ•œ ํ›„ ์ง€์˜ค๋ฉ”ํŠธ๋ฆฌ๋ฅผ ๋งŽ์ด ์กฐ์ž‘ํ•  ํ•„์š”๊ฐ€ ์—†๋Š” ์ •์  ๊ฐ์ฒด์— ๊ฐ€์žฅ ์ ํ•ฉํ•ฉ๋‹ˆ๋‹ค.

์ด ๊ฒ€์ƒ‰ ํŠธ๋ฆฌ๋Š” ์ดˆ๊ธฐํ™” ํ›„ ๋ณ€๊ฒฝํ•  ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ์—…๋ฐ์ดํŠธ/์‚ญ์ œ์— ๋Œ€ํ•œ ์•ฝ๊ฐ„์˜ ์˜ค๋ฒ„ํ—ค๋“œ๋ฅผ ์ค„์ž…๋‹ˆ๋‹ค. Octree๋Š” ์ข‹์€ ์ถœ๋ฐœ์ ์ด ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค( BabylonJS์˜ ์œ ์‚ฌํ•œ ๊ฐœ๋… ).

์ธ์Šคํ„ด์Šคํ™”ํ•œ ํ›„ ์ง€์˜ค๋ฉ”ํŠธ๋ฆฌ๋ฅผ ๋งŽ์ด ์กฐ์ž‘ํ•  ํ•„์š”๊ฐ€ ์—†๋Š” ์ •์  ๊ฐ์ฒด์— ๊ฐ€์žฅ ์ ํ•ฉํ•ฉ๋‹ˆ๋‹ค.

FWIW, ๋‚˜๋Š” ๊ทธ๊ฒƒ์ด ์ง„์‹คํ•œ ์ง„์ˆ ์ด๋ผ๊ณ  ๋ฏฟ์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

@WestLangley THREE.BufferGeometry ๋ฌธ์„œ์˜ ์ธ์šฉ๋ฌธ

THREE.BufferGeometry ๋ฌธ์„œ

๊ทธ๊ฒƒ์€ ์•„๋งˆ๋„ ์ œ๊ฑฐ๋˜์–ด์•ผ ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค - ์–ด์จŒ๋“ , ๋‚˜๋Š” ๊ทธ๊ฒƒ์ด ์–ด๋–ค ์ข…๋ฅ˜์˜ ๊ธฐ์ˆ ์  ์ง„์ˆ ์„ ์˜๋ฏธํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์˜คํžˆ๋ ค ๊ทธ๊ฒƒ์ด ์ƒ์„ฑ๋œ ํ›„ ์‚ฌ์šฉ์ž๊ฐ€ ์ง€์˜ค๋ฉ”ํŠธ๋ฆฌ๋ฅผ ์กฐ์ž‘ํ•˜๊ธฐ๊ฐ€ ๋” ์–ด๋ ต๋‹ค๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.

์•„๋งˆ๋„ ์ œ๊ฑฐํ•ด์•ผ ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค

๊ฐ€์žฅ ํ™•์‹คํ•ฉ๋‹ˆ๋‹ค.

๋ฐฉ๊ธˆ PlaneBufferGeometry์—์„œ ๋ ˆ์ด์บ์ŠคํŒ…์„ ์œ„ํ•œ ๋” ๋‚˜์€ ๋ฐฉ๋ฒ•์„ ๊ตฌํ˜„ํ–ˆ์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” far ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์ฒซ ๋ฒˆ์งธ์™€ ๋งˆ์ง€๋ง‰ ์ธ๋ฑ์Šค ์œ„์น˜๋ฅผ ์ฐพ์Šต๋‹ˆ๋‹ค. ์ธ๋ฑ์Šค ๋ฐฐ์—ด์ด x/y ์ˆœ์„œ๋กœ ๋˜์–ด ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์ด๊ฒƒ์€ ํ‰๋ฉด ๋ฒ„ํผ์—์„œ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค. x/y ๊ฒฝ๊ณ„ ์ƒ์ž๋ฅผ ๋ฒ—์–ด๋‚˜๋ฉด ๋ชจ๋“  ์ถฉ๋Œ์ด ์›๊ฑฐ๋ฆฌ ๋ฒ”์œ„ ๋ฐ–์— ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ์„ ์–ด๋”˜๊ฐ€์— ์ €์ง€๋ฅด๊ณ  ์‹ถ์€ ์š•๋ง์ด ์žˆ์Šต๋‹ˆ๊นŒ? ํ˜„์žฌ ๊ตฌํ˜„์€ ๋‚ด ์‚ฌ์šฉ ์‚ฌ๋ก€์— ๋”ฐ๋ผ ๋‹ค๋ฅด์ง€๋งŒ ์›ํ•˜๋Š” ๊ฒฝ์šฐ ๋” ์ผ๋ฐ˜์ ์œผ๋กœ ๋งŒ๋“ค๋ ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค. ํฐ planeBuffer(2.5์ดˆ์—์„œ 10ms)์—์„œ ๋ ˆ์ด์บ์ŠคํŒ… ์„ฑ๋Šฅ์„ ํฌ๊ฒŒ ์ค„์ผ ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.

@kpetrow three.js octree ์˜ˆ์ œ๊ฐ€ ์ ์ ˆํ•˜๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๋ฌผ๋ก  ๋‹ค๋ฅธ ์‚ฌ๋žŒ๋“ค์—๊ฒŒ ์œ ์šฉํ•˜๋‹ค๊ณ  ์ƒ๊ฐ๋˜๋ฉด GitHub์—์„œ ์ž์œ ๋กญ๊ฒŒ ์ฝ”๋“œ๋ฅผ ๊ณต์œ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ณผ๊ฑฐ์— threejs์— ํฌํ•จ๋  ๊ณต๊ฐ„ ์ธ๋ฑ์Šค๋ฅผ ์ œ์•ˆํ•œ ์ ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ๋ฐฉํ–ฅ์œผ๋กœ ์ž‘์—…์ด ์žˆ์—ˆ๊ณ  ๊ธฐ์กด oct-tree ์˜ˆ์ œ๊ฐ€ ๊ทธ ์ค‘ ํ•˜๋‚˜์ž…๋‹ˆ๋‹ค. ๊ถ๊ทน์ ์œผ๋กœ ์ด ๊ธฐ๋Šฅ์„ ์ผ๋ฅ˜ ์‹œ๋ฏผ์œผ๋กœ ์‚ผ๋Š” ๊ฒƒ๊ณผ ๊ด€๋ จํ•˜์—ฌ ํ•ต์‹ฌ ์ปค๋ฎค๋‹ˆํ‹ฐ์˜ ๊ด€์‹ฌ์ด ๋ถ€์กฑํ•˜๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

๊ธฐ๋ณธ ๋ฐฐํฌํŒ(์˜ˆ์ œ ์•„๋‹˜)์— ํฌํ•จํ•  ์ถฉ๋ถ„ํ•œ ๊ด€์‹ฌ๊ณผ ์˜๋„๊ฐ€ ์žˆ๋Š” ๊ฒฝ์šฐ ๋‚ด BVH ์ฝ”๋“œ๋ฅผ ํ”„๋กœ์ ํŠธ์— ๊ธฐ๋ถ€ํ•  ์ˆ˜ ์žˆ์–ด ๊ธฐ์ฉ๋‹ˆ๋‹ค.
๋‚ด ์ฝ”๋“œ๋Š” ๋‘ ๊ฐ€์ง€ ์ธก๋ฉด์— ์ค‘์ ์„ ๋‘ก๋‹ˆ๋‹ค.

  • ์—ญ๋™์ ์ธ ์žฅ๋ฉด

    • ๋น ๋ฅธ ์‚ฝ์ž…

    • ๋น ๋ฅธ ์‚ญ์ œ

    • refitting(๋‹ค์‹œ ์‚ฝ์ž…ํ•  ํ•„์š” ์—†์ด ๋…ธ๋“œ๊ฐ€ ๋ชจ์–‘์„ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ๋Š” ๊ธฐ๋Šฅ)

  • ์ฟผ๋ฆฌ ์†๋„

2๊ฐ€์ง€ ๊ตฌํ˜„์ด ์žˆ์Šต๋‹ˆ๋‹ค.

  • ๋ฐ”์ด๋„ˆ๋ฆฌBVH

    • ByteBuffer๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋งค์šฐ ์ปดํŒฉํŠธํ•จ

    • DataView๋ฅผ ํ†ตํ•œ UintX ๋ฐ FloatX ์œ ํ˜• ํ˜ผํ•ฉ

    • ์ง๋ ฌํ™”์— ์ ํ•ฉ

    • lzma ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์™€ ๊ฐ™์€ ํ‘œ์ค€ ๋„๊ตฌ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์••์ถ•ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

    • ๋ถˆ๋ณ€

    • ๋นŒ๋“œ ์†๋„๊ฐ€ ๊ณ ๋„๋กœ ์ตœ์ ํ™”๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.

    • BufferGeometry์—์„œ๋งŒ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค.

    • SAH ์ตœ์ ํ™”

    • ๊ด‘์„  ์ฟผ๋ฆฌ

  • BVH

    • ๊ฒฐ๊ณผ์ ์œผ๋กœ ๊ฐœ์ฒด ํŠธ๋ฆฌ๋Š” ์ด์ง„ ๊ตฌํ˜„๋ณด๋‹ค ํ›จ์”ฌ ํฝ๋‹ˆ๋‹ค.

    • ๋ณ€ํ•˜๊ธฐ ์‰ฌ์šด

    • ๋น ๋ฅธ ๋Œ€๋Ÿ‰ ์‚ฝ์ž…

    • ๋น ๋ฅธ ๋‹จ์ผ ํ•ญ๋ชฉ ์‚ฝ์ž…

    • ์žฌ์žฅ์ฐฉ

    • ์Šคํƒ, ์žฌ๊ท€ ๋ฐ ์Šคํƒ ์—†๋Š” ์ˆœํšŒ ๊ตฌํ˜„(๋‹ค๋ฅธ ์„ฑ๋Šฅ ํŠน์„ฑ)

    • SAH ์ตœ์ ํ™”

    • ์ ˆ๋‘์ฒด ์ฟผ๋ฆฌ

    • ๋ ˆ์ด ์ฟผ๋ฆฌ

๊ฐœ์ธ์ ์œผ๋กœ, ๋‚˜๋Š” ๊ณต๊ฐ„ ์ธ๋ฑ์Šค ์—†์ด๋Š” ์‚ด ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ์€ n^2์™€ log(n) ์„ฑ๋Šฅ์˜ ์ฐจ์ด์ž…๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, ํ˜„์žฌ ํ”„๋กœ์ ํŠธ์—์„œ ๋‹ค์Œ ๋ถ€๋ถ„์€ ๊ณต๊ฐ„ ์ธ๋ฑ์Šค์— ์˜์กดํ•ฉ๋‹ˆ๋‹ค.

  • ๊ฒฝ์—ฝ ์‹œ์Šคํ…œ(๋‚˜๋ฌด, ๊ฝƒ, ๋ค๋ถˆ ๋“ฑ)
  • ๋ชจ๋“  ๊ฐœ์ฒด ๋ฐฐ์น˜(์บ๋ฆญํ„ฐ ๋ฐ ์ง‘)
  • ์„ ํƒ(๋งˆ์šฐ์Šค ํด๋ฆญ๊ณผ ๊ฐ™์€ ์ƒํ˜ธ ์ž‘์šฉ์— ์‚ฌ์šฉ)

http://server1.lazy-kitty.com/komrade

์ง€ํ˜•์—๋Š” ์•ฝ 1m ํด๋ฆฌ๊ณค์ด ์žˆ์œผ๋ฉฐ ์ˆ˜์ฒœ ๊ทธ๋ฃจ์˜ ๋‚˜๋ฌด๋ฅผ ๋ฐฐ์น˜ํ•˜๊ณ  ์—ฌ๊ธฐ์— ์‹ค์‹œ๊ฐ„ ๋ ˆ์ด์บ์ŠคํŠธ๋ฅผ ์‹คํ–‰ํ•˜๋Š” ๊ฒƒ์€ ํŠนํžˆ ์ €์‚ฌ์–‘ ์žฅ์น˜์˜ ๊ฒฝ์šฐ ์ ˆ๋Œ€ ํ•ด์„œ๋Š” ์•ˆ ๋ฉ๋‹ˆ๋‹ค.

๋ ˆ์ด์บ์ŠคํŠธ๋ฅผ ์ตœ์ ํ™”ํ•  ์ˆ˜ ์žˆ๋Š” ๋ชจ๋“  ๊ฒƒ์„ ๋ณด๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค. ๋ณต์žก์„ฑ์„ ์ถ”๊ฐ€ํ•˜์ง€ ์•Š๊ณ  ์ตœ์ ํ™”ํ•  ์ˆ˜ ์žˆ๋Š” ์—ฌ์ง€๊ฐ€ ์žˆ์Šต๋‹ˆ๊นŒ? Octree์—๋Š” ๋ชจ๋“  ์ƒˆ๋กœ์šด ์ถ”๊ฐ€ ๋ฐ ์—…๋ฐ์ดํŠธ ๋“ฑ์ด ํฌํ•จ๋œ ๋ชจ๋“  ์ƒˆ๋กœ์šด ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

๋‚ด๊ฐ€ ์•Œ์•„์ฐจ๋ฆฐ ํ•œ ๊ฐ€์ง€๋Š” ์ง€์˜ค๋ฉ”ํŠธ๋ฆฌ๊ฐ€ ์ธ๋ฑ์Šค๋œ ๋ฒ„ํผ ๋ฐฐ์—ด๋กœ ๋ณ€ํ™˜๋˜๋ฉด ๋” ์ด์ƒ ์›๋ž˜ ์ง€์˜ค๋ฉ”ํŠธ๋ฆฌ์˜ ์†์„ฑ์„ ํ˜„๋ช…ํ•˜๊ฒŒ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š”๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์œ„์—์„œ ์–ธ๊ธ‰ํ–ˆ๋“ฏ์ด ํ‰๋ฉด ๋ฒ„ํผ ๊ธฐํ•˜ํ•™์€ arrayBuffer๊ฐ€ PlaneGeometry์—์„œ ์™”๋‹ค๋Š” ๊ฒƒ์„ ์•Œ๋ฉด ๋งค์šฐ ์ตœ์ ํ™”๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. MESH.raycast( raycaster, intersects ) ๋ฉ”์„œ๋“œ๋ฅผ ์ง€์˜ค๋ฉ”ํŠธ๋ฆฌ ์œ ํ˜•์„ ๊ธฐ๋ฐ˜์œผ๋กœ ๋ฎ์–ด์“ธ ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

๋˜ ๋‹ค๋ฅธ ์ ‘๊ทผ ๋ฐฉ์‹์€ Raycaster๋ฅผ ๋ณ„๋„์˜ ํ”Œ๋Ÿฌ๊ทธ์ธ์œผ๋กœ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋Œ€ํ™”์‹ ์ปจํŠธ๋กค๊ณผ ๋กœ๋”๋„ ๋งˆ์ฐฌ๊ฐ€์ง€์ž…๋‹ˆ๋‹ค. ๊ทธ๋Ÿฐ ๋‹ค์Œ @Usnul ์ด ์ œ์•ˆํ•˜๋Š” ๊ฒƒ๊ณผ ์œ ์‚ฌํ•œ ์„ฑ๋Šฅ์˜ ๋ ˆ์ด์บ์Šคํ„ฐ๋ฅผ ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค.

ํ”Œ๋Ÿฌ๊ทธํ˜• Raycaster๊ฐ€ ์žˆ๋‹ค๋Š” ์•„์ด๋””์–ด๊ฐ€ ๋งˆ์Œ์— ๋“ค์ง€๋งŒ ์•ฝ๊ฐ„์˜ ํ˜ผ๋ž€์ด ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๋‚ด๊ฐ€ ์œ ์šฉํ•˜๋‹ค๊ณ  ์ƒ๊ฐํ•˜๋Š” ๊ฒƒ์€ Raycaster ์ž์ฒด๊ฐ€ ์•„๋‹ˆ๋ผ ๊ณต๊ฐ„ ์ธ๋ฑ์Šค์ž…๋‹ˆ๋‹ค. ๊ณต๊ฐ„ ์ธ๋ฑ์Šค๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ฒƒ์„ ํ—ˆ์šฉํ•ฉ๋‹ˆ๋‹ค.

  • ๊ณต๊ฐ„ ์ปฌ๋ง(์ ˆ๋‘์ฒด ์ปฌ๋ง ์ƒ๊ฐ)
  • ๊ฐ€์‹œ์„ฑ ์ฟผ๋ฆฌ ์ˆ˜ํ–‰
  • ๊ฒฝ๋กœ ์ถ”์  ๋ Œ๋”๋Ÿฌ ๋นŒ๋“œ
  • ๋น ๋ฅธ ์ •๋ ฌ(๋ฐ์ดํ„ฐ ์ง€์—ญ์„ฑ ํ™œ์šฉ)

ํ˜„์žฌ three.js๋Š” ์ด ์ค‘ 2๊ฐœ๋ฅผ ๋ช…์‹œ์ ์œผ๋กœ(์ •๋ ฌ ๋ฐ ์ปฌ๋ง) ์ˆ˜ํ–‰ํ•˜๊ณ  1๊ฐœ๋Š” ์˜ˆ์ œ(๋ ˆ์ด ํŠธ๋ ˆ์ด์‹ฑ ๋ Œ๋”๋Ÿฌ)๋ฅผ ํ†ตํ•ด ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.

๊ณต๊ฐ„ ์ธ๋ฑ์Šค๋ฅผ ๋‚ด๋ถ€์ ์œผ๋กœ ์œ ์ง€ํ•˜๋ฉด ์ •๋ ฌ ๋ฐ ์ปฌ๋ง์ด ๊ฐ€์†ํ™”๋˜์–ด ์ธ๋ฑ์Šค๋ฅผ ์ €์žฅํ•˜๋Š” ๋ฐ ํ•„์š”ํ•œ ์ถ”๊ฐ€ RAM ๋น„์šฉ์œผ๋กœ ๋” ํฐ ์žฅ๋ฉด์— ๋Œ€ํ•ด ์ ์ง„์ ์œผ๋กœ ๋” ๋งŽ์€ ์ด์ ์„ ์–ป์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

GPU ์„ ํƒ์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ์ด์œ ๋Š” ๋ฌด์—‡์ž…๋‹ˆ๊นŒ? ์ฃผ๋ณ€์— ๋ช‡ ๊ฐ€์ง€ ์˜ˆ๊ฐ€ ์žˆ์œผ๋ฉฐ ๊ตฌํ˜„ํ•˜๊ธฐ๊ฐ€ ์ƒ๋‹นํžˆ ์‰ฝ์Šต๋‹ˆ๋‹ค. ๊ณต์—ฐ์€ ๋ฐค๋‚ฎ์ด๋‹ค. ๋ฐฑ๋งŒ ๊ฐœ ์ด์ƒ์˜ ํด๋ฆฌ๊ณค ๋ชจ๋ธ์ด ์žˆ๋Š” ์‚ฌ์šฉ ์‚ฌ๋ก€์—์„œ ์„ ํƒ์€ ๊ฑฐ์˜ 1์ดˆ์—์„œ 60fps๋กœ ์‹ค์‹œ๊ฐ„์œผ๋กœ ์‹คํ–‰๋˜๋Š” ๋™์‹œ์— ๋ชจ๋ธ ์œ„๋กœ ๋“œ๋ž˜๊ทธํ–ˆ์Šต๋‹ˆ๋‹ค.

https://github.com/brianxu/GPUPicker

@hccampos
GPU ์„ ํƒ์ด CPU์—์„œ ์ˆ˜ํ–‰ํ•˜๋Š” ๊ฒƒ๋ณด๋‹ค ๋ฐ˜๋“œ์‹œ ๋” ๋น ๋ฅธ ๊ฒƒ์€ ์•„๋‹™๋‹ˆ๋‹ค. GPU์˜ ๊ฒฝ์šฐ ์›ํ•˜๋Š” ์ •๋ฐ€๋„์— ๋น„๋ก€ํ•˜๋Š” ํ•ด์ƒ๋„๋กœ ๋ Œ๋”๋งํ•ด์•ผ ํ•˜๋ฏ€๋กœ ํ”ฝ์…€ ์ •ํ™•๋„๋ฅผ ์›ํ•˜๋ฉด 1:1 ํ™”๋ฉด ํ•ด์ƒ๋„๋กœ ๋ Œ๋”๋งํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ๋ณ„๋„์˜ ๋ Œ๋” ํŒจ์Šค์ด๋ฉฐ ๊ฐœ์ฒด๋ฅผ ๋ณ„๋„์˜ ๊ณ ์œ  ์ƒ‰์ƒ์œผ๋กœ ๋ Œ๋”๋งํ•œ๋‹ค๋Š” ์ ์„ ๋ช…์‹ฌํ•˜์‹ญ์‹œ์˜ค. ์ถ”๊ฐ€ ๋ Œ๋” ํŒจ์Šค๋Š” ๊ทธ๋ž˜ํ”ฝ ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ๋Ÿ‰์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค(์ง€์—ฐ๋œ ํŒŒ์ดํ”„๋ผ์ธ์˜ ๊ฒฝ์šฐ ์ผ๋ฐ˜์ ).
์ด์ง„ ๊ณต๊ฐ„ ๋ถ„ํ•  ์ธ๋ฑ์Šค๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์„ ํƒ์— ๋Œ€ํ•œ ๋กœ๊ทธ(n) ํƒ€์ด๋ฐ ํ”„๋กœํ•„์ด ์ œ๊ณต๋˜๋ฏ€๋กœ 1,000,000๊ฐœ์˜ ํด๋ฆฌ๊ณค์— ๋Œ€ํ•ด ๊ด‘์„  ์ฟผ๋ฆฌ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด ์•ฝ 14๊ฐœ์˜ ์ž‘์—…์„ ๋ณด๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ์— ๋”ฐ๋ผ - ๋ช‡ ๋งˆ์ดํฌ๋กœ์ดˆ๊ฐ€ ์†Œ์š”๋  ์ˆ˜ ์žˆ์œผ๋ฉฐ ํ”„๋ ˆ์ž„ ์˜ˆ์‚ฐ์— ์˜ํ–ฅ์„ ๋ฏธ์น˜๊ธฐ ์‹œ์ž‘ํ•˜๊ธฐ ์ „์— ์ˆ˜์ฒœ ๊ฐœ์˜ ์ฟผ๋ฆฌ๋ฅผ ํ—ˆ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

1m ํด๋ฆฌ ๋ชจ๋ธ์ด ์žˆ๊ณ  ์นด๋ฉ”๋ผ ๋ฐฉํ–ฅ์„ ๋”ฐ๋ผ ํ™”๋ฉด ๊ณต๊ฐ„์—์„œ ์ง์ ‘ ์žฅ๋ฉด์œผ๋กœ ๊ด‘์„ ์„ ํˆฌ์‚ฌํ•˜๋ ค๊ณ  ํ•œ๋‹ค๊ณ  ๊ฐ€์ •ํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค(์‚ฌ์šฉ ์‚ฌ๋ก€ ์„ ํƒ). ๋ฐฐ๋Ÿด ํ•ด์ƒ๋„์˜ ํ•˜๋‹จ์ธ "ํ’€ HD" ๋˜๋Š” 1920 ร— 1080์„ ์‚ฌ์šฉํ•œ๋‹ค๊ณ  ๊ฐ€์ •ํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. RGB๋งŒ ๋ Œ๋”๋ง(ํ”ฝ์…€๋‹น 24๋น„ํŠธ)ํ•œ๋‹ค๊ณ  ๊ฐ€์ •ํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. ๋ Œ๋”๋งํ•˜๋ ค๋ฉด 6220800๋ฐ”์ดํŠธ(์•ฝ 6Mb) ๋˜๋Š” ๊ทธ๋ž˜ํ”ฝ RAM์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค ์ €๊ฒƒ. CPU ์†”๋ฃจ์…˜์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ ๋ฆฌํ”„๋‹น 10๊ฐœ์˜ ํด๋ฆฌ๊ณค์ด ์žˆ๋Š” AABB BVH๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค๊ณ  ๊ฐ€์ •ํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. ์ฆ‰, ์•ฝ 200,000๊ฐœ์˜ ๋…ธ๋“œ๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ๊ฐ ๋…ธ๋“œ๋Š” ์ขŒํ‘œ์— ๋Œ€ํ•ด ์•ฝ 6 * 8๋ฐ”์ดํŠธ์ด๊ณ  ์ค‘๊ฐ„ ๋…ธ๋“œ์—๋Š” ํ•˜์œ„ ํฌ์ธํ„ฐ์— ๋Œ€ํ•ด ์ถ”๊ฐ€ 2 * 4๋ฐ”์ดํŠธ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ฆฌํ”„ ๋…ธ๋“œ๋Š” ํด๋ฆฌ๊ณค ํฌ์ธํ„ฐ์— ๋Œ€ํ•ด 10 * 4๋ฐ”์ดํŠธ, ์ฆ‰ 14,400,000๋ฐ”์ดํŠธ(์•ฝ 14Mb)๋ฅผ ๊ฐ–์Šต๋‹ˆ๋‹ค. ์ฃผ์š” ์ฐจ์ด์ ์€ BVH ์ฟผ๋ฆฌ๊ฐ€ GPU์˜ ๊ฒฝ์šฐ์— ๋น„ํ•ด RAM ๋Œ€์—ญํญ์— ๋Œ€ํ•œ ์š”๊ตฌ๊ฐ€ ๋งค์šฐ ์ ๊ณ  ์ „์ฒด 1m ํด๋ฆฌ ์ง€์˜ค๋ฉ”ํŠธ๋ฆฌ๋ฅผ ๋ Œ๋”๋งํ•˜๋Š” ๊ฒƒ๊ณผ ๋น„๊ตํ•˜์—ฌ ์ฟผ๋ฆฌ๋‹น ๋ช‡ ๊ฐ€์ง€ ์ž‘์—…๋งŒ ํฌํ•จ๋œ๋‹ค๋Š” ์‚ฌ์‹ค์„ ๊ณ ๋ คํ•  ๋•Œ ๋‚˜ํƒ€๋‚ฉ๋‹ˆ๋‹ค.
2560x1440๊ณผ ๊ฐ™์ด ๋ฐ์Šคํฌํ†ฑ์— ๋” ์ผ๋ฐ˜์ ์ธ ํ•ด์ƒ๋„๋ฅผ ์„ ํƒํ•˜๋ฉด 11059200byte ๋ Œ๋” ํƒ€๊ฒŸ(11Mb)์ด ๋ฉ๋‹ˆ๋‹ค.

๊ทธ๋ž˜ํ”ฝ ๋žจ ๋Œ€์—ญํญ์˜ ์˜ˆ์‚ฐ์ด ๋งŽ๊ณ  ์…ฐ์ด๋” ์ฝ”์–ด ์ˆ˜๊ฐ€ ์ƒ๋‹นํžˆ ๋งŽ๋‹ค๋ฉด - ๋ฌผ๋ก  ๊ฐ„๋‹จํ•˜๊ณ  ์ง๊ด€์ ์ธ ์„ ํƒ ๋ฐฉ๋ฒ•์ž…๋‹ˆ๋‹ค.

@Usnul ์€ ์ ˆ๋Œ€์ ์ด์ง€๋งŒ ๊ตฌํ˜„ํ•˜๊ธฐ์— ๊ฐ€์žฅ ๊ฐ„๋‹จํ•œ ์†”๋ฃจ์…˜์ผ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ณต๊ฐ„ ์ธ๋ฑ์Šค ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ๋ฅผ ๊ตฌํ˜„ํ•˜๊ณ  ์œ ์ง€ํ•˜๋Š” ๊ฒƒ์€ ์•„๋งˆ๋„ threejs ์œ ์ง€ ๊ด€๋ฆฌ์ž์—๊ฒŒ ์ค‘์š”ํ•˜์ง€ ์•Š์€ ๋ถ€๋‹ด์ด ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์ฆ‰, ์„ธ ๊ฐœ์˜ ์ผ๋ถ€ ๋˜๋Š” ๋ณ„๋„์˜ npm ํŒจํ‚ค์ง€๋กœ ํ›Œ๋ฅญํ•˜๊ณ  ์ž˜ ํ…Œ์ŠคํŠธ๋˜๊ณ  ์œ ์ง€ ๊ด€๋ฆฌ๋˜๋Š” ๊ณต๊ฐ„ ์ธ๋ฑ์Šค ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ๋ฅผ ๊ฐ–๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค.

์‚ฌ์šฉํ•˜๋Š” ์ง€์˜ค๋ฉ”ํŠธ๋ฆฌ์— ๋Œ€ํ•ด ์ด๋Ÿฌํ•œ ๊ณต๊ฐ„ ์ธ๋ฑ์Šค๋ฅผ ๊ตฌํ˜„ํ•˜๋Š” ๊ฒƒ์ด ๊ถ๊ธˆํ•ด์„œ BufferGeomtry๋ฅผ ๋ถ„ํ• ํ•˜๋Š” ์•„์ฃผ ๊ฐ„๋‹จํ•œ Octree(์ƒ์„ฑ ๋ฐ ๊ฒ€์ƒ‰ ์ „์šฉ)๋ฅผ ๊ตฌํ˜„ํ–ˆ์Šต๋‹ˆ๋‹ค. ์ด ๊ฐ„๋‹จํ•œ ์†”๋ฃจ์…˜์œผ๋กœ ์ €๋Š” ๋งค์šฐ ์œ ๋งํ•œ ๊ฒฐ๊ณผ๋ฅผ ์–ป์—ˆ์Šต๋‹ˆ๋‹ค. ์•ฝ 500K ์ •์ ์ด ์žˆ๋Š” ๊ธฐํ•˜ํ•™์— ์ ์šฉํ•˜์—ฌ ๋ ˆ์ด์บ์ŠคํŠธ ์‹œ๊ฐ„์ด ~120ms์—์„œ ~2.3ms๋กœ ๋‹จ์ถ•๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ํ˜„์žฌ ํŠธ๋ฆฌ์˜ ๊ตฌ์„ฑ์€ ~500ms๊ฐ€ ๊ฑธ๋ฆฌ์ง€๋งŒ ์›น ์›Œ์ปค ๋‚ด๋ถ€์—์„œ ๊ธฐํ•˜ํ•™๊ณผ ํŠธ๋ฆฌ ์ƒ์„ฑ์€ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์‹œ์ž‘ ์‹œ ํ•œ ๋ฒˆ๋งŒ ์ˆ˜ํ–‰๋˜๊ธฐ ๋•Œ๋ฌธ์— ๋ฌธ์ œ๊ฐ€ ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์•Œ๊ณ ๋ฆฌ์ฆ˜์€ THREE.BufferGeometry ์— ์•„์ฃผ ์‰ฝ๊ฒŒ ํ†ตํ•ฉ๋  ์ˆ˜ ์žˆ๊ณ  THREE.BufferAttribute ์˜ dynamic ์™€ ๊ฐ™์€ ํ”Œ๋ž˜๊ทธ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ผœ๊ฑฐ๋‚˜ ๋Œ ์ˆ˜ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ์ด๋ ‡๊ฒŒ ํ•˜๋ฉด BufferGeometry๊ฐ€ ๋ณ€๊ฒฝ๋˜์ง€ ์•Š์•„์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ์—๋งŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ถˆํ–‰ํžˆ๋„ THREE.Mesh ์˜ raycast ๋ฉ”์„œ๋“œ๋ฅผ ๋ฎ์–ด์จ์•ผ ํ–ˆ์ง€๋งŒ ๋‘ ์ค„๋งŒ ๋ณ€๊ฒฝํ•˜๋ฉด ๋˜์—ˆ์Šต๋‹ˆ๋‹ค(Octree ๊ฒ€์ƒ‰ ํ˜ธ์ถœ ๋ฐ ์œ„์น˜ ๋ฐฐ์—ด ๋ฐ˜๋ณต).

์–ด์จŒ๋“  ๋‚ด VR ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ์—์„œ ๋งˆ์šฐ์Šค ํด๋ฆญ ์‹œ ํ•œ ๋ฒˆ๋ฟ ์•„๋‹ˆ๋ผ ๋ Œ๋”๋ง ๋ฃจํ”„ ์ค‘์— ๊ฐœ์ฒด ์ปจํŠธ๋กค๋Ÿฌ ์ถฉ๋Œ์„ ๊ฐ์ง€ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ํ˜„์žฌ ์†”๋ฃจ์…˜์— ์˜์กดํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๋” ๊ฐœ์„ ํ•  ์ˆ˜ ์žˆ์œผ๋ฉด ๋…ธ๋ ฅํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

์—…๋ฐ์ดํŠธ ๋ ˆ์ด์บ์ŠคํŠธ ์‹œ๊ฐ„ ์ธก์ •์— ์‹ค์ˆ˜๋ฅผ ์ €์งˆ๋ €์Šต๋‹ˆ๋‹ค. ์˜ฌ๋ฐ”๋ฅธ ๊ฐ’์€ ~2.3ms์ž…๋‹ˆ๋‹ค(~0.3ms ๋Œ€์‹ ). ๊ทธ์— ๋”ฐ๋ผ ์œ„์˜ ๊ฐ’์„ ๋ณ€๊ฒฝํ–ˆ์Šต๋‹ˆ๋‹ค.

three.js๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ๊ตฌ์ถ•๋œ ๋Œ€๋ถ€๋ถ„์˜ ๋ณต์žกํ•œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ๋Š” ๋น ๋ฅธ ๊ณต๊ฐ„ ์กฐํšŒ๋ฅผ ์ˆ˜ํ–‰ํ•˜๋Š” ์˜ตํŠธ์ธ ๋ฐฉ์‹์ด ํ•„์š”ํ•˜๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, 3D ํŽธ์ง‘๊ธฐ. ๋‚˜๋Š” ๋ช‡ ๊ฐ€์ง€ ๊ตฌํ˜„์„ ๊ฐ€์ง€๊ณ  ๋†€์•˜์ง€๋งŒ ์ž˜ ํ†ตํ•ฉ๋˜์ง€ ์•Š๊ฑฐ๋‚˜ three.js์˜ ํŠน์ • ๋ฒ„์ „์œผ๋กœ ๋„ˆ๋ฌด ๋นก๋นกํ•˜๊ฒŒ ๋ž˜ํ•‘๋ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ๋ˆ„๊ตฌ๋“ ์ง€ three.js์˜ ์ตœ์‹  ๋ฒ„์ „์œผ๋กœ์˜ ์—…๊ทธ๋ ˆ์ด๋“œ ๊ฒฝ๋กœ๋ฅผ ์ค‘๋‹จํ•˜์ง€ ์•Š๊ณ  ์ด๋ฅผ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ๋Š” ์„ ํƒ์ ์ธ ๋ฐฉ๋ฒ•์ด ์žˆ๋‹ค๋ฉด ์ข‹์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

@matthias-w obj ๋ชจ๋ธ์— ๋Œ€ํ•ด raycaster๋ฅผ ์‹œ๋„ํ–ˆ์ง€๋งŒ ์ปจํŠธ๋กค๋Ÿฌ๊ฐ€ ์•„๋ฌด ๊ฒƒ๋„ ๊ฐ์ง€ํ•˜์ง€ ๋ชปํ•ฉ๋‹ˆ๋‹ค. ๊ด‘์„ ์ด ๋ชจ๋ธ์„ ํ†ต๊ณผํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ ๋ฌธ์ œ๋ฅผ ์–ด๋–ป๊ฒŒ ๊ณ ์ณค๋Š”์ง€ ์•Œ๋ ค์ฃผ์‹ค ์ˆ˜ ์žˆ๋‚˜์š”

์„ ํƒ์  ๊ณต๊ฐ„ ์ธ๋ฑ์Šค๋ฅผ ๊ฐ–๋Š” ์ฃผ์ œ์—. ๋ Œ๋”๋Ÿฌ ์ž์ฒด(์˜ˆ: ์ปฌ๋ง์šฉ)๊ฐ€ ์—”์ง„์˜ ํ•„์ˆ˜์ ์ธ ๋ถ€๋ถ„์ด ๋˜๊ธฐ์—๋„ ์ถฉ๋ถ„ํžˆ ์œ ์šฉํ•˜๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๋‹ค์Œ์€ ๊ด€๋ จ ํ† ๋ก ์ž…๋‹ˆ๋‹ค.

13909

์ด๋ด! ๋‚˜๋„ ์ด๊ฒƒ์— ์•ฝ๊ฐ„ ๊ด€์‹ฌ์ด ์žˆ์—ˆ์ง€๋งŒ(๊ทธ ์ดํ›„๋กœ ๋ ˆ์ด์บ์ŠคํŠธ ์š”๊ตฌ ์‚ฌํ•ญ์— ๋Œ€ํ•œ ๋‹ค๋ฅธ ์†”๋ฃจ์…˜์„ ์ฐพ์•˜์ง€๋งŒ) ๋‚ด ์‹คํ—˜์—๋„ ์ผ๋ถ€ ๊ธฐ์—ฌํ•  ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ–ˆ์Šต๋‹ˆ๋‹ค. ๋‹ค์†Œ ๊ฑฐ์น ์ง€๋งŒ ๋ช‡ ๋‹ฌ ์ „์— ์ด๊ฒƒ์„ ์ •๋ฆฌํ–ˆ์Šต๋‹ˆ๋‹ค.

https://github.com/gkjohnson/threejs-fast-raycast

3๊ฐœ์˜ ์ง€์˜ค๋ฉ”ํŠธ๋ฆฌ ๊ฐ์ฒด์— computeBoundsTree ํ•จ์ˆ˜๋ฅผ ์ถ”๊ฐ€ํ•˜๊ณ  ์ด๋ฅผ ์‚ฌ์šฉํ•˜๋„๋ก raycast ํ•จ์ˆ˜๋ฅผ ์žฌ์ •์˜ํ•ฉ๋‹ˆ๋‹ค(์ถ”๊ฐ€๋œ ์ตœ์ ํ™”๋กœ ์ฒซ ๋ฒˆ์งธ ํžˆํŠธ๋งŒ ๋ฐ˜ํ™˜). ์ •์ ์ด๊ณ  ๋งค์šฐ ๋ณต์žกํ•œ ๋ฉ”์‹œ์—๋งŒ ์ •๋ง ์œ ์šฉํ•˜๋ฉฐ ์žฅ๋ฉด์„ ๊ณต๊ฐ„์ ์œผ๋กœ ๋ถ„ํ• ํ•˜๋Š” ๋ฐ๋Š” ์•„๋ฌด ๊ฒƒ๋„ ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋‹ค์Œ์€ 80,000๊ฐœ์˜ ์‚ผ๊ฐํ˜• ๋ฉ”์‹œ์—์„œ ๋ ˆ์ด์บ์ŠคํŠธ ์„ฑ๋Šฅ์˜ ์ฐจ์ด๋ฅผ ๋ณผ ์ˆ˜ ์žˆ๋Š” ๋ฐ๋ชจ ์ž…๋‹ˆ๋‹ค. ๊ฒฝ๊ณ„ ํŠธ๋ฆฌ๋ฅผ ๊ณ„์‚ฐํ•˜๋Š” ๊ฒƒ์€ ์•ฝ๊ฐ„ ๋Š๋ฆฌ์ง€๋งŒ ์•ฝ๊ฐ„์˜ ์ž‘์—…์œผ๋กœ ๋” ๋ถ€๋“œ๋Ÿฝ๊ฒŒ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ด์— ๋Œ€ํ•œ ์ œ ์˜๊ฒฌ์— ๋Œ€ํ•ด์„œ๋Š” ์•ฝ๊ฐ„์˜ ๊ฐˆ๋“ฑ์„ ๋Š๋‚๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ THREE์— ๋Œ€ํ•œ ํ™•์žฅ์œผ๋กœ์„œ ๊ฝค ์ž˜ ๊ตฌ์ถ•๋  ์ˆ˜ ์žˆ๋Š” ๊ฒƒ๊ณผ ๊ฐ™์€ ๋Š๋‚Œ์ž…๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๊ถ๊ทน์ ์œผ๋กœ ๋ณต์žกํ•˜๊ฑฐ๋‚˜ ์• ๋‹ˆ๋ฉ”์ด์…˜๋œ ๋ฉ”์‹œ์— ๋Œ€ํ•ด ์‚ผ๊ฐํ˜•๋ณ„ ๊ฒ€์‚ฌ/์ถฉ๋Œ/์บ์ŠคํŠธ๋ฅผ ์ˆ˜ํ–‰ํ•˜๋Š” ๊ฒƒ์ด ์ตœ์ ์ธ ๊ฒƒ์ฒ˜๋Ÿผ ๋ณด์ด์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๊ฐ„๋‹จํ•œ ๊ฒฝ์šฐ์—๋Š” ๊ดœ์ฐฎ์„ ์ˆ˜ ์žˆ์ง€๋งŒ ๋ณต์žกํ•œ ๊ฒฝ์šฐ์— ์ดˆ๊ณ ์† ๋ ˆ์ด์บ์ŠคํŒ…(๋˜๋Š” ์˜คํด๋ฃจ์ „ ์ปฌ๋ง, ์ถฉ๋Œ ๋“ฑ)์„ ๊ฐ€๋Šฅํ•˜๊ฒŒ ํ•˜๋ ค๋ฉด ์ผ๋ฐ˜์ ์ธ ํ‰๋ฉด/ํ๋ธŒ/๊ตฌ/์บก์Š ํ‘œํ˜„์ด๋‚˜ ๋‹จ์ˆœํ™”๋œ ๋ฉ”์‹œ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ๋” ์ ํ•ฉํ•  ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ๋ฌผ๋ก  ์™„๋ฒฝํ•œ ํ”ฝ์…€ ์บ์ŠคํŠธ๋ฅผ ์ฐพ๊ณ  ์žˆ๋‹ค๋ฉด ์ด๊ฒƒ์€ ์ž˜ ์ž‘๋™ํ•˜์ง€ ์•Š์ง€๋งŒ ์˜ฌ๋ฐ”๋ฅธ ์†”๋ฃจ์…˜์€ ์‹ค์ œ๋กœ ์‚ฌ์šฉ ์‚ฌ๋ก€์— ๋”ฐ๋ผ ๋‹ค๋ฆ…๋‹ˆ๋‹ค.

@Usnul @matthias-w ๊ท€ํ•˜์˜ octree/BVH ๊ตฌํ˜„์€ ์˜คํ”ˆ ์†Œ์Šค์ž…๋‹ˆ๊นŒ ์•„๋‹ˆ๋ฉด ์˜จ๋ผ์ธ์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ? ๋‚˜๋Š” ํ™•์‹คํžˆ ๊ด€์‹ฌ์„ ๊ฐ€์ง€๊ณ  ์‚ดํŽด๋ณผ ๊ฒƒ์ž…๋‹ˆ๋‹ค!

@gkjohnson

octree/BVH ๊ตฌํ˜„ ์ค‘ ํ•˜๋‚˜๊ฐ€ ์˜คํ”ˆ ์†Œ์Šค์ด๊ฑฐ๋‚˜ ์˜จ๋ผ์ธ์—์„œ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๊นŒ? ๋‚˜๋Š” ํ™•์‹คํžˆ ๊ด€์‹ฌ์„ ๊ฐ€์ง€๊ณ  ์‚ดํŽด๋ณผ ๊ฒƒ์ž…๋‹ˆ๋‹ค!

์ฝ”๋“œ๋Š” ํ˜„์žฌ ์˜คํ”ˆ ์†Œ์Šค๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค. ์ €์—๊ฒŒ ๊ฐœ์ธ์ ์œผ๋กœ ์—ฐ๋ฝํ•˜์‹œ๋ฉด ์ถœ์ฒ˜๋ฅผ ์•Œ๋ ค๋“œ๋ฆด ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ธ์Šคํ„ด์Šคํ™”๋œ ๋ฉ”์‹œ์— ๋Œ€ํ•ด ์ˆ˜ํ–‰ํ•œ ์˜ˆ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.
http://server1.lazy-kitty.com/tests/instance-foliage-1mil/
์œ„์˜ ์˜ˆ์—๋Š” ๋‹ค์Œ์ด ํฌํ•จ๋ฉ๋‹ˆ๋‹ค.

  • BVH๋Š” ์ƒˆ ์ธ์Šคํ„ด์Šค๊ฐ€ ํŠธ๋ฆฌ์— ์‚ฝ์ž…๋  ๋•Œ ๋™์ ์œผ๋กœ ์—…๋ฐ์ดํŠธ๋ฉ๋‹ˆ๋‹ค.
  • BVH๋Š” ์ฆ‰์„์—์„œ ๊นŠ์ด 1-2 ํšŒ์ „์„ ์‚ฌ์šฉํ•˜์—ฌ ์ ์ง„์ ์œผ๋กœ ์ตœ์ ํ™”๋ฉ๋‹ˆ๋‹ค.
  • BVH๋Š” ๋ Œ๋”๋งํ•  ์ธ์Šคํ„ด์Šค์— ๋Œ€ํ•œ ์ ˆ๋‘์ฒด ์ฟผ๋ฆฌ๋กœ ์ƒ˜ํ”Œ๋ง๋ฉ๋‹ˆ๋‹ค.

์ž‘์—… ์ค‘์ธ ๊ฒŒ์ž„์—์„œ ์‹คํ–‰ ์ค‘์ธ ๋ฒ„์ „์ด ์žˆ์Šต๋‹ˆ๋‹ค.
http://server1.lazy-kitty.com/komrade/

๊ท€ํ•˜์˜ ๊ตฌํ˜„๊ณผ ๊ด€๋ จํ•˜์—ฌ. ๋‚˜๋Š” ๊ทธ๊ฒƒ์„ ์ข‹์•„ํ•œ๋‹ค. ๋‚˜์˜ ๊ฒƒ์€ 2๊ฐ€์ง€ ์ฃผ์š” ๋ฉด์—์„œ ๋‹ค๋ฅด๋‹ค:

  • ๋‚˜๋Š” ์„ฑ๋Šฅ์— ์ง‘์ค‘ํ•œ๋‹ค
  • ๋‚˜๋Š” ๋ฉ”๋ชจ๋ฆฌ ํ’‹ํ”„๋ฆฐํŠธ์— ์ง‘์ค‘ํ•œ๋‹ค
  • ๋‚˜๋Š” ๋งŽ์€ ๊ณณ์—์„œ ๊ฐ€๋น„์ง€ ์ˆ˜์ง‘์„ ํ”ผํ•œ๋‹ค

์ข€ ๋” ๊ตฌ์ฒด์ ์ธ ์‚ฌํ•ญ:

  • ๋˜ํ•œ BVH๋กœ ์ˆ˜ํ–‰ํ•˜๋ ค๋Š” ์ž‘์—…์— ๋”ฐ๋ผ ํˆฌ๋ช…ํ•˜๊ฒŒ ๋ถ„ํ•  ์ „๋žต์„ ํ˜ผํ•ฉํ•˜์—ฌ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.
  • ๋‚ด BVH๋Š” AABB ๊ธฐ๋ฐ˜์ž…๋‹ˆ๋‹ค.
  • ์žฌ์ ํ•ฉ์„ ํ†ตํ•ด ๋…ธ๋“œ ๊ฒฝ๊ณ„์— ๋Œ€ํ•œ ์—…๋ฐ์ดํŠธ๋ฅผ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค.

@Usnul ๊ท€ํ•˜์˜ ์ด๋ฉ”์ผ ์ฃผ์†Œ ๋“ฑ์„ ๋ณผ ์ˆ˜ ์—†์ง€๋งŒ ๊ท€ํ•˜์˜ ๊ณต๊ฐ„ ์ธ๋ฑ์‹ฑ ์†”๋ฃจ์…˜์„ ์—ฐ๊ตฌํ•˜๋Š” ๋ฐ ์ƒ๋‹นํžˆ ๊ด€์‹ฌ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

ํ˜„์žฌ ๋‚˜๋Š” ๋ชจ๋“  ๊ด€๋ จ ์žฅ๋ฉด ๊ฐœ์ฒด๋ฅผ ๋ฐ˜๋ณตํ•˜๊ณ  ์นด๋ฉ”๋ผ๋กœ๋ถ€ํ„ฐ์˜ ๊ฑฐ๋ฆฌ๋ฅผ ๊ณ„์‚ฐํ•ฉ๋‹ˆ๋‹ค. ๊ฐ€์žฅ ์ตœ์ ์˜ ์ ‘๊ทผ ๋ฐฉ์‹์€ ์•„๋‹™๋‹ˆ๋‹ค.

@titansofttime
์ด๊ฒƒ์˜
travnick at gmail com
๊ณต๊ฐœ์ ์œผ๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†๋‹ค๋Š” ๊ฒƒ์„ ๋ชฐ๋ž์Šต๋‹ˆ๋‹ค. ๋‚ด ์ž˜๋ชป์ด์•ผ.

@Usnul ์ €๋„ 100๋งŒ ํ”„๋กœ์ ํŠธ์— ๊ด€์‹ฌ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ๊ฐ€๋Šฅํ•˜๋‹ค๋ฉด 1000๋งŒ~2000๋งŒ๋„ ๊ฐ€๋Šฅํ•˜๋‹ค. ์ €์—๊ฒŒ ์ด๋ฉ”์ผ์„ ๋ณด๋‚ด์ฃผ์„ธ์š”: kaori.nakamoto. [email protected]

๋งค์šฐ ์นœ์ ˆํ•˜๊ฒŒ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค!

http://server1.lazy-kitty.com/tests/instance-foliage-10mil/
์ด๊ฒƒ์€ 1000๋งŒ ๋ฒ„์ „์ž…๋‹ˆ๋‹ค.

๋‹ต์žฅ์„ ๋Šฆ๊ฒŒ ๋ณด๋‚ด์„œ ๋ฏธ์•ˆํ•ด.
@gkjohnson ์ฝ”๋“œ๋Š” ์˜คํ”ˆ ์†Œ์Šค๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค. ๋˜ํ•œ ๊ท€ํ•˜์˜ ์†”๋ฃจ์…˜์€ ์ œ ๊ฒƒ๋ณด๋‹ค ํ›จ์”ฌ ๋” ์ •๊ตํ•˜๊ฒŒ ๋“ค๋ฆฝ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ๋‚ด ์†”๋ฃจ์…˜์—์„œ ๋ฐฐ์šธ ์ ์ด ๋งŽ์ง€ ์•Š์€ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

@sid3007 ๋ฌธ์ œ๋ฅผ ์ดํ•ดํ•˜๊ณ  ์žˆ๋Š”์ง€ ์ž˜ ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” ๋‚˜์˜ ์ ‘๊ทผ ๋ฐฉ์‹์„ ์„ค๋ช…ํ•  ์ˆ˜ ์žˆ๋‹ค. ์•„๋งˆ๋„ ๋„์›€์ด ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋‚ด ์‚ฌ์šฉ ์‚ฌ๋ก€๋Š” ๋งค์šฐ ๊ฐ„๋‹จํ•ฉ๋‹ˆ๋‹ค. ๋‚ด ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ์‹œ์ž‘๋˜๋ฉด ๋‹ค์–‘ํ•œ ๋ชจ๋ธ์— ๋Œ€ํ•œ ์ง€์˜ค๋ฉ”ํŠธ๋ฆฌ๊ฐ€ ๋กœ๋“œ๋ฉ๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ๋ชจ๋ธ์€ ์‚ฌ์šฉ์ž๊ฐ€ ๋ณ€ํ˜•ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํ˜•์ƒ์€ ๋ณ€๊ฒฝ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๊ธฐํ•˜ํ•™์  ๋ณ€ํ˜•์ด ์—†์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ์‹œ์ž‘๋  ๋•Œ ๋ชจ๋“  ์ง€์˜ค๋ฉ”ํŠธ๋ฆฌ์— ๋Œ€ํ•ด ํ•œ ๋ฒˆ ๋นŒ๋“œ๋˜๋Š” ๋งค์šฐ ๊ฐ„๋‹จํ•œ Octree๋ฅผ ๊ตฌํ˜„ํ–ˆ์Šต๋‹ˆ๋‹ค. ์˜ฅํŠธ๋ฆฌ๋Š” ๋™์ ์ด์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ฃผ์–ด์ง„ ์ง€์˜ค๋ฉ”ํŠธ๋ฆฌ์˜ ๊ฒฝ๊ณ„ ์ƒ์ž์™€ ์ •์  ๋ฐฐ์—ด์„ ๊ธฐ๋ฐ˜์œผ๋กœ ๊ตฌ์ถ•๋ฉ๋‹ˆ๋‹ค. ์ƒ์„ฑํ•˜๋Š” ๋™์•ˆ 8์ง„์ˆ˜์— ์ •์ ์ด ํฌํ•จ๋˜์–ด ์žˆ๋Š”์ง€ ๋˜๋Š” 8์ง„์ˆ˜์˜ Box3 ๊ฒฝ๊ณ„ ์ƒ์ž๊ฐ€ ์‚ผ๊ฐํ˜•(์ธ๋ฑ์‹ฑ๋˜์ง€ ์•Š์€ ์ง€์˜ค๋ฉ”ํŠธ๋ฆฌ์˜ ์—ฐ์† 3๊ฐœ ์ •์ )๊ณผ ๊ต์ฐจํ•˜๋Š”์ง€ ํ™•์ธํ•˜๊ณ  ์ •์  ๋ฐฐ์—ด ์ฐธ์กฐ๋ฅผ ์˜ฅํŠธ๋ฆฌ ๋…ธ๋“œ์™€ ์ €์žฅํ•ฉ๋‹ˆ๋‹ค.
๋ฉ”์‰ฌ๋ณ„ ์˜ฅํŠธ๋ฆฌ๋Š” ๋ฉ”์‰ฌ์™€ ํ•จ๊ป˜ ์ €์žฅ๋ฉ๋‹ˆ๋‹ค. ๋˜ํ•œ ์‹ค์ œ๋กœ octree ๊ต์ฐจ ํ…Œ์ŠคํŠธ ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•˜๊ธฐ ์œ„ํ•ด ๋ฉ”์‰ฌ ์ธ์Šคํ„ด์Šค์˜ THREE.Mesh ์˜ raycast ๋ฉ”์„œ๋“œ(ํ•œ ์ค„๋งŒ)๋ฅผ ๋ฎ์–ด์”๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ๋ฉ”์‰ฌ์˜ ๊ธฐ๋ณธ ๊ต์ฐจ ๋…ผ๋ฆฌ์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๊ธฐํ•˜ํ•™์  ๋ฉด ์ •์  ์ธ๋ฑ์Šค๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.
ํ•œ ๊ฐ€์ง€ ์ตœ์ ํ™”๋ฅผ ์ˆ˜ํ–‰ํ–ˆ์Šต๋‹ˆ๋‹ค. octree ์ƒ์„ฑ์€ WebWorker(์‹ค์ œ๋กœ๋Š” ์ž‘์—…์ž ํ’€) ๋‚ด์—์„œ ์•ฑ ์‹œ์ž‘ ์‹œ ํ•œ ๋ฒˆ ์ˆ˜ํ–‰๋ฉ๋‹ˆ๋‹ค. ๊ทธ ์ด์œ ๋Š” ํฐ ์ง€์˜ค๋ฉ”ํŠธ๋ฆฌ๋ฅผ ์œ„ํ•œ ํŠธ๋ฆฌ ์ƒ์„ฑ์— ์ƒ๋‹นํ•œ ์‹œ๊ฐ„(๋ช‡ ์ดˆ)์ด ๊ฑธ๋ฆฌ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ๋ธŒ๋ผ์šฐ์ € UI๊ฐ€ ์ฐจ๋‹จ๋˜๋ฏ€๋กœ ๋‹ค๋ฅธ ์Šค๋ ˆ๋“œ๋กœ ์˜ฎ๊ฒผ์Šต๋‹ˆ๋‹ค.
๋‚ด ์ ‘๊ทผ ๋ฐฉ์‹์ด ๋ช…ํ™•ํ•ด์ง€๊ธฐ๋ฅผ ๋ฐ”๋ž๋‹ˆ๋‹ค.

@matthias-w ์ •๋ง ์ž˜ํ•œ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค! ๋‚˜๋Š” ๋…๋ฆฝ์ ์œผ๋กœ ๊ฑฐ์˜ ๋™์ผํ•œ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ–ˆ์ง€๋งŒ ์„ฑ๋Šฅ ํ–ฅ์ƒ์„ ๊ฑฐ์˜ ๋‹ฌ์„ฑํ–ˆ๋‹ค๊ณ  ์ƒ๊ฐํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. https://discourse.threejs.org/t/octree-injection-for-faster-raytracing/8291/2 (๊ฐ์ฒด ์ง€ํ–ฅ ์˜ฅํŠธ๋ฆฌ ๊ตฌํ˜„ ๋ฐ Mesh.raycast์— ๋Œ€ํ•œ ๋œ ๊นจ๋—ํ•œ ์ˆ˜์ •)

๋‹ค๋ฅธ ์‚ฌ๋žŒ๋“ค์ด ๋” ๋งŽ์€ ์‹คํ—˜์„ ํ•  ์ˆ˜ ์žˆ๋„๋ก Octree ๊ตฌํ˜„์„ ์˜คํ”ˆ ์†Œ์Šค/๊ธฐ์—ฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

@EliasHasle ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค. ์‚ฌ์‹ค ์ฒซ ๋ฒˆ์งธ ์ธก์ •์—์„œ ์‹ค์ˆ˜๋ฅผ ์ €์งˆ๋ €๊ธฐ ๋•Œ๋ฌธ์— ์„ฑ๋Šฅ ํ–ฅ์ƒ์€ ๊ทธ๋‹ค์ง€ ์ข‹์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๊ฐ’์„ ์ˆ˜์ •ํ–ˆ์Šต๋‹ˆ๋‹ค(์œ„์˜ ๋‚ด ๊ฒŒ์‹œ๋ฌผ ์ฐธ์กฐ). Octree์˜ ๋Œ€์ˆ˜ ๊ฒ€์ƒ‰ ๋ณต์žก์„ฑ๊ณผ ๊ด€๋ จํ•˜์—ฌ ํƒ€์ด๋ฐ์ด ๋” ํ•ฉ๋ฆฌ์ ์ž…๋‹ˆ๋‹ค. ๋ถˆํ–‰ํžˆ๋„ ์ง€๊ธˆ์€ ์ฝ”๋“œ๋ฅผ ์ œ๊ณตํ•  ์ˆ˜ ์—†์ง€๋งŒ ์˜ฌํ•ด ๋ง์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์–ด์จŒ๋“ , ๋‚ด ๊ตฌํ˜„์€ ๋งค์šฐ ๊ฐ„๋‹จํ•ฉ๋‹ˆ๋‹ค(๊ทธ๋ฆฌ๊ณ  ๊นจ๋—ํ•œ BTW ;). ๊ทธ๋ž˜์„œ ํŠน๋ณ„ํ•œ ์ธ์‚ฌ์ดํŠธ๋Š” ์—†์—ˆ์„ ๊ฒƒ ๊ฐ™์•„์š”.

@matthias-w 500k ๋ฒ„ํ…์Šค ๋ฉ”์‹œ์˜ ๋ ˆ์ด์บ์ŠคํŠธ์— ๋Œ€ํ•ด 2.3ms ๋Œ€ 120ms๋Š” ์—ฌ์ „ํžˆ ์ƒ๋‹นํ•œ ๊ฐœ์„ ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ๊ฒŒ์ž„์—์„œ ๋ฐœ์‚ฌ๋œ ์ด์•Œ์˜ ์‹ค์‹œ๊ฐ„ ํ•ด์ƒ๋„๋ฅผ ๊ฐ€๋Šฅํ•˜๊ฒŒ ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค(๊ณ„์‚ฐ์˜ ์ƒ๋‹นํžˆ ํฐ ๋ถ€๋ถ„ ํ”„๋ ˆ์ž„๋‹น ์˜ˆ์‚ฐ).

๋ ˆ์ดํŠธ๋ ˆ์ด์‹ฑ๋„ ํ•ด๋ณด์…จ๋‚˜์š”?

๊ตฌํ˜„์ด JS ๊ฐœ์ฒด ํŠธ๋ฆฌ๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•ฉ๋‹ˆ๊นŒ? ๋ฆฌํ„ฐ๋Ÿด ๊ฐœ์ฒด ๋˜๋Š” ํ”„๋กœํ† ํƒ€์ž…์˜ ์ธ์Šคํ„ด์Šค? ๊ด‘์‚ฐ์€ ์™„์ „ํžˆ ์ž๊ธฐ ์œ ์‚ฌํ•˜๋ฏ€๋กœ ๋ชจ๋“  ๋…ธ๋“œ๋Š” ๋ฉ”์„œ๋“œ์™€ ๋ชจ๋‘๊ฐ€ ํฌํ•จ๋œ ์˜ฅํŠธ๋ฆฌ์ž…๋‹ˆ๋‹ค.

@EliasHasle

์ •์  ๊ธฐํ•˜ํ•™์— ๋Œ€ํ•œ ๋ ˆ์ด์บ์ŠคํŒ…์— ๊ด€์‹ฌ์ด ์žˆ๋‹ค๋ฉด ์ €์™€ ๋‹ค๋ฅธ ์‚ฌ๋žŒ๋“ค์€ BVH๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์‚ผ๊ฐํ˜•์„ ์ธ๋ฑ์‹ฑํ•˜๊ณ  ๊ณ ์„ฑ๋Šฅ ๋ ˆ์ด์บ์ŠคํŒ…๊ณผ ์ •์  ๋ณตํ•ฉ ๊ธฐํ•˜ํ•™์— ๋Œ€ํ•œ ๊ต์ฐจ ๊ฐ์ง€๋ฅผ ํ—ˆ์šฉํ•˜๋Š” three-mesh-bvh ์— ์ƒ๋‹นํ•œ ๋…ธ๋ ฅ์„ ๊ธฐ์šธ์˜€์Šต๋‹ˆ๋‹ค. ํŠธ๋ฆฌ ๊ตฌ์ถ• ํ”„๋กœ์„ธ์Šค๋Š” ๋” ๋ณต์žกํ•˜๋ฏ€๋กœ ์‹œ๊ฐ„์ด ์กฐ๊ธˆ ๋” ๊ฑธ๋ฆฌ์ง€๋งŒ ์ˆ˜์‹ญ๋งŒ ๊ฐœ์˜ ์‚ผ๊ฐํ˜•์ด ์žˆ๋Š” ์ง€์˜ค๋ฉ”ํŠธ๋ฆฌ์— ๋Œ€ํ•ด ๋ ˆ์ด์บ์ŠคํŒ…ํ•  ๋•Œ ๋ ˆ์ด์บ์ŠคํŒ…์€ ๋ฐ€๋ฆฌ์ดˆ ๋ฏธ๋งŒ, ์ข…์ข… 0.1ms ๋ฏธ๋งŒ๊นŒ์ง€ ๊ฑธ๋ฆฝ๋‹ˆ๋‹ค.

๋นŒ๋“œ ์‹œ๊ฐ„์€ ๋ช‡ ๊ฐ€์ง€ ๋‹ค๋ฅธ ๋ฐฉ๋ฒ•์œผ๋กœ ํ–ฅ์ƒ๋  ์ˆ˜ ์žˆ์ง€๋งŒ ๋‚ด๊ฐ€ ์›ํ•˜๋Š” ์ž‘์—…์—๋Š” ์ถฉ๋ถ„ํ–ˆ์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ๊ฐœ์„ ํ•˜๋Š” ๊ฒƒ์€ ๋ชฉ๋ก์— ์žˆ์Šต๋‹ˆ๋‹ค.

๋ฉ”์‹œ๊ฐ€ ๋งŽ์€ ์žฅ๋ฉด์— ๋Œ€ํ•ด ๋” ๋‚˜์€ ๋ ˆ์ด์บ์ŠคํŒ… ๋ฐ ์ถฉ๋Œ ๊ฐ์ง€๋ฅผ ๊ฐ€๋Šฅํ•˜๊ฒŒ ํ•˜๊ธฐ ์œ„ํ•ด ๋™์  ์žฅ๋ฉด ๊ธฐ๋ฐ˜ ์˜ฅํŠธ๋ฆฌ๋ฅผ ๋งŒ๋“ค๊ณ  ์‹ถ์ง€๋งŒ ์ข‹์€ ์‚ฌ์šฉ ์‚ฌ๋ก€๊ฐ€ ์—†์—ˆ์Šต๋‹ˆ๋‹ค. ์–ธ์  ๊ฐ€๋Š”!

@EliasHasle ๋‚ด ๊ตฌํ˜„์€ JS ํด๋ž˜์Šค ๊ฐ์ฒด์˜ ํŠธ๋ฆฌ์ž…๋‹ˆ๋‹ค(ES6 ํด๋ž˜์Šค, ์ฆ‰ ํ”„๋กœํ† ํƒ€์ž… ์ธ์Šคํ„ด์Šค ์‚ฌ์šฉ). ๊ธฐ๋ณธ์ ์œผ๋กœ ๋…ธ๋“œ๋Š” ๋‚ด ๊ตฌํ˜„์—์„œ ํŠธ๋ฆฌ์ž…๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๋ฃจํŠธ ๋…ธ๋“œ๋ฅผ ๋ณด์œ ํ•˜๊ณ  ํŠธ๋ฆฌ๋ฅผ ๊ตฌ์ถ• ๋ฐ ๊ฒ€์ƒ‰(๋˜ํ•œ ์ผ๋ถ€ ๋””๋ฒ„๊น… ๋ฐ ์‹œ๊ฐํ™”)ํ•˜๊ธฐ ์œ„ํ•œ ๋ฉ”์„œ๋“œ๋ฅผ ์ œ๊ณตํ•˜๋Š” ์ถ”๊ฐ€ Octree ํด๋ž˜์Šค๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

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

์ถฉ๋Œ ๊ฐ์ง€ ์ ‘๊ทผ ๋ฐฉ์‹์˜ ํ›Œ๋ฅญํ•œ ๋ชจ์Œ์ง‘์ธ ์ฑ…์„ ์ถ”์ฒœํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. C. Ericson, Real-Time Collision Detection, CRC Press, 2004

@gkjohnson ๋ฉ‹์ง€๋„ค์š” ! ์„ฑ๋Šฅ์ด ์ธ์ƒ์ ์ž…๋‹ˆ๋‹ค. ์–ด๋–ค ์ข…๋ฅ˜์˜ BVH๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๊นŒ?

@matthias-w ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค!

๋ช‡ ๊ฐ€์ง€ ๋ถ„ํ•  ์ „๋žต ์˜ต์…˜์ด ์žˆ์ง€๋งŒ ๊ฐ€์žฅ ๊ธด ์ธก๋ฉด์˜ ์ค‘์‹ฌ์—์„œ BVH ๋…ธ๋“œ๋ฅผ ๋ถ„ํ• ํ•˜๋ฉด ํŠธ๋ฆฌ๊ฐ€ ๊ฐ€์žฅ ๋น ๋ฅด๊ฒŒ ๊ตฌ์ถ•๋ฉ๋‹ˆ๋‹ค. ์‚ผ๊ฐํ˜•์€ ๊ฒฝ๊ณ„์˜ ์ค‘์‹ฌ์„ ๊ธฐ์ค€์œผ๋กœ ์ธก๋ฉด์œผ๋กœ ๋ถ„ํ• ๋˜๊ณ  ํŠธ๋ฆฌ ๋…ธ๋“œ๋Š” ์ž์‹ ์‚ผ๊ฐํ˜•์„ ์™„์ „ํžˆ ํฌํ•จํ•˜๋„๋ก ํ™•์žฅ๋ฉ๋‹ˆ๋‹ค(๋”ฐ๋ผ์„œ ํŠธ๋ฆฌ ๋…ธ๋“œ๊ฐ€ ์•ฝ๊ฐ„ ๊ฒน์น˜๊ฒŒ ๋จ).

@gkjohnson ๊ทธ๋Ÿฌ๋ฉด BVH ๊ตฌํ˜„์€ ์ƒ์ž ๋ชจ์–‘์— ๋”ฐ๋ผ ์ถ• ์„ ํƒ์ด ๊ฐ€๋Šฅํ•œ ์ผ์ข…์˜ ๋ถˆ๊ท ํ˜• Kd-ํŠธ๋ฆฌ์ž…๋‹ˆ๋‹ค. ๋งž์ฃ ? ๊ทธ๋ ‡๋‹ค๋ฉด ๋ฃจํŠธ BB๊ฐ€ ํ๋ธŒ์—์„œ ๋„ˆ๋ฌด ๋ฉ€๋ฆฌ ๋–จ์–ด์ ธ ์žˆ๋Š” ๊ฒฝ์šฐ์— ๋Œ€ํ•ด ์ด์™€ ๊ฐ™์€ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•œ ๋‹ค์Œ ์กฐ๊ฑด๋ถ€ ๋ถ„ํ•  ํ›„์— ์˜ฅํŠธ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•ด ์ƒ๊ฐํ•˜๊ณ  ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ์ดˆ๊ธฐ ๋ถ„ํ• ์ด 2๊ฐœ์˜ "์ง€๋„" ์ฐจ์›์—์„œ ์ด๋ฃจ์–ด์ง€๊ณ  ํ›„์† ๋ถ„ํ• ์ด 3D๋กœ ์ง„ํ–‰๋˜๋Š” @Usnul ์˜ ์ง€๋„ ์„ธ๊ณ„์™€ ๊ฐ™์€ ๊ฒฝ์šฐ์— ์•„๋งˆ๋„ ์ž˜ ์ ์šฉ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋ฃจํŠธ BB๋ฅผ ๊ฐ™์€ ์ค‘์‹ฌ์„ ๊ฐ€์ง„ ๊ฒฝ๊ณ„ ํ๋ธŒ๋กœ ํ™•์žฅํ•œ ๋‹ค์Œ octree ๋ถ„ํ• ์„ ๋๊นŒ์ง€ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ๋‚ด ๊ฒƒ๋ณด๋‹ค ํ›จ์”ฌ ๋” ๋‚˜์€ ์†”๋ฃจ์…˜์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

๋ฐฉ๊ธˆ PlaneBufferGeometry์—์„œ ๋ ˆ์ด์บ์ŠคํŒ…์„ ์œ„ํ•œ ๋” ๋‚˜์€ ๋ฐฉ๋ฒ•์„ ๊ตฌํ˜„ํ–ˆ์Šต๋‹ˆ๋‹ค.

@kpetrow PlaneBufferGeometry ์— ๋Œ€ํ•œ ๋ ˆ์ด์บ์ŠคํŠธ ์ตœ์ ํ™” , ๊ผญ์ง“์  ์œ„์น˜๊ฐ€ ๋ณ€๊ฒฝ๋˜์ง€ ์•Š๋Š”๋‹ค๋Š” ๊ฐ€์ •์€ ์„ ํ˜• ๊ฒ€์ƒ‰์ด ๋ถˆ์ถฉ๋ถ„ํ•œ ๊ณ ํ•ด์ƒ๋„ ์ง€์˜ค๋ฉ”ํŠธ๋ฆฌ์— ์œ ํšจํ•˜์ง€ ์•Š์„ ๊ฐ€๋Šฅ์„ฑ์ด ๋งค์šฐ ๋†’์Šต๋‹ˆ๋‹ค. ๋‚ด๊ฐ€ ๋งํ•  ์ˆ˜ ์žˆ๋Š” ํ•œ, ๊ณ ํ•ด์ƒ๋„ PlaneBufferGeometry ์˜ ์ฃผ์š” ์šฉ๋„๋Š” ํ† ํด๋กœ์ง€๋ฅผ ์œ ์ง€ํ•˜๋ฉด์„œ ์ •์ ์„ ์ด๋™ํ•˜์—ฌ ๋ชจ์–‘์„ ๋ณ€๊ฒฝํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค(์˜ˆ: ์ง€ํ˜• ๊ตฌ์ถ•).

#13909์— ์ฐฌ์„ฑํ•˜์—ฌ ๋งˆ๊ฐํ•ฉ๋‹ˆ๋‹ค.

์ด ํŽ˜์ด์ง€๊ฐ€ ๋„์›€์ด ๋˜์—ˆ๋‚˜์š”?
0 / 5 - 0 ๋“ฑ๊ธ‰