์์ํ๊ธฐ ์ ์
3์ฐจ์ ๊ณต๊ฐ ์์ ๋์ด๋ Object3D์ ํ์ ํด๋์ค๋ 3๊ฐ์ง๊ฐ ์๋ค.
- Mesh: ์ผ๊ฐํ ๋ฉด์ผ๋ก ๊ตฌ์ฑ๋ ๊ฐ์ฒด
- Line: ์ ํ ๊ฐ์ฒด
- Points: ์
์ด 3D ์ค๋ธ์ ํธ๊ฐ 3์ฐจ์ ๊ณต๊ฐ ์์ ๋์ด๊ธฐ ์ํด์๋ ๋ค์ ๊ฐ์ ํ์๋ก ํ๋ค.
- Position: ์์น
- Rotation: ํ์
- Scale: ํฌ๊ธฐ
์ด ๊ฐ๋ค์ 4x4 ํฌ๊ธฐ์ ํ๋ ฌ ์ ๋ณด๋ก ๋ณํ๋๋ค.
๋ชฉํ
- xyz ๊ณต๊ฐ ์์ ์ฌ๋ฌ 3D ๊ฐ์ฒด๋ฅผ ๊ตฌ์ฑํ๋ ์ฝ๋๋ฅผ ์์ฑํด ๋ณธ๋ค.
- ๊ณต๊ฐ ๊ตฌ์ฑ์ Scene Graph๋ฅผ ์ด์ฉํ๋ค.
- ํ์๊ณผ ์ง๊ตฌ, ๋ฌ์ ์์ ๊ณผ ๊ณต์ ์ ๊ตฌํํ๋ค.
Scene Graph๋ก 3D ๊ณต๊ฐ ๊ตฌ์ฑํ๊ธฐ
scene graph๋ฅผ ์ฝ๋๋ก ์์ฑํ๋ ๊ฒ = 3์ฐจ์ ๊ฐ์ฒด๋ฅผ ๊ณต๊ฐ์์ ๊ตฌ์ฑํ๋ค๋ ๊ฒ
** ํ์ดํ๋ ๋ถ๋ชจ → ์์์ ๋ปํ๋ค
- ๋ถ๋ชจ-์์ ๊ด๊ณ๋ก ๊ฐ Object3D์ ๊ณ์ธต ๊ตฌ์กฐ๋ฅผ ์ค๊ณํ๊ณ ๊ณต๊ฐ์ ๊ตฌ์ฑํ๋ค
- Mesh๊ฐ Object3D ์์ ๋ฐฐ์น๋๋ค.
PRACTICE: Scene graph๋ฅผ ์ฝ๋๋ก ๊ตฌํํ๊ธฐ
ํ์ ๋ง๋ค๊ธฐ
solarSystem
Object3D๋ฅผ ๋ง๋ค๊ณscene
์ ์ถ๊ฐํ๊ธฐ- solarSystem์ด Scene graph์ ์ต์๋จ์ ์์ผ๋ฏ๋ก scene์ ์ถ๊ฐํด ์ค๋ค.
const solarSystem = new THREE.Object3D(); this._scene.add(solarSystem);
- ๊ตฌ ํํ ์ง์ค๋ฉํธ๋ฆฌ ์์ฑ
const sphereGeometry = new THREE.SphereGeometry(radius, widthSegments, heightSegments);
- ํ์์ material ์ ์
const sunMaterial = new THREE.MeshPhongMaterial({ emissive: 0xffff00, flatShading: true, });
- ์ง์ค๋ฉํธ๋ฆฌ์ material๋ก ํ์ ๋ฉ์ฌ ์์ฑ, scale ์กฐ์ ,
solarSystem
์ ์ถ๊ฐ const sunMesh = new THREE.Mesh(sphereGeometry, sunMaterial); sunMesh.scale.set(3, 3, 3); solarSystem.add(sunMesh);
์ง๊ตฌ ๋ง๋ค๊ธฐ
earthOrbit
Object3D๋ฅผ ๋ง๋ค๊ณsolarSystem
์ ์ถ๊ฐ- Scene graph์์ earthOrbit์ solarSystem์ ์์์ด๋ฏ๋ก scene์ด ์๋๋ผ solarSystem์ ์ถ๊ฐ
- ํ์์ผ๋ก๋ถํฐ 10๋งํผ ๋จ์ด์ ธ ์๋๋ก earthOrbit์ ์์น๋ฅผ ์กฐ์ ํ๋ค.
const earthOrbit = new THREE.Object3D() earthOrbit.position.x = 10 // solarSystem์ผ๋ก๋ถํฐ 10๋งํผ ์ค๋ฅธ์ชฝ์ผ๋ก ์ด๋ solarSystem.add(earthOrbit)
- ๋์ผํ ๋ฐฉ์์ผ๋ก ์ง๊ตฌ์ ๋ฉ์ฌ๋ฅผ ์์ฑํ๊ณ earthOrbit์ ์ถ๊ฐ
const earthMesh = new THREE.Mesh(sphereGeometry, earthMaterial); earthOrbit.add(earthMesh);
๋ฌ ๋ง๋ค๊ธฐ
- moonOrbit Object3D๋ฅผ ๋ง๋ค๊ณ
earthOrbit
์ ์ถ๊ฐ- Scene graph์์ moonOrbit์ earthOrbit์ ์์์ด๋ฏ๋ก earthOrbit์ ์ถ๊ฐ
- ์ง๊ตฌ๋ก๋ถํฐ 2๋งํผ ๋จ์ด์ ธ ์๋๋ก moonOrbit์ ์์น๋ฅผ ์กฐ์ ํ๋ค.
const moonOrbit = new THREE.Object3D(); moonOrbit.position.x = 2; // earthOrbit์์ 2๋งํผ ์ค๋ฅธ์ชฝ์ผ๋ก ์ด๋ earthOrbit.add(moonOrbit);
- ๋์ผํ ๋ฐฉ์์ผ๋ก ๋ฌ์ ๋ฉ์ฌ๋ฅผ ์์ฑํ๊ณ moonOrbit์ ์ถ๊ฐ
const moonMesh = new THREE.Mesh(sphereGeometry, moonMaterial); moonMesh.scale.set(0.5, 0.5, 0.5); moonOrbit.add(moonMesh);
solarSystem์ y์ถ์ ๋ํ์ฌ ํ์ ์ํค๊ธฐ
render ๋ฉ์๋์์ ํธ์ถํ๋ update ๋ฉ์๋์์ solarSystem
์ rotation๊ฐ์ ๋ณ๊ฒฝํ๋ค
render(time) {
this._renderer.render(this._scene, this._camera); // renderer๊ฐ scene์ camera์ ์์ ์ผ๋ก ๋ ๋๋งํจ
this.update(time); // ์์ฑ๊ฐ์ ๋ณ๊ฒฝํ์ฌ ์ ๋๋ฉ์ด์
ํจ๊ณผ ๊ตฌํ
requestAnimationFrame(this.render.bind(this)); // render ๋ฉ์๋๋ฅผ ์ ๋นํ ์์ ์, ์ต๋ํ ๋น ๋ฅด๊ฒ ๋ฐ๋ณต ํธ์ถ
}
update(time) {
time *= 0.001; // ms -> s
this._solarSystem.rotation.y = time / 2
}
- time์ ๊ณ์ ์ฆ๊ฐํ๋ ๊ฐ์ด๋ฏ๋ก solarSystem์ด ๊ณ์ ํ์ ํ๊ฒ ๋๋ค
๊ฒฐ๊ณผ
์ง๊ตฌ๋ ํ์์ ์์์ด๊ณ ๋ฌ์ ์ง๊ตฌ์ ์์์ด๋ฏ๋ก ํ์์ ํ์ ์ ์ํฅ์ ๋ฐ๋๋ค.
- ํ์๋ฟ๋ง ์๋๋ผ ์ง๊ตฌ์ ๋ฌ๋ ํ์์ ์ค์ฌ์ผ๋ก ํ์ ํ๊ณ ์๋ค
- ์ง๊ตฌ์ ๋ฌ์ ๊ณต์ ๋ง ํ ๋ฟ ์์ง ์์ ํ๊ณ ์์ง๋ ์๋ค
์ง๊ตฌ์ ๋ฌ ์์ ์ํค๊ธฐ
update ๋ฉ์๋์ ๋ค์ ์ฝ๋๋ฅผ ์ถ๊ฐํ๋ค
this._earthOrbit.rotation.y = time * 2
this._moonOrbit.rotation.y = time * 5
์ต์ข ๊ฒฐ๊ณผ
- ๋ง์ฐฌ๊ฐ์ง๋ก ์ง๊ตฌ๋ฅผ ํ์ ์ํค๋ฉด ์ง๊ตฌ์ ์์์ธ ๋ฌ๋ ์ง๊ตฌ๋ฅผ ์ค์ฌ์ผ๋ก ํ์ ํ๋ค
์ ๋ฆฌ
- Scene graph๋ก 3์ฐจ์ ๊ฐ์ฒด ๊ณต๊ฐ์ ๊ตฌ์ฑํ ์ ์๋ค.
- Scene graph๋ฅผ ์ด์ฉํ๋ฉด 3์ฐจ์ ๊ฐ์ฒด๋ฅผ ์ํ๋ ๊ณต๊ฐ์ ๊ตฌ์ฑํ๊ธฐ ์ํด์ ๋ณต์กํ ์ํ์ ๋ณํ์์ ์ฌ์ฉํ์ง ์์๋ ๋๋ค.
- Object3D๋ ๊ณต๊ฐ ์์ ๋์ด๋ ํ๋์ ๊ทธ๋ฃน์ด๋ผ๊ณ ์ดํดํ๋ค.
๊ฐ๋ฐ์์๊ฒ ์ต์ํ ํธ๋ฆฌ ํํ๋ก ๊ณต๊ฐ์ ๊ตฌ์ฑํ๋ค๋ ์ ์ด ํฅ๋ฏธ๋ก์ ๋ค.
์ฌ๊ทธ๋ํ๋ 3D ๊ณต๊ฐ์ ๋ํ ์ค๊ณ๋์ด๋ค. ์ฌ๊ทธ๋ํ๋ฅผ ๋ฐ๋ผ๊ฐ๋ฉฐ ๋ถ๋ชจ ์์ ๊ด๊ณ๋ฅผ ์ฝ๋๋ก ๋ํ๋ด๋ ๊ณผ์ ์ด ์ฌ๋ฏธ์์๋ค.
'๐ฟ ์คํฐ๋' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[three.js] Material์ ํ ์ค์ณ๋ฅผ ์ ํ๋ณด์ (0) | 2023.06.09 |
---|---|
[three.js] Material - ์ค๋ธ์ ํธ์ ์ฌ์ง์ ๋ค์ํ๊ฒ ์ค์ ํด๋ณด์ (0) | 2023.06.09 |
[ํด๋ฆฐ์ฝ๋] 3์ฅ ํจ์ with Typescript (0) | 2023.06.03 |
[three.js] ๋ค์ํ ์ง์ค๋ฉํธ๋ฆฌ ์ฌ์ฉํด ๋ณด๊ธฐ (0) | 2023.06.01 |
[ํด๋ฆฐ์ฝ๋] 2์ฅ ์๋ฏธ์๋ ์ด๋ฆ with Typescript (0) | 2023.05.28 |