(๐ผ๏ธ๋ฐ ์ด๋ฏธ์ง์ ํจ๊ป ๋ฐฐ์ฐ๊ธฐ) ๐ง AI๋ฅผ ์ฌ์ฉํด ๐จ3D ์ ๋๋ฉ์ด์ ๋ง๋๋ ๋ฐฉ๋ฒ (React Three Fiber vs Three.js vs A-Frame + GSAP)
Source: Dev.to
์๊ฐ
์์ฆ ์ ๋ ๋๋ ํ๋ จ ์ฑ Muscle Brain์ ๋ง๋ค๊ณ ์์ต๋๋ค.
- ์ ์ฑ DEV ํฌ์คํธ: ๐ How I released Chrome Extensions (๐ช๐ง Muscle Brain v4)
์ง๋ ๋ฒ์๋ ์ฑ์ ์ํ ์น์ฌ์ดํธ๋ฅผ ๋ง๋ค๊ณ GSAP์ผ๋ก 2D ์ ๋๋ฉ์ด์ ์ ์ ์ํ์ต๋๋ค.
- ์ ์น์ฌ์ดํธ DEV ํฌ์คํธ: ๐ง I created a website animation that you might stare at for a while (GSAP) ๐จ
์ด์ 3D๋ฅผ ๋ฐฐ์ฐ๊ณ 2D ์ ๋๋ฉ์ด์ ์ 3D๋ก ๋ณํํ๊ณ ์ถ์ต๋๋ค. 3D๋ฅผ ๋ฐฐ์ฐ๋ ๊ฒ์ด ์๋ก์ด ๊ฐ๋ ์ด ๋ง์ ์์๋ณด๋ค ๋ ์ด๋ ค์ ์ต๋๋ค. ์ฌ๋ฏธ์ ์ดํด๋ฅผ ๋๊ธฐ ์ํด ๋ฐ ์ด๋ฏธ์ง๋ฅผ ํ์ฉํด ๋จ๊ณ๋ณ๋ก 3D๋ฅผ ํจ๊ป ๋ฐฐ์๋ด ์๋ค! ๐
3D ์น๊ณผ 2D ์น์ ์ฐจ์ด์
3D๋ ๋ณด๋ค ๋ชฐ์ ๊ฐ ์๊ณ ์ฌ์ค์ ์ธ ์ ๋๋ฉ์ด์ ๊ฒฝํ์ ์ ๊ณตํ์ง๋ง, 2D๋ณด๋ค ํ์ต ๊ณก์ ์ด ๊ฐํ๋ฆ ๋๋ค. ์ฃผ์ ์ฐจ์ด์ ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
| ๊ฐ๋ | 2D ์น | 3D ์น |
|---|---|---|
| ๋์ด๋ | ์ฌ์ | ์ด๋ ค์ |
| ์ถ | X, Y | X, Y, Z |
| ์นด๋ฉ๋ผ | ์์ | ์์ |
| ์กฐ๋ช | ์์ | ์์ |
| ์์น | CSS | Material |
- ์ถ: 2D๋ X(๊ฐ๋ก)์ Y(์ธ๋ก)๋ง ์ฌ์ฉํฉ๋๋ค. 3D๋ Z(๊น์ด)๋ฅผ ์ถ๊ฐํด ๊ฐ์ฒด๊ฐ ์๋ค๋ก ๋ฐฐ์น๋ ์ ์์ต๋๋ค.
- ์นด๋ฉ๋ผ: 2D๋ ์นด๋ฉ๋ผ๊ฐ ํ์ ์์ผ๋ฉฐ ๋ชจ๋ ๊ฒ์ด ๋ฐ๋ก ๋ณด์ ๋๋ค. 3D๋ ์์น, ํ์ , ์์ผ๊ฐ(FOV)์ ๊ฐ์ง ์นด๋ฉ๋ผ๊ฐ ํ์ํ๊ณ , ์นด๋ฉ๋ผ ๋ค์ ์๋ ๊ฐ์ฒด๋ ๋ณด์ด์ง ์์ต๋๋ค.
- ์กฐ๋ช : 3D์์๋ ์กฐ๋ช ์ด ํ์์ด๋ฉฐ, ์กฐ๋ช ์ด ์์ผ๋ฉด ์ฌ์ง์ด ๊ฒ๊ฒ ๋ณด์ ๋๋ค.
- ์ฌ์ง: 3D๋ metalness (0โฏ=โฏํ๋ผ์คํฑ, 1โฏ=โฏ๊ธ์)์ roughness (0โฏ=โฏ๊ฑฐ์ธ์ฒ๋ผ, 1โฏ=โฏ๋ฌด๊ด) ๊ฐ์ ์์ฑ์ ๊ฐ์ง ์ฌ์ง์ ์ฌ์ฉํฉ๋๋ค. CSS๋ ์บ๋ฒ์ค ์ฃผ๋ณ UI ๋ ์ด์์์ ์ฌ์ ํ ์ ์ฉํฉ๋๋ค.

์ค์ํ 3D ์ฉ์ด
์๋๋ Three.js(๋๋ ๊ทธ ๋ํผ)๋ฅผ ์ฌ์ฉํ ๋ ๋ง์ฃผํ๊ฒ ๋ ํต์ฌ ์ฉ์ด๋ค์ ๋๋ค.
| ์ฉ์ด | ์๋ฏธ |
|---|---|
| Scene | ๋ชจ๋ ๊ฐ์ฒด๋ฅผ ๋ด๋ ์บ๋ฒ์ค |
| Camera | ๋น์ ์ ๋; ์ฌ์ ์ด๋ ๋ถ๋ถ์ด ๋ณด์ผ์ง ์ ์ |
| Render | ์นด๋ฉ๋ผ ์์ ์์ ์ฌ์ ๊ทธ๋ฆฌ๊ธฐ |
| Geometry | ๊ฐ์ฒด์ ํํ |
| Material | ์ธ๊ด(์, ํ ์ค์ฒ ๋ฑ) |
| Mesh | Geometry์ Material์ด ๊ฒฐํฉ๋ 3D ๊ฐ์ฒด |

Three.js vs React Three Fiber vs AโFrame
์ธ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ๋ชจ๋ WebGL์ ๋ํํด 3D ๊ฐ๋ฐ์ ์ฝ๊ฒ ํด ์ฃผ์ง๋ง, ๋ชฉํํ๋ ์ํฌํ๋ก์ฐ๊ฐ ๋ค๋ฆ ๋๋ค.
Three.js
- WebGL์ ์ง์ ๊ฐ์ธ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ.
- ์ฌ, ์กฐ๋ช , ์ฌ์ง ๋ฑ์ ์ฒ๋ฆฌํด ์ ์์ค ์ฝ๋๋ฅผ ํฌ๊ฒ ์ค์ฌ ์ค๋๋ค.
- ๊ณต์ ๋ฌธ์:
React Three Fiber (r3f)
- Three.js์ฉ React ๋ ๋๋ฌ.
- 3D ์ฝ๋๋ฅผ React ์ปดํฌ๋ํธ ํํ๋ก ์์ฑํ๊ฒ ํด ์ฌ์ฌ์ฉ์ฑ๊ณผ ์ ์ธํ ์คํ์ผ์ ์ด์งํฉ๋๋ค.
- ๋ฌธ์:
AโFrame
- Three.js ์์ ๊ตฌ์ถ๋ ์ ์ธํ HTML ๊ธฐ๋ฐ ํ๋ ์์ํฌ๋ก, VR/AR์ ์ด์ .
- React๋ฅผ ์ฌ์ฉํ์ง ์๋ ๊ฐ๋ฐ์๋ ๋น ๋ฅด๊ฒ 3D/VR ํ๋กํ ํ์ ์ ๋ง๋ค ์ ์์ต๋๋ค.
- ๋ฌธ์:
๋น๊ต ํ
| ํน์ง | Three.js | React Three Fiber | AโFrame |
|---|---|---|---|
| ๋์ด๋ | ์ด๋ ค์ | ์ค๊ฐ | ์ฌ์ |
| ์ฝ๋ ์คํ์ผ | ๊ฐ์ฒด์งํฅ | React ์ปดํฌ๋ํธ | HTML ์ปดํฌ๋ํธ |
| ํ๋ ์์ํฌ | Vanilla JS / any | React ์ ์ฉ | Vanilla JS / any |
| ์ถ์ฒ ๋์ | ์ต๋ ์ ์ด, React ๋น์ฌ์ฉ์ | React ๊ฐ๋ฐ์ | ์ด๋ณด์, VR/AR |
์ธ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ๋ชจ๋ Node.js ํ๊ฒฝ์์ ์ฌ์ฉํ ์ ์์ต๋๋ค. React Three Fiber๋ React๊ฐ ํ์ํ๊ณ , Three.js์ AโFrame์ ์์ JavaScript/TypeScript์ ์ด๋ค ํ๋ ์์ํฌ์๋ ํจ๊ป ์ฌ์ฉํ ์ ์์ต๋๋ค.
์ํ ์ํ ์ ๋๋ฉ์ด์ (CodePen)
๋ฌด์์ ๋ณ๋ค์ด ์นด๋ฉ๋ผ์์ ๋ฉ๋ฆฌ ๋จ์ด์ง ์์น์์ ๊ฐ๊น์ด ์์น๋ก ์ด๋ํ๋ ์์ฃผ ๊ฐ๋จํ ์ํ ์ ๋๋ฉ์ด์ ์ ๋ง๋ค์์ต๋๋ค. ๋ณ๋ค์ ์์ฒด์ ์ผ๋ก ๋น๋๊ธฐ ๋๋ฌธ์ ์กฐ๋ช ์ด ํ์ ์์ต๋๋ค. ์ฌ์ฉ๋ ์ฌ์ง์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
- React Three Fiber โ
meshBasicMaterial - Three.js โ
MeshBasicMaterial - AโFrame โ
shader: flat

React Three Fiber ์ฝ๋ ์์ (GSAP ์ ๋๋ฉ์ด์ )
์๋ ์ค๋ํซ์ ๊ฐ ๋ณ์ ๋ฉ๋ฆฌ(z: -50)์์ ๊ฐ๊น์ด(z: 5) ์์น๋ก 3์ด ๋์ ์ ๋๋ฉ์ด์
ํ๊ณ , ๋ฌดํํ ๋ฐ๋ณตํฉ๋๋ค.
// Animate the star using GSAP
// gsap.fromTo = animate FROM one value TO another value
gsap.fromTo(
ref.current.position, // What to animate (the star's position in 3D space)
{ z: -50 }, // Starting value: far away (50 units behind camera)
{
z: 5, // Ending value: close to camera (5 units in front)
duration: 3, // Animation takes 3 seconds
delay: 0, // No initial delay
repeat: -1, // Loop forever
ease: "none"
}
);