๐ ๋ค์ด๊ฐ๋ฉฐ
์์ฆ ์ปดํจํฐ ๊ทธ๋ํฝ์ค ์์ ์ ๋ค์ผ๋ฉด์ ๋๋ฌด ์ฌ๋ฐ์ด์
'ํน์ ์ง๊ธ ๋ง๋ค๋ ค๊ณ ํ๋ ๋ด ๊ฐ์ธ ์น ํ์ด์ง์๋ 3D ๋ชจ๋ธ์ ๋ฃ์ ์ ์์ง ์์๊น?' ๋ผ๋ ๊ถ๊ธ์ฆ์ด ์๊ฒผ์๋ค.
์์ง ํ๋ก ํธ์๋ ์ ๋ฌธ ์ค์ด์๋ ๋๋ ๋ชจ๋ฅด๋ ๊ฒ์ด ๋ง์๊ธฐ์ ,,
GPT ํํ ๋ ๋ฌผ์ด๋ณด๊ณ , ํฐ์คํ ๋ฆฌ ๋ฑ๋ ์ฐธ๊ณ ํด๋ดค๋๋
๋ณดํต ๋ธ๋ ๋๋ก ๋ชจ๋ธ๋งํ ํ Three.js๋ก ์น์ ์ฌ๋ฆฐ๋ค๊ณ ํด์ ๋ฐ๋ก ๋์ ํด๋ณด๊ธฐ๋ก ํ๋ค ๐คฉ
๐ฅ ๋ธ๋ ๋๋ก ์ ์ํ ๋ชจ๋ธ
๋๋ ๊ฐ๋จํ๊ฒ ๋ด ์ด๋ฆ์ ๋ชจ๋ธ๋งํด๋ณด๊ณ ์ถ์๊ณ , ๊ฒฐ๊ณผ๋ฌผ์ ๋ค์๊ณผ ๊ฐ๋ค.



๊ตณ์ด ๋ณด์ฌ์ฃผ๋ ์ด์ ๋ ๊ทธ๋ฅ ์๋ํ๊ณ ์ถ์๋ค ใ ใ ๐ค
๐ง Material Properties
ํน์๋ ์ฌ์ง ์ค์ ์ด ๊ถ๊ธํ ๋ถ๋ค์ด ์์๊น ์ถ์ด์
๋ด๊ฐ ์ฌ์ฉํ Material ์์ฑ ๊ฐ๋ค์ ์ ๋ฆฌํด๋ณด์๋ค.
| ์์ฑ | ๊ฐ | ์ค๋ช |
| Base Color | #9A80FF (๋ด ๋ํ ์ปฌ๋ฌ) |
ํ๋ฉด์ ๊ธฐ๋ณธ ์์ |
| Metallic | 0.7 | ๊ธ์์ฒ๋ผ ๋น์ ๋ฐ์ฌํ ์ง, ๋น๊ธ์์ฒ๋ผ ํ์ฐ๊ด์ ๋ผ์ง ๊ฒฐ์ ํ๋ ๊ฐ์ผ๋ก, (1์ ๊ฐ๊น์ธ์๋ก ๊ธ์ ๋๋) |
| Roughness | 0.1 | ํ๋ฉด์ ๊ฑฐ์น ๊ธฐ๋ก, ๋ฎ์ผ๋ฉด ๋ฐ์ฌ๊ฐ ์ ๋ช ํ๊ณ , ๋์ผ๋ฉด ํ๋ฆฟํ๊ณ ๋ฌด๊ด์ ๊ฐ๊น์์ง |
| IOR | 1.35 | ๋น์ด ์์ฌ ๋ด๋ถ๋ก ๋ค์ด๊ฐ ๊ตด์ ๋๋ ์ ๋๋ก, ์ ๋ฆฌ·๋ฌผ·ํ๋ผ์คํฑ ๋ฑ์ ๊น์ด๊ฐ์ ๊ฒฐ์ ํ๋ ์์์ |
| Transmission | 0.85 | ์ผ๋ง๋ ํฌ๋ช
ํ ์ฌ์ง์ธ์ง ์ ์ํ๋ ๊ฒ์ผ๋ก, ๊ฐ์ด ๋์์๋ก ์ ๋ฆฌ์ฒ๋ผ ๋น์ด ํต๊ณผ |
| Coat Weight | 0.25 | ํ๋ฉด ์์ ๋ง์์์ง ํฌ๋ช
์ฝํ
์ธต์ ๊ฐ๋๋ก, ๊ดํ๊ณผ ํ์ด๋ผ์ดํธ๋ฅผ ๊ฐํํจ |
| Coat Roughness | 0.03 | ์ฝํ
์ธต์ ๊ฑฐ์น ๊ธฐ๋ก, ๊ฐ์ด ๋ฎ์ผ๋ฉด ์ฝํ ์ธต ๋ฐ์ฌ๊ฐ ๋ ์นด๋กญ๊ณ ์ ๋ช ํ๊ฒ ๋ณด์ |
์ฒ์์ ์ด๋ฐ ์์ฑ๋ค์ ์ ๋๋ก ์ ๋ฆฌํด ์ค ๋ธ๋ก๊ทธ๊ฐ ๊ฑฐ์ ์์ด์ ๋ต๋ตํ๋๋ฐ,
์ค์ ๋ก ๋ธ๋ ๋๋ก ์์ ํด๋ณด๋๊น ์ ๊ทธ๋ฐ์ง ์ ๊ฒ ๊ฐ์๋ค ,,ใ ใ
๊ทธ๋ฅ ๋ด๊ฐ ์ง์ ๊ฐ์ ์ด๊ฒ์ ๊ฒ ๋ฐ๊ฟ๋ณด๋ฉด์ ์ ค ๋ง์ ๋๋ ๋๋์ ์ฐพ๋ ๊ฒ ๋ ๋นจ๋๋ค ๐คง
๊ทธ๋ฆฌ๊ณ ์ด์ฐจํผ ๋ด๊ฐ ๋จธ๋ฆฟ์์ผ๋ก ์๋ฒฝํ๊ฒ ์์ํด์ ๊ฐ์ ์ ํ ๊ฒ ๊ฐ์๋
์ค์ ๋ก ๋ณด๋ฉด ์ซ ๋๋์ด ๋ค๋ฅธ ๊ฒฝ์ฐ๊ฐ ๋ง์์ ๊ทธ๋ฅ ํ๋์ฉ ์กฐ์ ํด๋ณด๋ ๊ฒ ์ ค ์ข์ ๊ฒ ๊ฐ๋ค !
์ด์จ๋ ๊ฒฐ๋ก ์ ์ผ๋ก ๋ ์์ ๊ฐ์ ์ค์ ์ผ๋ก
์ด์ง ํฌ๋ช ํ ํ๋ผ์คํฑ(?) + ์์ํ ๊ธ์ ๋๋์ ์์ ๋ก๊ณ ๋ฅผ ์์ฑํ๋ค.
๐จ React Three Fiber ํ๊ฒฝ ๊ตฌ์ถ
์ฒ์์๋ Three.js์์ ํ๋ผ๋ ๋๋ก ๋ฐ๋ผํ๋ฉด ๋์ง ์์๊น ์ถ์๋๋ฐ,
์ข ๋ ์์๋ณด๋ Three.js๋ ์ํ ๊ด๋ฆฌ๋ ๋ผ์ดํ์ฌ์ดํด, ํ ๋ฑ์ ์ฌ์ฉํ์ง ๋ชปํจ์ ์๊ฒ ๋์๋ค ..
๋ด ํ๋ก์ ํธ๋ ์ด๋ฏธ React ๊ธฐ๋ฐ์ผ๋ก ๊ตฌ์กฐ๊ฐ ์กํ ์์๊ธฐ ๋๋ฌธ์,
3D๋ง ์์ ํ ๋ณ๋์ ๋ฐฉ์์ผ๋ก ๊ด๋ฆฌํด์ผ ํ๋ ์ ์ด ๊ณ์ ๋ง์์ ๊ฑธ๋ ธ๋๋ฐ,
์ฐพ์๋ณด๋ React Three Fiber(R3F)๋ผ๋ ๊ฒ์ ๋ฐ๊ฒฌํ๊ฒ ๋์๋ค โจ
R3F๋ฅผ ์ฌ์ฉํ๋ฉด Three.js์ ๊ธฐ๋ฅ์ ์๋์ฒ๋ผ React์ค๋ฝ๊ฒ(?) ๊ฐ์ ธ์ฌ ์ ์๋ค๋ ์ ์ด ์๋นํ ๋ง์ ๋ค์๋ค.
- Canvas๋ถํฐ Mesh๊น์ง ๋ชจ๋ ์์๋ฅผ JSX๋ก ํํ ๊ฐ๋ฅํจ
- useFrame, useEffect, useRef ๊ฐ์ React ํ ์ผ๋ก 3D ์ฌ์ ์ ์ดํ ์ ์์
- ๊ธฐ์กด UI ๊ฐ๋ฐ ๋ฐฉ์ ๊ทธ๋๋ก 3D๋ฅผ ์ปดํฌ๋ํธํํด์ ๊ด๋ฆฌํ ์ ์์
๊ฒ๋ค๊ฐ @react-three/drei๋ผ๋ ์ ํธ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ ์์ด์
์นด๋ฉ๋ผ ์ปจํธ๋กค, ํ๊ฒฝ๊ด(Environment) ๊ฐ์ ๊ธฐ๋ฅ๋ค์
๊ทธ๋ฅ ๋ ๊ณ ๋ง๋ฅ ์กฐ๋ฆฝํด์ ์ธ ์ ์๋ค๋ ์ ์ด ๋๋๋ฆฌ ๋ง์ ๋ค์๋ค ๐คง๐
๐ฉ ๋ธ๋ ๋ ๋ชจ๋ธ์ R3F๋ก ๊ฐ์ ธ์ค๊ธฐ
Blender์์ ๋ง๋ ๋ชจ๋ธ์ .glb๋ก export ํ๊ณ ,
์ด๊ฑธ R3F ์ชฝ์์๋ @react-three/drei์์ ์ ๊ณตํ๋ useGLTF ํ
์ผ๋ก ๊ฐ์ ธ์๋ค.
import { useGLTF } from '@react-three/drei';
const MyLogo = () => {
const { scene } = useGLTF('/models/logo.glb');
return <primitive object={scene} />;
};
useGLTF๋ ๋ด๋ถ์ ์ผ๋ก Three.js์ GLTFLoader๋ฅผ ๊ฐ์ธ๊ณ ์์ด์,
์บ์ฑ, ๋ก๋ฉ ์ํ ๊ด๋ฆฌ, ํ์ ์ง์์ ํ ๋ฒ์ ํด๊ฒฐํด์ค๋ค ๐คฉ
๋ํ ์ ์ ๊ฐ ์ค์ ๋ก ํด๋น ์น์
๊น์ง ์คํฌ๋กคํ๊ธฐ ์ ์
๋ฏธ๋ฆฌ ๋ฆฌ์์ค๋ฅผ ๋ฐ์์ฌ ์ ์๋๋ก preload๋ ํจ๊ป ์ถ๊ฐํ๋ค.
useGLTF.preload('/models/logo.glb');
์ด๋ ๊ฒ ํด๋๋ฉด, ์ ์ ๊ฐ 3d ๋ชจ๋ธ์ด ์๋ ์น์ ๊น์ง ์คํฌ๋กคํด์ ๋๋ฌํ๊ธฐ ์ ์
๋ฐฑ๊ทธ๋ผ์ด๋์์ ๋ฏธ๋ฆฌ ๋ชจ๋ธ์ ๋ฐ์์ฌ ์ ์์ด์ ์ฒด๊ฐ ๋ก๋ฉ์ด ๋ ๋ถ๋๋ฝ์์ง๋ค.
์ด๋ ๊ฒ ๋ชจ๋ธ์ ๋ก๋ฉํ ์ค๋น๊น์ง ๋๋ฌ๋ค๋ฉด,
์ด์ 3D ์ฌ์ ์ํ ๋ฌด๋์ธ <Canvas>๊ฐ ํ์ํ๋ค.
React Three Fiber์์๋ ๊ธฐ๋ณธ์ ์ผ๋ก ์ด๋ ๊ฒ ์์ํ๋ค.
import { Canvas } from '@react-three/fiber';
const HeroScene = () => {
return (
<Canvas>
{/* ์ฌ๊ธฐ ์์ 3D ์ค๋ธ์ ํธ์ ์กฐ๋ช
, ์นด๋ฉ๋ผ ๋ฑ์ ๋ฃ๋๋ค */}
</Canvas>
);
};
์ด <Canvas>๋ ๋ง ๊ทธ๋๋ก Three.js์ renderer + ์บ๋ฒ์ค๋ฅผ React ์ปดํฌ๋ํธ๋ก ๊ฐ์ผ ๊ฒ์ด๋ค.
๋๋ Hero ์น์
์์์ ์ ๋นํ ๋น์จ๋ก๋ง ๋ณด์ด๊ฒ ํ๊ธฐ ์ํด,
CSS๋ก ํฌ๊ธฐ๋ฅผ ๊ณ ์ ํด๋๊ณ ๊ทธ ์์ 3D๋ฅผ ๊ฐ๋ฌ๋๋ ๋ฐฉ์์ผ๋ก ์ฌ์ฉํ๋ค.
๋ค์์ผ๋ก R3F์์๋ ์นด๋ฉ๋ผ๋ฅผ ๋ ๊ฐ์ง๋ก ๊ด๋ฆฌํ ์ ์๋๋ฐ,
- <Canvas camera={{ position: [...] }}> ํํ๋ก ๋ฐ๋ก ๋๊ธฐ๊ฑฐ๋
- <PerspectiveCamera makeDefault /> ๊ฐ์ ์ปดํฌ๋ํธ๋ฅผ ๋ณ๋๋ก ๋ ์๋ ์๋ค.
๋ด ๊ฒฝ์ฐ์๋ ๋ณต์กํ ์นด๋ฉ๋ผ ์ด๋์ด ํ์ํ์ง ์์์,
์์ฃผ ๊ฐ๋จํ๊ฒ ์ ๋ฉด์์ ์ด์ง ์/์์ผ๋ก ์น์ฐ์น ํฌ์ง์
์ ๋๋ง ์ก์๋ค.
<Canvas camera={{ position: [0, 0, 5], fov: 45 }}>
{/* ... */}
</Canvas>
์ฌ๊ธฐ์ fov(field of view)๋ฅผ ๋๋ฌด ๋๊ฒ ์ก์ผ๋ฉด ๋ชจ๋ธ์ด ์๊ณก๋์ด ๋ณด์ด๊ณ ,
๋๋ฌด ์ข๊ฒ ์ก์ผ๋ฉด ๋ต๋ตํด ๋ณด์ฌ์, ์ฌ๋ฌ ๋ฒ ์กฐ์ ํด ๋ณด๋ฉด์ ๋ด ์น์
์ ์ ์ด์ธ๋ฆฌ๋ ๊ฐ์ ๊ณจ๋๋ค.
๋ง์ง๋ง์ผ๋ก, 3D ๋ชจ๋ธ์ด ์์ด๋ ๋น์ ์ ์ผ๋ฉด ์๋ฌด๊ฒ๋ ์ ๋ณด์ธ๋ค.
๊ทธ๋์ ๊ธฐ๋ณธ์ ์ธ ์กฐ๋ช
์ ์๋ ์ ๋๋ก ์ต์ ์ธํ
์ ํ๋ค.
<ambientLight intensity={0.6} />
<directionalLight position={[2, 4, 5]} intensity={1.2} />
ambientLight(ํ๊ฒฝ๊ด)๋ ์ ์ฒด์ ์ผ๋ก ๊ทธ๋ฆผ์๋ฅผ ์์ ๊ณ ๋ชจ๋ธ์ด ๋๋ฌด ์ด๋ก์ง ์๊ฒ ํด์ฃผ๋ ์ญํ ์ด๊ณ ,
directionalLight(๋ฐฉํฅ๊ด)๋ ํ๋น์ฒ๋ผ ํ ์ชฝ์์ ๋ค์ด์ค๋ ๋น์ด๋ผ, ๋ก๊ณ ์ ๋ฉด๊ณผ ์ฃ์ง๊ฐ ์ด์ง ์ด์๋๋๋ก ์ค์ ํด์ฃผ๋ ์ญํ ์ด๋ค.
๋๋ ๋๋ฌด ํ๋ํ ๊ทธ๋ฆผ์๋ณด๋ค๋ ์ด์ง ๊ดํ ์๊ณ ๋ถ๋๋ฌ์ด ๋๋์ ์ํด์ intensity๋ฅผ ์กฐ์ ํด ๊ฐ๋ฉฐ ํ ์คํธํ๋ค.

๊ฒฐ๊ณผ์ ์ผ๋ก ์๋ ๊ฒ ์ ์ฌ๋ผ๊ฐ์๋ ๊ฒ์ ๋ณผ ์ ์๋ค !!
(์ง๊ธ์ ๋ค๋ฅธ ์ ๋๋ฉ์ด์ ๋ ์ถ๊ฐํด๋ ์ํ๋ผ์ ์ด์ง ์์ผ๋ก ๊ธฐ์ธ์ด์ ธ ์๋ค ,,ใ ใ )
๐ ๊ฒฐ๋ก
์ฒ์์๋ ๋จ์ํ “๋ด ์น ํ์ด์ง์๋ 3D ๋ชจ๋ธ ํ๋ ๋ฃ์ด๋ณด๊ณ ์ถ๋ค!”๋ผ๋ ํธ๊ธฐ์ฌ์์ ์์ํ๋๋ฐ,
๋ง์ Blender์์ ๋ชจ๋ธ๋ง์ ํ๊ณ , React Three Fiber ํ๊ฒฝ์ ๊ตฌ์ฑํ๊ณ ,
GLTF ๋ก๋ฉ๊ณผ ์ ๋๋ฉ์ด์
๊น์ง ๋ง๋ค์ด๋ณด๋ ์๊ฐ๋ณด๋ค ํจ์ฌ ๋ง์ ๊ฒ์ ๋ฐฐ์ธ ์ ์๋ ๊ณผ์ ์ด์๋ค.
์์ง ๊ฐ ๊ธธ์ ๋ฉ๊ณ , ๋ ๋ง์ 3D ์คํ์ ํด๋ณด๊ณ ์ถ์ง๋ง,
์ด๋ฒ ์์
๋ง์ผ๋ก๋ ์น์์๋ ์ด๋ฐ ์๊ฐ์ ์ธ ์ฆ๊ฑฐ์์ ๋ง๋ค ์ ์๊ตฌ๋ ์ถ๋ค.
์ ๊ทธ๋ฆฌ๊ณ ๊ทธ๋ํฝ์ค ์์ ์์ ๋ฐฐ์ด ๊ฑธ ๋์ฒด ์ด๋๋ค๊ฐ ์จ๋จน์ ์ ์๋๊ฑฐ์ง ์ถ์๋๋ฐ
์น์์๋ ๋ง์ฐฌ๊ฐ์ง๋ก ์ขํ๊ณ, ๊ด์, ๋ทฐ, ํฌ์, ์ ฐ์ด๋ฉ ๋ฑ์ ๊ฐ๋ ๋ค์ด ์ ์ฉ๋๋ ๊ฑธ ๋ณด๋๊น ์ ๋ง ์ ๊ธฐํ๋ค.
๋ญ๊ฐ ๊ณง ์์ ๊ธฐ๋ง๊ณ ์ฌ ๋๋น ์ํ๊ณต๋ถ๋ฅผ ์ข ๋ ์ด์ฌํ ํ ์ด์๊ฐ ์๊ธด ๊ฒ ๊ฐ๋ค ใ ใ
'๐ป๊ณต๋ถ ๊ธฐ๋ก > ๐ Frontend' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
| [Frontend] React Native + ESLINT v9 Flat Config (0) | 2025.11.17 |
|---|---|
| [Frontend] 3D ๋ก๊ณ ํ์ด๋์ธ ์ต์ ํ (0) | 2025.11.14 |
| [Frontend] ESLint v9๋ก TS+React ๋ฆฐํ ํ๊ฒฝ ๋ง๋ค๊ธฐ (0) | 2025.11.12 |
| [Frontend] ESLint v9 ๊ณต์ ๋ฌธ์ ๋ฏ์ด๋ณด๊ธฐ (0) | 2025.11.12 |
| [Frontend] React + TypeScript ํ๋ก์ ํธ ๋ง๋ค๊ณ GitHub์ ์ฌ๋ฆฌ๊ธฐ (0) | 2025.11.11 |