Three.js: CSG(Constructive Solid Geometry) ์ง€์›

์— ๋งŒ๋“  2019๋…„ 03์›” 29์ผ  ยท  56์ฝ”๋ฉ˜ํŠธ  ยท  ์ถœ์ฒ˜: mrdoob/three.js

CSG๋Š” ๋งค์šฐ ์ค‘์š”ํ•œ ๊ธฐ๋Šฅ์ž…๋‹ˆ๋‹คโ€ฆ ๋‹ค๋ฅธ 3D ํ”„๋ ˆ์ž„์›Œํฌ๋Š” CSG ๋‚ด์žฅ( Babylon.js )์„ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค. ๋‚ด๊ฐ€ ์ฐพ์„ ์ˆ˜ ์žˆ๋Š” ์œ ์ผํ•œ CSG๋Š” 7๋…„ ๋œ ์˜ค๋ž˜๋œ ํ”Œ๋Ÿฌ๊ทธ์ธ( https://github.com/chandlerprall/ThreeCSG )์ž…๋‹ˆ๋‹ค.

์ด ํ”Œ๋Ÿฌ๊ทธ์ธ์ด bufferGeometry์šฉ์œผ๋กœ ์—…๋ฐ์ดํŠธ๋˜๊ณ  CSG ์ง€์›์„ ์œ„ํ•œ ๊ณต์‹ ํ”Œ๋Ÿฌ๊ทธ์ธ์œผ๋กœ three.js ์ฝ”๋“œ ๋ฒ ์ด์Šค์— ์ถ”๊ฐ€๋  ๊ฒƒ์„ ์ œ์•ˆํ•ฉ๋‹ˆ๋‹ค.

๋‚˜๋Š” ์ด๊ฒƒ์„ ๋ณด๊ธฐ ์œ„ํ•ด ๊ธฐ๊ธˆ์„ ๊ธฐ๋ถ€ํ•  ์šฉ์˜๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

Enhancement

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

๋‚˜๋Š” ๋‚˜์ค‘์— ์œ ์šฉํ•˜๊ฒŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” madebyevan CSG ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์˜ ๋˜ ๋‹ค๋ฅธ ๋ณ€ํ™˜์„ ์ˆ˜ํ–‰ํ–ˆ์Šต๋‹ˆ๋‹ค. ํ˜„์žฌ 3๊ฐœ(103)์—์„œ ์ž‘๋™ํ•˜๋ฉฐ ์ด์ „ ๋ชจ๋“ˆ์—์„œ ๋ฐœ์ƒํ–ˆ๋˜ ๋ช‡ ๊ฐ€์ง€ ๋ฌธ์ œ๋ฅผ ์ˆ˜์ •ํ–ˆ์Šต๋‹ˆ๋‹ค. ๋ฒ„ํผ ์ง€์˜ค๋ฉ”ํŠธ๋ฆฌ๋ฅผ ํ—ˆ์šฉํ•˜์ง€๋งŒ ๋‚ด๋ถ€์ ์œผ๋กœ ์ง€์˜ค๋ฉ”ํŠธ๋ฆฌ๋กœ ๋ณ€ํ™˜ํ•ด์•ผ๋งŒ ํ•ฉ๋‹ˆ๋‹ค.

https://github.com/manthrax/THREE-CSGMesh

์ด๊ฒƒ์ด ๋ˆ„๊ตฐ๊ฐ€๋ฅผ ๋•๊ณ  ํ”ผ๋“œ๋ฐฑ/์ œ์•ˆ์„ ์ž์œ ๋กญ๊ฒŒ ์ œ๊ณตํ•˜๊ธฐ๋ฅผ ๋ฐ”๋ž๋‹ˆ๋‹ค.

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

์ด๋ฒˆ ์ฃผ๋ง์— ์‹œ๋„ํ•ด ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค... ์–ด๋–ป๊ฒŒ ๋˜๋Š”์ง€ ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

์Œ, OrbitControls๋ฅผ ์ถ”๊ฐ€ํ–ˆ๊ณ  ๊ฒฐ๊ณผ๋ฅผ ๊ฒ€์‚ฌํ–ˆ๋Š”๋ฐ ๊ทธ๋‹ค์ง€ ์ •ํ™•ํ•˜์ง€ ์•Š์€ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ์ด ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๊ฐ€ ์ถฉ๋ถ„ํžˆ ํ…Œ์ŠคํŠธ๋˜์—ˆ์Šต๋‹ˆ๊นŒ?
'๋ฒ„ํผ๋ผ์ด์ฆˆ'ํ•˜๊ธฐ ์ „์— ๋ช‡ ๊ฐ€์ง€ ํ…Œ์ŠคํŠธ๋ฅผ ํ•ด๋ณด์„ธ์š” ๐Ÿ˜‰
image

ํ•ต์‹ฌ ์ฝ”๋“œ ๊ธฐ๋ฐ˜์— ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ์€ ์•ฝ๊ฐ„ ๋ณต์žกํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํ˜„์žฌ ๋ฒ„์ „( v1 branch )์€ TypeScript์— ์žˆ์Šต๋‹ˆ๋‹ค. r100 (์‹ฌ์ง€์–ด r103 )์™€๋„ ์ž˜ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค: ์˜ˆ

src/ ํด๋”์— ๋ฌถ๋Š” ๊ฒƒ์ด ์˜ฌ๋ฐ”๋ฅธ ๋ฐฉํ–ฅ์ด๋ผ๊ณ  ์ƒ๊ฐํ•˜์ง€ ์•Š์ง€๋งŒ BufferGeometry๋ฅผ ์ง€์›ํ•˜๋„๋ก ์—…๋ฐ์ดํŠธํ•˜๋Š” ๊ฒƒ์€ ์œ ๋งํ•œ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๊ฐ€ ์ž˜ ํ…Œ์ŠคํŠธ๋˜์—ˆ๋Š”์ง€ ์—ฌ๋ถ€๋Š” ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค. :)

ํ•ต์‹ฌ ์ฝ”๋“œ ๊ธฐ๋ฐ˜์— ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ์€ ์•ฝ๊ฐ„ ๋ณต์žกํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํ˜„์žฌ ๋ฒ„์ „( v1 branch )์€ TypeScript์— ์žˆ์Šต๋‹ˆ๋‹ค. r100 (์‹ฌ์ง€์–ด r103 )์™€๋„ ์ž˜ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค: ์˜ˆ

๊ทธ๋ž˜์„œ ์ ๊ทน์ ์œผ๋กœ ๊ฐœ๋ฐœํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” ๊ทธ ํƒœ๊ทธ๋ฅผ ๋ณด์ง€ ๋ชปํ–ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ ... v1 ํƒœ๊ทธ๊ฐ€ BufferGeometry๋ฅผ ์ง€์›ํ•˜๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค! @ThreeDfish

๋‚˜๋Š” ์ด ๋ฆฌํฌ์ง€ํ† ๋ฆฌ์— CSG ๊ธฐ๋Šฅ์„ ํฌํ•จํ•˜์ง€ ์•Š๊ธฐ๋กœ ํˆฌํ‘œํ•ฉ๋‹ˆ๋‹ค. ํ•„์š”ํ•œ ๊ฒฝ์šฐ ๋” ๋‚˜์€ ThreeCSG ๊ฐ€ ์ง€์›๋ฉ๋‹ˆ๋‹ค.

๊ทธ๋ž˜์„œ ์ ๊ทน์ ์œผ๋กœ ๊ฐœ๋ฐœํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” ๊ทธ ํƒœ๊ทธ๋ฅผ ๋ณด์ง€ ๋ชปํ–ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ ... v1 ํƒœ๊ทธ๊ฐ€ BufferGeometry๋ฅผ ์ง€์›ํ•˜๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค! @ThreeDfish

๋‚˜๋Š” ๊ทธ๋ ‡๊ฒŒ ์ƒ๊ฐํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ v1 ๋ฒ„์ „์—์„œ BufferGeometry ์— ๋Œ€ํ•œ

function convertGeometryToTriangles(geometry) {
        if (isBufferGeometry(geometry)) {
            throw new Error('threecsg: Only Three.Geometry is supported.');
        }

๋ˆ„๊ตฌ๋“ ์ง€ ThreeCSG ์†Œ์œ ์ž์—๊ฒŒ ์—ฐ๋ฝํ•˜์—ฌ ๊ณ„ํš์ด ๋ฌด์—‡์ธ์ง€ ํ™•์ธํ•˜๊ฑฐ๋‚˜ BufferGeometry๋ฅผ ์ง€์›ํ•˜๊ธฐ ์œ„ํ•ด PR์„ ๋ฐ›์„ ์˜์‚ฌ๊ฐ€ ์žˆ๋Š”์ง€ ํ™•์ธํ•ด๋ณธ ์‚ฌ๋žŒ์ด ์žˆ์Šต๋‹ˆ๊นŒ? ์ €๋„ ์ด๊ฒƒ์— ์•ฝ๊ฐ„ ๊ด€์‹ฌ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

์•„๋ฌด๋„ BufferGeometry์— ๋Œ€ํ•ด ๋ฌป์ง€ ์•Š์€ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค ...

๋Œ€ํ™”๋ฅผ https://github.com/chandlerprall/ThreeCSG ๋กœ @chandlerprall ์ด ๊ทธ์˜ ํ”„๋กœ์ ํŠธ์— ๊ด€์‹ฌ์„ ๊ฐ–๊ฒŒ ๋˜์–ด ๊ธฐ์  ๊ฒƒ์ž…๋‹ˆ๋‹ค ๐Ÿ˜Š

FWIW์—๋Š” ์™„์ „ํ•œ ์žฌ์ž‘์„ฑ ๋ฐ ์ •๋ฆฌ์ธ ThreeCSG์˜ ์ตœ์‹  v1 ๋ถ„๊ธฐ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ํ‰๋ฉด ์„ ํƒ๊ธฐ ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์ตœ์ ํ™”ํ•ด์•ผ npm ๊ฒŒ์‹œํ•  ์ค€๋น„๊ฐ€ ๋ฉ๋‹ˆ๋‹ค. ์ถ”๊ฐ€ ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•˜๊ณ  ์‹ถ์€ ์‚ฌ๋žŒ์ด ์žˆ๋‹ค๋ฉด ๊ธฐ์  ๊ฒƒ์ž…๋‹ˆ๋‹ค(https://github.com/chandlerprall/ThreeCSG/issues/51 ์ฐธ์กฐ).

๊ท€ํ•˜์˜ ์ •๋ณด:

https://github.com/chandlerprall/ThreeCSG ์™ธ์—๋„ ๋‹ค์Œ CSG ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๊ฐ€ ์ตœ๊ทผ Discourse ํฌ๋Ÿผ ์Šค๋ ˆ๋“œ์—์„œ ์–ธ๊ธ‰๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

์ด ์„ธ ๊ฐ€์ง€ ์ค‘ ์–ด๋Š ๊ฒƒ์ด three.js์˜ CSG ์ง€์›์„ ์œ„ํ•œ ๊ธฐ๋ฐ˜์ด ๋˜์–ด์•ผ ํ•˜๋Š”์ง€์— ๋Œ€ํ•ด์„œ๋Š” ์˜๊ฒฌ์ด ์—†์Šต๋‹ˆ๋‹ค.

๋‚˜๋Š” ๋‚˜์ค‘์— ์œ ์šฉํ•˜๊ฒŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” madebyevan CSG ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์˜ ๋˜ ๋‹ค๋ฅธ ๋ณ€ํ™˜์„ ์ˆ˜ํ–‰ํ–ˆ์Šต๋‹ˆ๋‹ค. ํ˜„์žฌ 3๊ฐœ(103)์—์„œ ์ž‘๋™ํ•˜๋ฉฐ ์ด์ „ ๋ชจ๋“ˆ์—์„œ ๋ฐœ์ƒํ–ˆ๋˜ ๋ช‡ ๊ฐ€์ง€ ๋ฌธ์ œ๋ฅผ ์ˆ˜์ •ํ–ˆ์Šต๋‹ˆ๋‹ค. ๋ฒ„ํผ ์ง€์˜ค๋ฉ”ํŠธ๋ฆฌ๋ฅผ ํ—ˆ์šฉํ•˜์ง€๋งŒ ๋‚ด๋ถ€์ ์œผ๋กœ ์ง€์˜ค๋ฉ”ํŠธ๋ฆฌ๋กœ ๋ณ€ํ™˜ํ•ด์•ผ๋งŒ ํ•ฉ๋‹ˆ๋‹ค.

https://github.com/manthrax/THREE-CSGMesh

์ด๊ฒƒ์ด ๋ˆ„๊ตฐ๊ฐ€๋ฅผ ๋•๊ณ  ํ”ผ๋“œ๋ฐฑ/์ œ์•ˆ์„ ์ž์œ ๋กญ๊ฒŒ ์ œ๊ณตํ•˜๊ธฐ๋ฅผ ๋ฐ”๋ž๋‹ˆ๋‹ค.

@manthrax ๊ท€ํ•˜์˜ ํ”„๋กœ์ ํŠธ๋Š” three.js ํฌ๋Ÿผ์˜ ๋‹ค์Œ ์Šค๋ ˆ๋“œ์— ์ถ”๊ฐ€๋˜๋ฉด ํ”Œ๋Ÿฌ๊ทธ์ธ์„ ์ฐพ๋Š” ์‚ฌ๋žŒ๋“ค์ด ์‹ค์ œ๋กœ ์ฐพ์„ ์ˆ˜ ์žˆ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค๐Ÿ‘

https://discourse.threejs.org/t/looking-for-updated-plug-in-for-csg/6785

์—„์ฒญ๋‚œ! ์–ผ๋งˆ๋‚˜ ์‹คํ˜„ ๊ฐ€๋Šฅํ•œ์ง€๋Š” ์ž˜ ๋ชจ๋ฅด๊ฒ ์ง€๋งŒ, ํ˜„์žฌ ๋งŽ์€ ์—”์ง„ ํŽธ์ง‘์ž๋“ค์ด ๊ฐ€์ง€๊ณ  ์žˆ๋Š” ๊ฒƒ๊ณผ ๊ฐ™์€ ์„ฑ๋Šฅ๊ณผ ์‹ค์‹œ๊ฐ„ ํŽธ์ง‘ ๊ธฐ๋Šฅ์„ ๋ณด์—ฌ์ฃผ๋Š” ๋ช‡ ๊ฐ€์ง€ ์˜ˆ์—์„œ ์ด๋Ÿฌํ•œ ์†”๋ฃจ์…˜์ด ๋„์›€์ด ๋  ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

๋‚ด ๊ฐœ์ธ์ ์ธ ์„ ํ˜ธ๋Š” CSG๋ฅผ โ€‹โ€‹๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์—์„œ ์ œ์™ธํ•˜๊ณ  ๋…๋ฆฝ์ ์œผ๋กœ ๊ฐœ๋ฐœํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋‚˜๋Š” ์ด๊ฒƒ์— ๋™์˜ํ•˜์ง€๋งŒ "๊ด€๋ จ ๋ฆฌํฌ์ง€ํ† ๋ฆฌ"์˜ ๊ณต์‹ ์„ธํŠธ๋ฅผ ๊ฐ–๋Š” ๊ฒƒ์ด ์œ ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๊ฐ€ ๊ณ„์† ์ง„ํ–‰ํ•˜๊ธฐ๋กœ ๊ฒฐ์ •ํ•˜๋ฉด ์ด๋ฅผ ์œ„ํ•ด ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ์กฐ์ง์„ ๋งŒ๋“ค์—ˆ์Šต๋‹ˆ๋‹ค. github.com/threejs ์€ @enricomarino ๊ฐ€ ๊ฐ€์ ธ๊ฐ”์ง€๋งŒ github.com/three-js ์ด(๊ฐ€) ๊ฑฐ๊ธฐ์— ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” ์†Œ์œ ๊ถŒ์„ ๋ˆ„๊ตฌ์—๊ฒŒ๋‚˜ ์–‘๋„ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ด๋ฆ„์— ๋›ฐ์–ด๋“œ๋Š” ๊ฒƒ์ด ์ข‹๋‹ค๊ณ  ์ƒ๊ฐํ–ˆ์Šต๋‹ˆ๋‹ค!

๋”ฐ๋ผ์„œ ์ด ์กฐ์ง์€ ์—ฌ๊ธฐ์— ์ ํ•ฉํ•˜์ง€ ์•Š์€ three.js์™€ ๊ด€๋ จ๋œ ํ”„๋กœ์ ํŠธ๋ฅผ ๋งŒ๋“ค๊ณ ์ž ํ•˜๋Š” ๋ชจ๋“  ์‚ฌ๋žŒ์ด ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

https://github.com/three-js

์ €๋Š” three.js์™€ ๊ด€๋ จ๋œ ํ”„๋กœ์ ํŠธ๋ฅผ ํ˜ธ์ŠคํŒ…ํ•˜๊ธฐ ์œ„ํ•ด https://github.com/threejs ๋ผ๋Š” ์กฐ์ง์„ ๋งŒ๋“ค์—ˆ์Šต๋‹ˆ๋‹ค.

์‚ฌ์‹ค ๋‹น์‹œ์—๋Š” "three.js" ๋ชจ๋…ธ ๋ ˆํฌ๋ฅผ ์—ฌ๋Ÿฌ ๋ ˆํฌ๋กœ ๋‚˜๋ˆŒ ์ƒ๊ฐ์ด์—ˆ๋Š”๋ฐ,
"threejs/core", "treejs/examples", "threejs/editor", "threejs/docs",
"mrdoob/three.js"๊ฐ€ ๋‹ค์šด๋กœ๋“œํ•˜๊ธฐ์— ๋งค์šฐ ํฌ๊ณ  ๋ฌด๊ฑฐ์›Œ์กŒ๊ธฐ ๋•Œ๋ฌธ์—...
๊ทธ๋Ÿฌ๋‚˜ ์ด๊ฒƒ์€ ๋‹ค๋ฅธ ์ด์•ผ๊ธฐ์ž…๋‹ˆ๋‹ค ...

๋‹น์‹ ์ด ๊ทธ๊ฒƒ์„ ์‚ฌ์šฉํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด ์กฐ์ง์€ ๋‹น์‹ ์˜ ์ฒ˜๋ถ„์— ์žˆ์Šต๋‹ˆ๋‹ค!

๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์— ๋ฐ๋ชจ์™€ ์Šคํฌ๋ฆฐ์ƒท์„ ์ถ”๊ฐ€ํ–ˆ์Šต๋‹ˆ๋‹ค.

https://github.com/manthrax/THREE-CSGMesh

๋„์›€์ด ํ•„์š”ํ•œ ์‚ฌ๋žŒ์ด ์žˆ์œผ๋ฉด ์•Œ๋ ค์ฃผ์„ธ์š”!

@yomboprime @ThreeDfish
ํฌํŒ…ํ•œ CSG ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์— ์Šคํฌ๋ฆฐ์ƒท๊ณผ ๋ฐ๋ชจ๋ฅผ ์ถ”๊ฐ€ํ–ˆ์Šต๋‹ˆ๋‹ค. ์œ ์šฉํ•˜๋‹ค๊ณ  ์ƒ๊ฐ๋˜๋ฉด ์•Œ๋ ค์ฃผ์‹ญ์‹œ์˜ค.
https://github.com/manthrax/THREE-CSGMesh

@yomboprime @ThreeDfish
ํฌํŒ…ํ•œ CSG ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์— ์Šคํฌ๋ฆฐ์ƒท๊ณผ ๋ฐ๋ชจ๋ฅผ ์ถ”๊ฐ€ํ–ˆ์Šต๋‹ˆ๋‹ค. ์œ ์šฉํ•˜๋‹ค๊ณ  ์ƒ๊ฐ๋˜๋ฉด ์•Œ๋ ค์ฃผ์‹ญ์‹œ์˜ค.
https://github.com/manthrax/THREE-CSGMesh

@ThreeDfish ๊ทธ๋ž˜๋„ ๊ด€์‹ฌ์ด ์žˆ๋‹ค๋ฉด ์ด ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์—์„œ CSG.toBufferGeometry ํ•จ์ˆ˜๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. CSG๋Š” ์—ฌ์ „ํžˆ Geometry๋ฅผ ์ž…๋ ฅ์œผ๋กœ ํ—ˆ์šฉํ•˜์ง€๋งŒ ์ถœ๋ ฅ์€ Geometry(์ถ”๊ฐ€ ๋ถ€์šธ ์—ฐ์‚ฐ์˜ ๊ฒฝ์šฐ) ๋˜๋Š” BufferGeometry(๋ Œ๋”๋ง์„ ์œ„ํ•œ ์ตœ์ข… ์ถœ๋ ฅ)์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
@manthrax ๋Š” ์–ด๋–ป๊ฒŒ ์ƒ๊ฐ

@enricomarino github.com/threejs์— ๋Œ€ํ•œ ์•ก์„ธ์Šค ๊ถŒํ•œ์„ ์ค„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ? LWOLoader ๋Œ€ํ•œ ํ…Œ์ŠคํŠธ ๋ชจ๋ธ๋กœ ๋ฆฌํฌ์ง€ํ† ๋ฆฌ๋ฅผ ์„ค์ •ํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค. ๐Ÿ˜› ์—ฐ๋ฝ์ฒ˜๋ฅผ ์ฐพ๊ธฐ ํž˜๋“  ๋ถ„์ด์‹œ๊ตฐ์š”.

@yomboprime ๋ญ˜ ๋ฌผ์–ด

๋‚ด๊ฐ€ ํฌํŒ…ํ•œ ๋ฒ„์ „์€ BufferGeometry ๋˜๋Š” Geometry ๋ฉ”์‰ฌ๋ฅผ ๋ชจ๋‘ ํ—ˆ์šฉํ•ฉ๋‹ˆ๋‹ค. BufferGeometry๋กœ ๋ณ€ํ™˜ํ•  ์ˆ˜ ์žˆ๋Š” Geometry๋ฅผ ์ถœ๋ ฅํ•ฉ๋‹ˆ๋‹ค.

mesh.geometry = new THREE.BufferGeometry().fromGeometry(mesh.geometry)

๊ทธ๋ž˜์„œ ๋ณ€ํ™˜์ด ๋งค์šฐ ๊ฐ„๋‹จํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ถ”๊ฐ€ ๋„์šฐ๋ฏธ ๊ธฐ๋Šฅ์ด ์ •๋ง๋กœ ํ•„์š”ํ•œ์ง€ ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค.

Geometry -> BufferGeometry ๋ณ€ํ™˜์€ ๋ถˆํ–‰ํžˆ๋„ ์†์‹ค์ด ๋งค์šฐ ํฝ๋‹ˆ๋‹ค. (ํฐ์ƒ‰) ๊ผญ์ง“์  ์ƒ‰์ƒ์„ ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ ์™ธ์—๋„ ์ธ๋ฑ์Šค๋œ ์ง€์˜ค๋ฉ”ํŠธ๋ฆฌ๋ฅผ ์ธ๋ฑ์Šค ํ•ด์ œํ•˜๊ณ  ๊ผญ์ง“์  ์ˆ˜๋ฅผ ๋Š˜๋ฆฝ๋‹ˆ๋‹ค. BufferGeometry๋กœ ์ตœ์ข… ์ถœ๋ ฅํ•˜๋Š” ๊ฒƒ์ด ์ด์ƒ์ ์ผ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

CSG ์ž‘์—…์€ ์ธ๋ฑ์‹ฑ์— ๋Œ€ํ•ด ์‹ ๊ฒฝ ์“ฐ์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ์€ ๋ฌด์—‡์ด๋“  ์ƒ๊ด€์—†์ด ์‚ผ๊ฐํ˜•๋‹น 3๊ฐœ์˜ ๊ณ ์œ ํ•œ ๋ฒ„ํ…์Šค์—์„œ ์ž‘๋™ํ•˜๊ณ  ์ถœ๋ ฅํ•ฉ๋‹ˆ๋‹ค.

๋˜ํ•œ ์ •์  ์ƒ‰์ƒ์„ ์ฒ˜๋ฆฌํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๊ฒฐ๊ณผ ๋ฉ”์‰ฌ๋ฅผ ์ตœ์ ํ™”ํ•˜๋Š” ๊ฒƒ์€ ๋‹ค๋ฅธ ๋„๊ตฌ/๋„์šฐ๋ฏธ ๊ธฐ๋Šฅ์ธ imho๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ๊ฑฐ๋‚˜ ์ˆ˜ํ–‰ํ•ด์•ผ ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด ์‹ค์ œ๋กœ ๋ณ„๋„์˜ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์— ์žˆ์–ด์•ผ ํ•˜๋Š” ๋ฉ์ฒญํ•œ ๊ธฐ๋Šฅ์„ ๋ณต์ œํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

THREE.js์—์„œ ์ง€์˜ค๋ฉ”ํŠธ๋ฆฌ๋ฅผ ์ตœ์ ํ™”ํ•˜๊ธฐ ์œ„ํ•œ ์œ ํ‹ธ๋ฆฌํ‹ฐ ์ธก๋ฉด์—์„œ ๋ถ„๋ช…ํžˆ ๊ณต๊ฐ„์ด ์žˆ๋‹ค๋Š” ๋ฐ ๋™์˜ํ•ฉ๋‹ˆ๋‹ค. ๋ฌธ์ œ๋Š” BufferGeometry ์ด์ƒ์— ์ ์šฉ๋ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๋Ÿฐํƒ€์ž„์— js๋ฅผ ํ†ตํ•ด ๋Œ€ํ˜• ๋ฒ„ํผ์— ์ตœ์ ํ™”๋ฅผ ์ ์šฉํ•˜๋Š” ๊ฒƒ์€ ๋ณต์žกํ•œ ์ž‘์—…์ž…๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๋ณต์žก์„ฑ์„ ์ค„์ด๊ธฐ ์œ„ํ•ด ์ ์šฉํ•˜๋Š” ๋ชจ๋“  ๊ธฐ์ˆ (์˜ˆ: octtree/kdtree ๋ฌด์—‡์ด๋“  .. ๊ฝค ๋นจ๋ฆฌ ๋ณต์žกํ•ด์ง€๊ณ  ์ž์ฒด ๋งค๊ฐœ๋ณ€์ˆ˜ํ™” ์„ธํŠธ๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

์ฝ”๋“œ "๋ณต์žก์„ฑ/์œ ์—ฐ์„ฑ/์œ ํ‹ธ๋ฆฌํ‹ฐ"์™€ "gpu์— ์ตœ์ ํ™”๋œ ์šธํŠธ๋ผ ์ตœ์ ํ™”" ์‚ฌ์ด์—๋Š” ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๊ฐ€ ์•„๋‹Œ ์„ค์ •์—์„œ๋Š” ํ›„์ž์— ์ตœ์ ํ™”๋˜์ง€๋งŒ js/์›น ์‹œ๋‚˜๋ฆฌ์˜ค์—์„œ๋Š” ์ „์ž์ด๊ณ  ํ›„์ž๋ฅผ ์ถ”๊ตฌํ•ด์•ผ ํ•œ๋‹ค๊ณ  ๊ฒฐ์ •ํ•œ ๊ฒฝ์šฐ์—๋งŒ wabasm๊ณผ ๊ฐ™์€ ๊ฒƒ์„ ์‚ฌ์šฉํ•˜์—ฌ ๋ฐ์ดํ„ฐ๋ฅผ ์ฒ˜๋ฆฌํ•ฉ๋‹ˆ๋‹ค.

๋งํ•  ๊ฒƒ๋„ ์—†์ด ์ด๋Ÿฌํ•œ CSG ์ž‘์—…์€ ์ด๋ฏธ ๊ฝค ๋Š๋ฆฝ๋‹ˆ๋‹ค. ๋‚ด git์˜ ๋ฐ๋ชจ๋Š” ์ƒ์ž์™€ 8๊ฐœ์˜ ํ•˜์œ„ ์˜์—ญ์—์„œ ํ”„๋ ˆ์ž„๋‹น 10๊ฐœ์˜ ์ž‘์—…์œผ๋กœ ๊ฑฐ์˜ ์ƒํ˜ธ ์ž‘์šฉํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค...

์ฆ‰.. ๋ฐฉ๊ธˆ babylon csg ๋ฐ๋ชจ๋ฅผ ๋ณด์•˜๊ณ  .. ์ •ํ™•ํžˆ ๋™์ผํ•œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์˜ ํฌํŠธ๋ผ๊ณ  ํ™•์‹ ํ•ฉ๋‹ˆ๋‹ค.
๊ทธ๋ฆฌ๊ณ  ๊ทธ ๋ฐ๋ชจ์—์„œ๋„ ์‹ค์‹œ๊ฐ„์œผ๋กœ ์ˆ˜ํ–‰๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
https://www.babylonjs.com/demos/csg/

๋‹ค์Œ์€ ์‹ค์‹œ๊ฐ„์œผ๋กœ ๋” ๊ฐ„๋‹จํ•œ ์˜ˆ์ œ๋ฅผ ์ˆ˜ํ–‰ํ•˜์—ฌ ๋ณ€ํ™˜ํ•œ ๋ฒ„์ „์ž…๋‹ˆ๋‹ค.

http://vectorslave.com/csg/CSGDemo.html

๋‚˜๋Š” CSG ์ž‘์—…์ด ํŠนํžˆ ์‹ค์‹œ๊ฐ„ ์นœํ™”์ ์ด์ง€ ์•Š์œผ๋ฉฐ ๋„์„œ๊ด€์ด ๊ทธ๋Ÿฐ ์ฒ™ ํ•  ํ•„์š”๊ฐ€ ์—†๋‹ค๋Š” ๋ฐ ๋™์˜ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ Geometry๋Š” ๊ฒฐ๊ตญ three.js ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์—์„œ ์ œ๊ฑฐ๋˜๊ณ  examples/js/* ๋ฐ examples/jsm/* ๋ฉ๋‹ˆ๋‹ค. ๊ทธ ์‹œ์ ์—์„œ ์‚ฌ์šฉ์ž๋Š” ๊ฒฐ๊ณผ์ ์œผ๋กœ BufferGeometry๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ๋” ์‰ฌ์šธ ๊ฒƒ์ž…๋‹ˆ๋‹ค. CSG ์ฝ”๋“œ์— Geometry์— ๋Œ€ํ•œ ๋‚ด๋ถ€ ์ข…์†์„ฑ์ด ์žˆ๋Š” ๊ฒฝ์šฐ์—๋Š” ๋‹น์—ฐํžˆ ๊ดœ์ฐฎ์•„ ๋ณด์ž…๋‹ˆ๋‹ค.

์ด๋ ‡๊ฒŒ ๋งํ• ํ…๋ฐ...

๋‹น์‹ ์ด ์ž…๋ ฅ, ์ฒด์ธ ์šด์˜ํ•˜๋ ค๋ฉด Geometry ์ถœ๋ ฅํ•˜๋Š” Geometry CSG๋Š” ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ์—์„œ๋งŒ ์ž‘๋™ํ•˜๊ธฐ ๋•Œ๋ฌธ์—, ์˜๋ฏธ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ Geometry ๋Š” ๊ณง ๋” ์ด์ƒ ๋ Œ๋”๋งํ•  ์ˆ˜ ์—†์œผ๋ฏ€๋กœ ์ตœ์ข… ๋‹จ๊ณ„์—์„œ ์ถœ๋ ฅ์„ BufferGeometry ๋กœ ๋ณ€ํ™˜ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

@manthrax QuickHull ๊ตฌํ˜„์€ ๊ณ ์œ ํ•œ ํด๋ž˜์Šค ์ง‘ํ•ฉ์„ ์‚ฌ์šฉํ•˜๋ฏ€๋กœ ํ† ํด๋กœ์ง€ ์ž‘์—…์„ ๋” ์‰ฝ๊ฒŒ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ํ•˜ํ”„ ์—์ง€ ๊ตฌํ˜„์€ ์ด ์ปจํ…์ŠคํŠธ์—์„œ Geometry ๋กœ ์ž‘์—…ํ•˜๋Š” ๊ฒƒ๋ณด๋‹ค ํ›จ์”ฌ ๋‚ซ์Šต๋‹ˆ๋‹ค. Geometry ๋Š” ๋ Œ๋”๋ง์— ์ค‘์ ์„ ๋‘๊ณ  ์žˆ์œผ๋ฏ€๋กœ CSG์—์„œ๋„ ๋‹ค๋ฅธ ์œ ํ˜•์˜ ํด๋ž˜์Šค๊ฐ€ ๋” ์ž˜ ์ž‘๋™ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

ํ”ผ๋“œ๋ฐฑ @donmccurdy @WestLangley @Mugen87์— ๊ฐ์‚ฌ
Geometry ์ง€์› ์ค‘๋‹จ์— ๋Œ€๋น„ํ•˜์—ฌ BufferGeometry์™€ ํ•จ๊ป˜ ๊ธฐ๋ณธ์ ์œผ๋กœ ์ž‘๋™ํ•˜๋„๋ก ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์‚ดํŽด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.
๋˜ํ•œ ์ƒ‰์ƒ ๋ฐ ์žฌ๋ฃŒ/๊ทธ๋ฃน ์ง€์›๋„ ์ถ”๊ฐ€ํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค.

@enricomarino ์‚ฌ์‹ค, ๋‚˜๋Š” ๋‚ด ์‚ฌ์šฉ์ž ์ด๋ฆ„์—์„œ ๊ทธ๊ฒƒ์„ ์˜ฎ๊ธฐ๊ณ  ์ผ์„ ์กฐ๊ธˆ ๋‚˜๋ˆ„๋Š” ๊ฒƒ์„ ๊ณ ๋ คํ•˜๋ฉด์„œ ์กฐ์ง์œผ๋กœ ๋ฌด์—‡์„ ํ•  ๊ณ„ํš์ธ์ง€ ํ™•์ธํ•˜๊ธฐ ์œ„ํ•ด ๋ฉ”์‹œ์ง€๋ฅผ ๋ณด๋‚ผ ๊ณ„ํš์ด์—ˆ์Šต๋‹ˆ๋‹ค. ์–ด๋–ป๊ฒŒ ๋ณด์ผ์ง€ ์•„์ง ํ™•์‹คํ•˜์ง€ ์•Š์ง€๋งŒ ์ง€๊ธˆ์€ ์ €๋ฅผ ์กฐ์ง์— ์ถ”๊ฐ€ํ•˜์‹œ๊ฒ ์Šต๋‹ˆ๊นŒ?

@mrdoob ํ™•์‹คํžˆ!

์•ˆ๋…•ํ•˜์„ธ์š”.. CSG ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์˜ ๋” ๋ฉ‹์ง„ ๋ฐ๋ชจ๋ฅผ ๋งŒ๋“ค๊ณ  ๊ด€์‹ฌ ์žˆ๋Š” ์‚ฌ๋žŒ์ด ์žˆ์œผ๋ฉด ์ผ๋ฐ˜ ์„ธ๋Œ€์—์„œ ๋ฒ„๊ทธ๋ฅผ ์ˆ˜์ •ํ–ˆ์Šต๋‹ˆ๋‹ค.

http://vectorslave.com/csg/CSGShinyDemo.html

๊ทธ๋ฆฌ๊ณ  gh:
https://github.com/manthrax/THREE-CSGMesh

BufferGeometry ์ตœ์ ํ™” ๋ฒ„์ „๊ณผ ์ž…๋ ฅ ๊ฐ„์˜ ์žฌ๋ฃŒ ๋ถ„๋ฆฌ๋ฅผ ์œ ์ง€ํ•˜๋Š” ๊ฒƒ์„ ์ถ”๊ฐ€ํ•˜์—ฌ SCAD ์†Œํ”„ํŠธ์›จ์–ด์™€ ๊ฐ™์€ ๊ฒƒ์— ์ง์ ‘ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์ฐพ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

์˜๊ฐ์„ ์–ป๊ธฐ ์œ„ํ•ด ๊ทธ๋ฆฌ๊ณ  ๋ˆ„๊ตฐ๊ฐ€๊ฐ€ ์ •๋ง๋กœ ๊นŠ์ด ํŒŒ๊ณ  ์‹ถ์–ดํ•  ๊ฒฝ์šฐ๋ฅผ ๋Œ€๋น„ํ•˜์—ฌ ์ด ๋งํฌ๋ฅผ ์—ฌ๊ธฐ์— ๋†“์„ ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ–ˆ์Šต๋‹ˆ๋‹ค. Unity์—์„œ ์ •๋ง ์ธ์ƒ์ ์ธ ์„ฑ๋Šฅ๊ณผ ์ฝ˜ํ…์ธ  ์ƒ์„ฑ ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•˜๋Š” ์ด CSG ๋„๊ตฌ๋ฅผ ๋ฐœ๊ฒฌํ–ˆ์Šต๋‹ˆ๋‹ค.

https://assetstore.unity.com/packages/tools/modeling/realtime-csg-69542

๊ทธ๋ฆฌ๊ณ  ์ž‘์„ฑ์ž๊ฐ€ ๊ตฌํ˜„์— ๋Œ€ํ•œ ๋ช‡ ๊ฐ€์ง€ ๊ธฐ์‚ฌ๋ฅผ ์ž‘์„ฑํ•œ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค(์ด 6๊ฐœ ๋ถ€๋ถ„์ด ์žˆ์Œ).

http://sandervanrossen.blogspot.com/2010/05/realtime-csg-optimizations.html
http://sandervanrossen.blogspot.com/2010/05/realtime-csg-part-5.html

csg ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์ด์‹ํ–ˆ๊ณ  ํ˜„์žฌ ๋งค์šฐ ์ž˜ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค.
ํ•„์š”ํ•œ ๊ฒฝ์šฐ ์ด ํ”„๋กœ์ ํŠธ๋ฅผ ์—…๋ฐ์ดํŠธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

https://github.com/FishOrBear/csg.ts

์ด์— ๋Œ€ํ•œ ์—…๋ฐ์ดํŠธ๊ฐ€ ์žˆ์Šต๋‹ˆ๊นŒ?

@manthrax ์˜ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋Š” ์™„๋ฒฝํ•˜๊ฒŒ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค!

@๋งŒ์Šค๋ฝ์Šค

BufferGeometry ์ตœ์ ํ™” ๋ฒ„์ „์„ ์ถ”๊ฐ€ํ•˜๋ ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค.

ํ˜„์žฌ THREE.Geometry ๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๊นŒ?

๊ทธ๋ž˜์„œ ๋‚˜๋Š” ๊ทธ๊ฒƒ์„ ์‰ฌ๊ฒŒ ํ•  ์ˆ˜ ์—†์—ˆ๊ณ  https://openjscad.org/ ์˜ ํ•ต์‹ฌ CSG ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์ธ https://github.com/jscad/csg.js๋ฅผ ์‚ดํŽด๋ณด์•˜์Šต๋‹ˆ๋‹ค.
๋‚˜๋Š” ๊ทธ๊ฒƒ์„ ๋ธŒ๋ผ์šฐ์ €ํ™”ํ•˜๊ณ  ๋‚ด ์ž์‹ ์˜ 3๊ฐœ์˜ BufferGeometry ์–ด๋Œ‘ํ„ฐ๋ฅผ ์ž‘์„ฑํ–ˆ์œผ๋ฉฐ ์‹ค์ œ๋กœ @manthrax๊ฐ€ ๊ทธ์˜ ์ฝ”๋“œ๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ณด๋‹ค ํ›จ์”ฌ ๋น ๋ฆ…๋‹ˆ๋‹ค. (๊ทธ๋ฆฌ๊ณ  ๊ผญ์ง“์  ์ฑ„์ƒ‰์„ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค)

32๊ฐœ์˜ ๋ฉด์„ ๊ฐ€์ง„ ๊ตฌ์ฒด๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ˆˆ์„ ์ž๋ฅด๋Š” ๋™์ผํ•œ ์ฃผ์‚ฌ์œ„์˜ ๊ฒฝ์šฐ,
THREE-CSGMesh๋Š” 112์ดˆ๊ฐ€ ๊ฑธ๋ ธ๊ณ ,
jscad/csg๋Š” 2.5์ดˆ ๊ฑธ๋ ธ์Šต๋‹ˆ๋‹ค!!!

45๋ฐฐ ๋นจ๋ผ...

๋‚˜๋Š” ๊ทธ๊ฒƒ์—์„œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ๋งŒ๋“œ๋Š” ๊ฒƒ์— ๋Œ€ํ•ด ์ƒ๊ฐํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ๋‹น์‹ ์ด ๊ทธ๊ฒƒ์— ๋Œ€ํ•ด ์–ด๋–ป๊ฒŒ ์ƒ๊ฐํ•˜๋Š”์ง€ ์•Œ๋ ค์ฃผ์‹ญ์‹œ์˜ค ...

@SebiTimeWaster

์–ด๋””์„œ๋‚˜ repo์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ? csg.js๋„ MIT ๋ผ์ด์„ ์Šค์ธ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

@mrdoob

BufferGeometry ์ตœ์ ํ™” ๋ฒ„์ „์„ ์ถ”๊ฐ€ํ•˜๋ ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค.

ํ˜„์žฌ THREE.Geometry๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๊นŒ?

์ฝ”๋“œ๋ฒ ์ด์Šค๋ฅผ ๊ฐ„๋‹จํžˆ ์‚ดํŽด๋ณด๋ฉด ์˜ˆ ์ฒ˜๋Ÿผ ๋ณด์ด์ง€๋งŒ ์‚ฌ์šฉ ํ•ฉ๋‹ˆ๋‹ค.

์•„์ง ๊ด€์‹ฌ์ด ์žˆ๋‹ค๋ฉด ๋งŒ๋“ค๊ฒ ์Šต๋‹ˆ๋‹ค...

์•„์ง ๊ด€์‹ฌ์ด ์žˆ๋‹ค๋ฉด ๋งŒ๋“ค๊ฒ ์Šต๋‹ˆ๋‹ค...

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

์•„์ง ๊ด€์‹ฌ์ด ์žˆ๋‹ค๋ฉด ๋งŒ๋“ค๊ฒ ์Šต๋‹ˆ๋‹ค...

์˜ˆ, csg์— ๋Œ€ํ•œ ๊ณต์‹ ์˜ˆ์ œ/์†”๋ฃจ์…˜์€ ํ›Œ๋ฅญํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค!

์•Œ๊ฒ ์Šต๋‹ˆ๋‹ค...

๋‚˜๋Š” ๋Œ€๋ถ€๋ถ„ @evanw ์˜ ๋๋‚ฌ ์Šต๋‹ˆ๋‹ค .
์•ฝ๊ฐ„์˜ ์ •๋ฆฌ๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ์ด๋ฒˆ ์ฃผ์— ์‹œ๊ฐ„์„ ๋‚ด์„œ ์—ฌ๊ธฐ์—์„œ ๊ณต์œ ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

@mrdoob ์ด

@SebiTimeWaster ์ง€๊ธˆ๊นŒ์ง€ ๊ท€ํ•˜์˜ ์˜๊ฒฌ์„ ๋ณด์ง€ ๋ชปํ–ˆ์Šต๋‹ˆ๋‹ค. ๋” ์ฆ๊ฑฐ์šด ๊ฒƒ ๊ฐ™์•„์š” ๐Ÿ˜

@looeee ๋Š” ์ „์ฒด ํฌํŠธ์ž…๋‹ˆ๊นŒ ์•„๋‹ˆ๋ฉด ๊ทธ๋ƒฅ ๋ž˜ํผ์ž…๋‹ˆ๊นŒ? ์–ด์จŒ๋“  csg.js๋Š” CSG ์ž‘์—…์„ ์œ„ํ•ด ๋ฐ์ดํ„ฐ๋ฅผ ๋งŽ์€ ๋‚ด๋ถ€ ๊ตฌ์กฐ๋กœ ๋ณ€ํ™˜ํ•ด์•ผ ํ•˜๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๋ณด์˜€์–ด์š”. ๋งž๋‚˜์š”? ๋“ค์–ด์˜ค๊ณ  ๋‚˜๊ฐ€๋Š” ๊ธธ์— BufferGeometry๋กœ ๋˜๋Š” BufferGeometry์—์„œ ๋ณ€ํ™˜ํ•  ์ˆ˜ ์žˆ์–ด์•ผ ํ•˜๋Š” ๊ฒƒ ๊ฐ™์•˜์Šต๋‹ˆ๋‹ค.

@looeee ์—ฌ๊ธฐ ์•ˆ์˜ ์ƒˆ ์ €์žฅ์†Œ๋ฅผ ์˜๋ฏธํ•ฉ๋‹ˆ๊นŒ?
ํฅ๋ฏธ๋กญ๊ฒ ์ง€๋งŒ mrdoob์ด ์•„์ง ์ค€๋น„๋˜์ง€ ์•Š์€ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

์ด ์ €์žฅ์†Œ๊ฐ€ ์ „์ฒด CSG ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์œ ์ง€ ๊ด€๋ฆฌํ•˜๊ธฐ์— ์ ํ•ฉํ•œ ์žฅ์†Œ์ธ์ง€ ํ™•์‹ ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค... examples/js(m)/libs/ ์—์„œ CSG ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์˜ ์ถ•์†Œ๋œ ๋นŒ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์˜ˆ์ œ๋ฅผ ์ถ”๊ฐ€ํ• ๊นŒ์š”?

๊ทธ๋ž˜์„œ, ์—ฌ๊ธฐ์— ๋ชจ๋“  ๊ฒƒ์— ๋Œ€ํ•œ ๋‚˜์˜ ๊ฒฌํ•ด๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค(https://github.com/jscad/csg.js๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•จ):
https://github.com/SebiTimeWaster/three-csg
์˜ˆ๋ฅผ ๋“ค์–ด(์ŠคํŠธ๋ ˆ์Šค ํ…Œ์ŠคํŠธ):
https://sebitimewaster.github.io/three-csg/examples/example2.html

@looeee ๋™์ผํ•œ ์ŠคํŠธ๋ ˆ์Šค ํ…Œ์ŠคํŠธ๋ฅผ ๊ตฌํ˜„ํ•˜๋ฉด ์ฝ”๋“œ๋ฅผ ์„œ๋กœ ๋น„๊ตํ•˜๊ณ  ์ตœ์ ํ™”ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค...

@looeee ๋Š” ์ „์ฒด ํฌํŠธ์ž…๋‹ˆ๊นŒ ์•„๋‹ˆ๋ฉด ๊ทธ๋ƒฅ ๋ž˜ํผ์ž…๋‹ˆ๊นŒ?

๋ช‡ ๊ฐ€์ง€ ์‚ฌ์†Œํ•œ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์ด ์žˆ๋Š” csg.js์šฉ ๋ž˜ํผ์— ๋ถˆ๊ณผํ•œ ๋ถ„๊ธฐ๊ฐ€ ํ•˜๋‚˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  • ์ฝ”๋“œ๋ฅผ ๋ชจ๋“ˆํ™”
  • ํ•จ์ˆ˜ ์ด๋ฆ„์„ three.js์— ์ •๋ ฌํ•˜๊ณ  ์‚ฌ์šฉ์ž ์ •์˜ ๋ฒกํ„ฐ ํด๋ž˜์Šค ๋Œ€์‹  Vector3 ์‚ฌ์šฉํ–ˆ์Šต๋‹ˆ๋‹ค.
  • ์‚ฌ์†Œํ•œ API ๊ฐœ์„ 

๊ทธ ๋ธŒ๋žœ์น˜๋Š” ์™„์„ฑ๋˜์—ˆ๊ณ , ์กฐ๊ธˆ ์ •๋ฆฌ๋˜๋ฉด ๊ณต์œ ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜, ๊ทธ๊ฒƒ์€ ๋Š๋ฆฝ๋‹ˆ๋‹ค.

์†๋„ ๊ฐœ์„  ์ž‘์—…์„ ํ•˜๋Š” ๋‹ค๋ฅธ ์ง€์ ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ๊ฐ€๋Šฅํ•œ ํ•œ ๋งŽ์€ ์ฒ˜๋ฆฌ๋ฅผ ํ”ผํ•˜๊ธฐ ์œ„ํ•ด ์กฐ๊ธฐ ์ข…๋ฃŒ๋ฅผ ๊ณ„์‚ฐํ•˜๋Š” ๊ฒƒ๊ณผ ๊ด€๋ จํ•˜์—ฌ ์—ฌ๊ธฐ์—์„œ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ๋Š” ๋งŽ์€ ์ž‘์—…์ด ์žˆ์Šต๋‹ˆ๋‹ค.

@SebiTimeWaster , ๋‚˜๋Š” ๋‹น์‹ ์˜ ์ฝ”๋“œ๋ฅผ ๊ฐ„๋‹จํžˆ ์‚ดํŽด๋ณด์•˜๊ณ  ๋‹น์‹ ์€ ๋‚ด๊ฐ€ ์ƒ๊ฐํ•˜๋Š” ๊ฐ ํด๋ฆฌ๊ณค์— ๋Œ€ํ•ด ๊ฒฝ๊ณ„ ๊ตฌ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ด์™€ ๊ฐ™์€ ์ผ์„ ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๊นŒ? ์‹œ๊ฐ„์„ ์ฐพ์„ ๋•Œ ๋‚ด ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์˜ˆ์ œ๋ฅผ ๋‹ค์‹œ ๋งŒ๋“ค๋ ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค.

@SebiTimeWaster csg ๊ตฌํ˜„์ด ํ…์Šค์ฒ˜ ์ขŒํ‘œ๋ฅผ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

๋‹ค์Œ์€ ํ…์Šค์ฒ˜ ์ขŒํ‘œ๊ฐ€ ๋‚ด์—์„œ ์–ด๋–ป๊ฒŒ ๋ณด์ด๋Š”์ง€์ž…๋‹ˆ๋‹ค.

2020-06-08 20_20_34-Discoverthreejs com - three js CSG Demo A

๋ฆฌํฌ์ง€ํ† ๋ฆฌ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.
https://github.com/looeee/threejs-csg

์œ„์—์„œ ์„ค๋ช…ํ•œ ๊ฒƒ์ฒ˜๋Ÿผ csg.js์˜ ๋ž˜ํผ์— ๋งค์šฐ ๊ฐ€๊นŒ์šด _master_์™€ _advanced_๋ผ๋Š” ๋‘ ๊ฐ€์ง€ ๋ถ„๊ธฐ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ฑฐ๊ธฐ์—์„œ LogicalOR ๋ฐ complement ๋ฐฉ๋ฒ•์„ ์‚ฌ์šฉํ•˜์—ฌ ๋ชจ๋“  CSG ์ž‘์—…์„ ํ‘œํ˜„ํ–ˆ์Šต๋‹ˆ๋‹ค.

์กฐํ•ฉ : _(์™ผ์ชฝ || ์˜ค๋ฅธ์ชฝ)_
๋นผ๊ธฐ : _!(!์™ผ์ชฝ || ์˜ค๋ฅธ์ชฝ)_
๊ต์ฐจ : _!(!์™ผ์ชฝ || !์˜ค๋ฅธ์ชฝ)_

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

๊ทธ๋Ÿฌ๋‚˜ ๋‹ค๋ฅธ ๊ตฌํ˜„์—์„œ ๊ฐ€์žฅ ๋งŽ์ด ์‚ฌ์šฉ๋˜๋Š” ๋” ๋‚˜์€ ์ ‘๊ทผ ๋ฐฉ์‹์€ ๊ธฐํ•˜ ๋„ํ˜• ๋ฐ ์ž‘์—…์˜ BVH๋ฅผ ๋งŒ๋“ค๊ณ  ํŠธ๋ฆฌ๋ฅผ ํƒ์ƒ‰ํ•˜์—ฌ ์ตœ์ข… ๊ธฐํ•˜ ๋„ํ˜•์„ ์ƒ์„ฑํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

@SebiTimeWaster ์ง€๊ธˆ์€ ์ด๊ฒƒ์œผ๋กœ ๋” ๋‚˜์•„๊ฐ€์ง€ ์•Š๊ณ  ๋Œ€์ฒด CSG ๊ตฌํ˜„์„ ์กฐ์‚ฌํ•˜๊ธฐ๋กœ ๊ฒฐ์ •ํ–ˆ์Šต๋‹ˆ๋‹ค. ๋‚ด ์ €์žฅ์†Œ์—์„œ ์œ ์šฉํ•œ ๊ฒƒ์ด ์žˆ์œผ๋ฉด ์ž์œ ๋กญ๊ฒŒ ๊ฐ€์ ธ๊ฐˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

ํŽธ์ง‘: ์ด ํŠธ์œ—์€ ๋‚ด ๊ฐ์ •์„ ์ •ํ™•ํžˆ ์š”์•ฝํ•ฉ๋‹ˆ๋‹ค

์œ„์— ๋งํฌํ•œ Unity์šฉ Realtime CSG ํ”Œ๋Ÿฌ๊ทธ์ธ์˜ ์†Œ์Šค๊ฐ€ Github์— ๊ฒŒ์‹œ๋˜์–ด ์žˆ๊ณ  ์ด์— ๋Œ€ํ•ด ์ž์„ธํžˆ ์•Œ์•„๋ณด๋Š” ๋ฐ ๊ด€์‹ฌ์ด ์žˆ๋Š” ์‚ฌ๋žŒ์ด ์žˆ๋‹ค๋ฉด MIT ๋ผ์ด์„ ์Šค๋ฅผ ๋ฐ›์€ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

https://github.com/LogicalError/realtime-CSG-for-unity

๊ทธ๋Š” ๋˜ํ•œ ์ž์‹ ์˜ ๋ธ”๋กœ๊ทธ์— CSG ํ”Œ๋Ÿฌ๊ทธ์ธ์— ๋Œ€ํ•œ ๋ช‡ ๊ฐ€์ง€ ๊ธฐ์ˆ ์ ์ธ ๊ฒŒ์‹œ๋ฌผ์„ ๊ฐ€์ง€๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

https://sandervanrossen.blogspot.com/search?q=Realtime+CSG

์˜ฌํ•ด 3์›” CSG์— ๋Œ€ํ•œ ์ƒˆ๋กœ์šด GDC ์—ฐ์„ค๋„ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.

https://www.youtube.com/watch?v=Iqmg4gblreo

Unity์—์„œ ์ง์ ‘ ์ž‘์—…ํ•œ ๊ฒƒ์€ ์•„๋‹ˆ์ง€๋งŒ ๋™์˜์ƒ์˜ ์„ฑ๋Šฅ์€ ํ›Œ๋ฅญํ•ด ๋ณด์ž…๋‹ˆ๋‹ค.

Unity CSG๋ฅผ โ€‹โ€‹๊ธฐ๋ฐ˜์œผ๋กœ ํ•˜์ง€๋งŒ ๋…๋ฆฝ ์‹คํ–‰ํ˜• C# ์•ฑ์ธ ์ด ์•ฑ๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ์ดํ•ดํ•˜๊ธฐ ๋” ์‰ฌ์šธ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋‹ค๋งŒ ๋„ˆ๋ฌด ์˜ค๋ž˜๋˜์–ด์„œ ๊ฐœ๋ฐœ์ด ์•ˆ ๋  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

https://github.com/LogicalError/Realtime-CSG-demo

Godot ์—”์ง„์€ ๋˜ํ•œ ๋‚ด๊ฐ€ ํ…Œ์ŠคํŠธํ•œ CSG๋ฅผ โ€‹โ€‹๊ฐ€์ง€๊ณ  ์žˆ์œผ๋ฉฐ ๋งค์šฐ ๊ดœ์ฐฎ์€ ์„ฑ๋Šฅ์„ ๊ฐ€์ง€๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ๋ฌธ์„œ / ์ฝ”๋“œ .

Carve CSG ๋ฐ xcsg (Carve ์‚ฌ์šฉ) ๋ฐ Cork ๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

์—ฌ๊ธฐ์—์„œ ๊ฐ€์žฅ ์ข‹์€ ์†”๋ฃจ์…˜์€ ์ด๋Ÿฌํ•œ ๊ธฐ์กด ์†”๋ฃจ์…˜(CPP์ด๊ณ  ๋‹ค๋ฅธ ๋งŽ์€ ํŒจํ‚ค์ง€์—์„œ ์‚ฌ์šฉ๋˜๋Š” ๊ฒƒ์œผ๋กœ ๋ณด์ด๋ฏ€๋กœ Carve) ์ค‘ ํ•˜๋‚˜๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ Wasm์œผ๋กœ ๋ณ€ํ™˜ํ•˜๋Š” ๊ฒƒ์ธ์ง€ ๊ถ๊ธˆํ•ฉ๋‹ˆ๋‹ค.

์—ฌ๊ธฐ์—์„œ ๊ฐ€์žฅ ์ข‹์€ ์†”๋ฃจ์…˜์€ ์ด๋Ÿฌํ•œ ๊ธฐ์กด ์†”๋ฃจ์…˜(CPP์ด๊ณ  ๋‹ค๋ฅธ ๋งŽ์€ ํŒจํ‚ค์ง€์—์„œ ์‚ฌ์šฉ๋˜๋Š” ๊ฒƒ์œผ๋กœ ๋ณด์ด๋ฏ€๋กœ Carve) ์ค‘ ํ•˜๋‚˜๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ Wasm์œผ๋กœ ๋ณ€ํ™˜ํ•˜๋Š” ๊ฒƒ์ธ์ง€ ๊ถ๊ธˆํ•ฉ๋‹ˆ๋‹ค.

๋‚˜๋Š” emscripten์— ์ต์ˆ™ํ•˜์ง€ ์•Š์ง€๋งŒ ๊ทธ๊ฒƒ์€ ๋‚˜์œ ์ ‘๊ทผ ๋ฐฉ์‹์ฒ˜๋Ÿผ ๋“ค๋ฆฌ์ง€ ์•Š์Šต๋‹ˆ๋‹ค. Carve์™€ Cork๋Š” GPL ๋ฐ LGPL ๋ผ์ด์„ ์Šค๋ฅผ ๋ฐ›์€ ๊ฒƒ์ฒ˜๋Ÿผ ๋ณด์ด๋ฏ€๋กœ ์—ผ๋‘์— ๋‘์–ด์•ผ ํ•  ์‚ฌํ•ญ์ž…๋‹ˆ๋‹ค.

๋ถ„๋ช…ํžˆ Blender๋Š” ๋ถ€์šธ ์—ฐ์‚ฐ ๋„๊ตฌ๋ฅผ ์—…๋ฐ์ดํŠธํ–ˆ์œผ๋ฉฐ ์ด ํŠธ์œ— ์— ๋”ฐ๋ฅด๋ฉด ์ด ๋ฌธ์„œ์˜ ์ ‘๊ทผ ๋ฐฉ์‹์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

http://www.cs.columbia.edu/cg/mesh-arrangements/

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