๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
๐Ÿ–ฅ๏ธdevelop/Three.js

[Three.js] Three.js๋ฅผ ์‹œ์ž‘ํ•ด๋ณด์ž

by ํ‚ํ‚์ž‰ 2024. 10. 27.

๊ธ€๋˜๋ฅผ ์‹œ์ž‘ํ•œ ํ›„, ์“ฐ๋ฆฌ์ œ์ด์—์Šคํ•ด๋ณด์ž๋˜ ์†Œ๋ชจ์ž„์— ๊ฐ€์ž…ํ•˜์—ฌ Three.js ์Šคํ„ฐ๋””๋ฅผ ํ•˜๊ฒŒ ๋˜์—ˆ๋‹ค. ์ €๋ฒˆ์ฃผ ์ „์ฒด ์˜จ๋ณด๋”ฉ์— ์ด์–ด ์ด๋ฒˆ์ฃผ ์Šคํ„ฐ๋””์กฐ ์˜คํ”„๋ผ์ธ ๋ชจ์ž„์„ ํ–ˆ๋Š”๋ฐ, 2์ฃผ๊ฐ„์˜ Three.js ์Šคํ„ฐ๋”” ๊ธฐ๋ก์„ ํ•ด๋ณด๋ ค๊ณ ํ•œ๋‹ค.

 

 ์“ฐ๋ฆฌ์ œ์ด์—์Šคํ•ด๋ณด์ž๋˜, ์ฒซ ๋ฒˆ์งธ ์˜คํ”„๋ผ์ธ ๋ชจ์ž„

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

 

์˜คํ”„๋ผ์ธ ๋ชจ์ž„์—์„œ๋Š” "Three.js๋ž€ ๋ฌด์—‡์ธ๊ฐ€"์— ๋Œ€ํ•ด์„œ ์Šคํ„ฐ๋””์žฅ๋‹˜๊ป˜์„œ ๋ฐœํ‘œํ•ด์ฃผ์…จ๋‹ค. ๋ฐœํ‘œ์—์„œ ๊ฐ€์žฅ ๊ธฐ์–ต์— ๋‚จ๋Š” ๋‚ด์šฉ์€ CPU์™€ GPU์˜ ์ฐจ์ด์— ๋Œ€ํ•œ ์„ค๋ช…์ด์—ˆ๋‹ค. ์™œ ์ปดํ“จํ„ฐ์—์„œ ๊ทธ๋ž˜ํ”ฝ์„ ๋‹ค๋ฃจ๊ธฐ ์œ„ํ•ด GPU๋ฅผ ์จ์•ผ ํ•˜๋Š”๊ฐ€..CPU๋ฅผ ์“ฐ๋ฉด ์ตœ์‹  core i9๋ฅผ ๊ธฐ์ค€์œผ๋กœ๋„ 1์ดˆ๊ฐ„ ํ™”๋ฉด ํ‘œ์‹œ๋ฅผ ์œ„ํ•ด 76.4์ดˆ๊ฐ„ ์—ฐ์‚ฐ์ด ํ•„์š”ํ•˜๋‹ค. ๋ฐ˜๋ฉด GPU๋Š” ๋ณ‘๋ ฌ์ ์œผ๋กœ ์—ฐ์‚ฐ์„ ์ง„ํ–‰ํ•ด์„œ ๋ฆฌ์–ผํƒ€์ž„ ๋ Œ๋”๋ง์ด ๊ฐ€๋Šฅํ•˜๋‹ค. CPU์™€ GPU์˜ ๊ตฌ์กฐ๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ๋„ ์„ค๋ช…ํ•ด์ฃผ์…”์„œ, ๊ทธ๋ž˜ํ”ฝ์Šค์—์„œ GPU์˜ ์šฐ์œ„๋ฅผ ์‰ฝ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ์—ˆ๋‹ค.

 

์กฐ ์˜คํ”„๋ผ์ธ ๋ชจ์ž„ 

10์›” 25์ผ ๊ธˆ์š”์ผ์— ์กฐ๋ณ„ ๋ชจ์ž„์„ ๊ฐ€์กŒ๋‹ค. ์Šคํ„ฐ๋””์—์„œ ์ œ๊ณต๋œ ์ปค๋ฆฌํ˜๋Ÿผ์„ ๋ฐ”ํƒ•์œผ๋กœ, ๋จผ์ € ๊ฐœ์ธ ๊ณต๋ถ€๋ฅผ ์ง„ํ–‰ํ•œ ๋’ค ์กฐ๋ณ„๋กœ ๋ชจ์—ฌ ๋‚ด์šฉ์„ ๊ณต์œ ํ–ˆ๋‹ค. 

 

์กฐ์› ์ค‘ ์Šคํ„ฐ๋””์žฅ๋‹˜์ด ๊ณ„์„œ์„œ ๊ฑฐ์˜ ๊ณผ์™ธ ๋ฐ›๋Š” ์ˆ˜์ค€์œผ๋กœ ์„ธ์„ธํ•œ ์„ค๋ช…์„ ๋“ค์„ ์ˆ˜ ์žˆ์—ˆ๋‹ค. ์ „๊ณต ๊ณผ์ • ์ค‘ ์ปดํ“จํ„ฐ ๊ทธ๋ž˜ํ”ฝ์Šค์™€ OpenGL์„ ๋‹ค๋ฃฌ ๊ฒฝํ—˜์ด ์žˆ์–ด ๊ฐœ๋…์„ ์–ด๋Š ์ •๋„ ์•Œ๊ณ  ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ–ˆ์ง€๋งŒ, ์Šคํ„ฐ๋””์žฅ๋‹˜์˜ ์„ค๋ช…์„ ๋“ค์œผ๋ฉด์„œ "์™œ" ๊ทธ๋Ÿฐ์ง€์— ๋Œ€ํ•ด ๊นŠ์ด ์•Œ๊ฒŒ ๋˜๋‹ค . ๊ทธ๋ž˜ํ”ฝ์Šค์—์„œ์˜ ์นด๋ฉ”๋ผ ์›๋ฆฌ, ๋ฒกํ„ฐ์™€ ์Šค์นผ๋ผ, ๊ทธ๋ฆฌ๊ณ  ํˆฌ์˜ ๋“ฑ three.js๋‚˜ ์ฝ”๋“œ๋ณด๋‹ค๋„ ๊ทธ๋ž˜ํ”ฝ์Šค์˜ ๊ธฐ๋ณธ์ ์ธ ๊ฐœ๋…์— ๋Œ€ํ•ด์„œ ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ์‹œ๊ฐ„์ด์—ˆ๋‹ค.

 


 

Three.js๋ž€

WebGL ๋“ฑ์˜ ๋ณต์žกํ•œ ๋กœ์šฐ๋ ˆ๋ฒจ ์ฝ”๋“œ๋ฅผ ์ถ”์ƒํ™”, ๋‹จ์ˆœํ™” ์‹œํ‚จ ๊ณ ์ˆ˜์ค€ API๋ฅผ ํ†ตํ•ด, ๊ฐœ๋ฐœ ๊ณผ์ •์„ ๋‹จ์ˆœํ™”ํ•˜๋Š” 3D ๊ทธ๋ž˜ํ”ฝ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ

 

 3D ๊ทธ๋ž˜ํ”ฝ ๋„๊ตฌ์—๋Š” ์—ฌ๋Ÿฌ๊ฐ€์ง€๊ฐ€ ์žˆ๋‹ค. OpenGl, WebGl, Three.js, Babylon.js ๋“ฑ์ด ๋Œ€ํ‘œ์ ์ธ๋ฐ, ๊ฐ ๋„๊ตฌ๋“ค์€ ์ €๋งˆ๋‹ค์˜ ์ถ”์ƒํ™” ๊ณ„์ธต์„ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค.

 

- OpenGL:  ์ตœํ•˜์œ„ ๋ ˆ๋ฒจ๋กœ, ํ•˜๋“œ์›จ์–ด์™€ ์ง์ ‘ ํ†ต์‹ ์„ ํ•˜๋ฉฐ ์„ธ๋ฐ€ํ•œ ์ œ์–ด๊ฐ€ ๊ฐ€๋Šฅํ•˜๋‹ค. ํ•˜์ง€๋งŒ ์ง„์ž… ์žฅ๋ฒฝ์ด ๋†’๋‹ค๋Š” ๋‹จ์ ์ด ์žˆ๋‹ค.

- WebGL:  ์›น ๋ธŒ๋ผ์šฐ์ €๋ฅผ ์œ„ํ•œ OpenGL ES ๊ธฐ๋ฐ˜ API๋กœ, ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋กœ ์ ‘๊ทผ ๊ฐ€๋Šฅํ•˜๋‹ค. ์—ฌ์ „ํžˆ ๋ณต์žกํ•œ ๋ณด์ผ๋Ÿฌํ”Œ๋ ˆ์ดํŠธ ์ฝ”๋“œ๊ฐ€ ํ•„์š”ํ•˜๋ฉฐ ๋‹ค๋ฃจ๊ธฐ ์–ด๋ ต๋‹ค.

- Three.js:  WebGL ๊ธฐ๋ฐ˜์˜ ๊ณ ์ˆ˜์ค€ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์ด๋‹ค.  ์ง๊ด€์ ์ธ API๋ฅผ ์ œ๊ณตํ•˜๋ฉฐ, ์›น ๋ธŒ๋ผ์šฐ์ € ๋‚ด๋ถ€์—์„œ ๊ณ ์ˆ˜์ค€์˜ ์ถ”์ƒํ™” ๋ ˆ์ด์–ด์—์„œ ๋™์ž‘ํ•œ๋‹ค. ๋น ๋ฅธ ๊ฐœ๋ฐœ์ด ๊ฐ€๋Šฅํ•˜๋ฉฐ, R3F ๋“ฑ ๋” ํŽธํ•œ 3D ๊ตฌํ˜„์„ ์œ„ํ•œ ํˆด๋„ ์žˆ๋‹ค.

 

 

์œ„ ๋„๊ตฌ๋“ค์€ ์ปดํ“จํ„ฐ ์ƒ์—์„œ 3D ๊ทธ๋ž˜ํ”ฝ์„ ๊ตฌํ˜„ํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋˜์ง€๋งŒ, ๊ณผ์—ฐ ์ด๋“ค๋กœ ์ƒ์„ฑํ•˜๋Š” ๊ฒƒ์ด ์ง„์งœ 3D์ผ๊นŒ?

 

์‚ฌ์‹ค, OpenGL ์ž์ฒด๋Š” 3D ๊ทธ๋ž˜ํ”ฝ ๋„๊ตฌ๊ฐ€ ์•„๋‹ˆ๋‹ค๐Ÿ˜ฎ . OpenGL์€ ์ขŒํ‘œ ํ‰๋ฉด์—์„œ ์ , ์„ , ์‚ผ๊ฐํ˜•์„ ๊ทธ๋ฆฌ๋Š” ์ผ์ข…์˜ ๊ทธ๋ž˜ํ”ฝ ํŒŒ์ดํ”„๋ผ์ธ์ด๋‹ค. 3D ๊ณต๊ฐ„์„ ํ‘œํ˜„ํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ํˆฌ์˜์ด๋ผ๋Š” ๊ณผ์ •์ด ํ•„์š”ํ•˜๋‹ค

 

ํˆฌ์˜

ํˆฌ์˜์ด๋ž€ 3D ๊ณต๊ฐ„์˜ ๊ฐ์ฒด๋ฅผ 2D ํ™”๋ฉด์— ๊ทธ๋ฆด ๋•Œ, 3์ฐจ์› ์ขŒํ‘œ๋ฅผ 2์ฐจ์› ํ‰๋ฉด์œผ๋กœ ๋ณ€ํ™˜ํ•˜๋Š” ๊ณผ์ •์ด๋‹ค. ํˆฌ์˜์„ ํ†ตํ•ด ๊นŠ์ด์™€ ์ž…์ฒด๊ฐ์„ ๊ฐ€์ง„ 3์ฐจ์› ๊ฐ์ฒด๊ฐ€ ํ‰๋ฉด์— ๋“œ๋Ÿฌ๋‚˜๋ฉฐ, ์ด๋ฅผ ํ†ตํ•ด ์ธ๊ฐ„์˜ ๋ˆˆ์€ ํ™”๋ฉด ์† ๊ทธ๋ž˜ํ”ฝ์„ 3D๋กœ ์ธ์‹ํ•˜๊ฒŒ ๋œ๋‹ค.

 

ํˆฌ์˜์—๋Š” ๋‘ ๊ฐ€์ง€ ์ข…๋ฅ˜๊ฐ€ ์žˆ๋‹ค.

1. ์ง๊ตํˆฌ์˜(Orthographic Projection) : ๊ฐ์ฒด๊ฐ€ ์นด๋ฉ”๋ผ์™€ ์–ผ๋งˆ๋‚˜ ๊ฐ€๊นŒ์šด์ง€์™€ ์ƒ๊ด€์—†์ด ๋™์ผํ•œ ํฌ๊ธฐ๋กœ ๋ณด์ด๋„๋ก ํ‘œํ˜„

2. ์›๊ทผํˆฌ์˜(Perspective Projection) : ์‹ค์ œ ์‹œ์•ผ์ฒ˜๋Ÿผ ๊ฑฐ๋ฆฌ์— ๋”ฐ๋ผ ๊ฐ์ฒด ํฌ๊ธฐ๊ฐ€ ๋‹ฌ๋ผ์ง€๋„๋ก ํ‘œํ˜„. ํฐ ๋ฌผ์ฒด๋Š” ํฌ๊ฒŒ, ๋จผ ๋ฌผ์ฒด๋Š” ์ž‘๊ฒŒ

 

ํˆฌ์˜์„ ํ†ตํ•ด 3์ฐจ์› ์ •๋ณด๊ฐ€ ํ‰๋ฉด์— ํˆฌ์˜๋˜๋ฉด, ์ธ๊ฐ„์˜ ๋ˆˆ์€ ๊ทธ ์•ˆ์—์„œ ๊นŠ์ด์™€ ๊ฑฐ๋ฆฌ๊ฐ์„ ๋Š๊ปด 3D์ฒ˜๋Ÿผ ์ธ์‹ํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์ด๋‹ค. 

 

ํˆฌ์˜์˜ ํ™œ์šฉ

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

 

 

OpenGL์„ ์‚ฌ์šฉํ•˜๋ฉด 3D ํ‘œํ˜„์„ ์œ„ํ•ด ๋ณ„๋„์˜ ํˆฌ์˜์ด ํ•„์š”ํ•˜์ง€๋งŒ, Three.js๋Š” ์ด๋Ÿฌํ•œ ์—ฐ์‚ฐ์„ ๋Œ€์‹  ํ•ด์ค€๋‹ค. ๋”ฐ๋ผ์„œ ๋ณด๋‹ค ๋” ์‰ฝ๊ฒŒ, 3D๋ฅผ ํ‘œํ˜„ํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์ด๋‹ค.

 


 

Three.js ์Šคํ„ฐ๋”” ๋ชฉํ‘œ

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

 

์ด ํ”„๋กœ์ ํŠธ๋ฅผ ๊ณ„๊ธฐ๋กœ  ์ปดํ“จํ„ฐ ๊ทธ๋ž˜ํ”ฝ์Šค์— ๊ด€์‹ฌ์„ ๊ฐ€์ง€๊ฒŒ ๋˜์—ˆ๊ณ , Three.js์—๋„ ๊ด€์‹ฌ์„ ๊ฐ€์ง€๊ฒŒ ๋˜์—ˆ๋˜ ๊ฒƒ ๊ฐ™๋‹ค. ๊ทธ๋ž˜์„œ ์ด๋ฒˆ Three.js ์ตœ์ข… ๋ชฉํ‘œ๋Š” OpenGL๋กœ ๋งŒ๋“ค์—ˆ๋˜ ํƒœ์–‘๊ณ„ ํ”„๋กœ์ ํŠธ๋ฅผ Three.js๋กœ ์ด์‹ํ•ด๋ณด๋Š” ๊ฒƒ์œผ๋กœ ์ •ํ–ˆ๋‹ค. ํƒœ์–‘๊ณ„๊ฐ€ ๋Œ์•„๊ฐ€๋Š” ์ธํ„ฐ๋ ‰์…˜ ๋ธ”๋กœ๊ทธ ๋งŒ๋“ค๊ธฐ๋ฅผ ๋ชฉํ‘œ๋กœ, Three.js ์Šคํ„ฐ๋”” ํ™”์ดํŒ