์ค๋์ ์ด์ด์ Part3 [Three.js]์ Chapter04 ์ธํฐ๋ ํฐ๋ธ ์นด๋ ๊ฐ์๋ฅผ ๋ค์์ต๋๋ค.(07~08๊ฐ)
๊ทธ๋ผ ์ค๋ ๊ฐ์์์ ๋ฐฐ์ด ๋ด์ฉ๋ค๊ณผ ๋๋์ ์ ๊ฐ๋ตํ๊ฒ ์์ฑํด ๋ณผ๊ฒ์!
๐01. ExtrudeGeometry๋ฅผ ์ฌ์ฉํ์ฌ 3D ์์๋ก ๋ง๋ค๊ธฐ
์ง๋ ์๊ฐ์ ์ฌ์ฉํ shapeGeometry๋ 2์ฐจ์ ํํ์ ๋ํ๋ง ๊ทธ๋ฆด ์ ์๊ณ ๋ํ์ ๊น์ด๊ฐ์ ๋ํด ์ฃผ๋ ค๋ฉด ExtrudeGeometry๋ฅผ ์ด์ฉํ์๋ฉด ๋ฉ๋๋ค.
extrude geometry๋ฅผ ์ฌ์ฉํ๋ฉด depth, ๊ฒฝ์ฌ๋ฉด๊ณผ ๊ด๋ จ๋ ๋ค์ํ ์ต์ (ex: bevelThickness)๋ค์ ์ค์ ํ ์ ์์ต๋๋ค.
์์ธํ ๋ด์ฉ์ ๋ฌธ์๋ฅผ ์ฐธ๊ณ ํด์ฃผ์ธ์!
https://threejs.org/docs/index.html?q=extrude#api/en/geometries/ExtrudeGeometry
three.js docs
threejs.org
const geometry = new THREE.ExtrudeGeometry( shape, extrudeSettings );
extrudeGeometry์ ์ฒซ๋ฒ์งธ ์ธ์๋ก๋ ์ง๋๋ฒ์ ์ ์ํ shape ์ธ์คํด์ค๋ฅผ, ๋๋ฒ์งธ์ธ์๋ก๋ 3d์์๋ก ๋ณด์ด๊ฒํ๋ ๋ค์ํ ์ต์ ๋ค์ ์ถ๊ฐํด์ค ์ ์์ต๋๋ค.
shapeGeometry๋ฅผ ๋ณ๋ค๋ฅธ ์ต์ ๊ฐ์์ด ExtrudeGeometry๋ก ๋ณ๊ฒฝํด์ฃผ์๋ฉด ์๋์ฒ๋ผ ๋ณด์ด๊ฒ ๋ฉ๋๋ค.
3D์์์ฒ๋ผ ๋ณ๊ฒฝ๋์์ผ๋ ์ฐ๋ฆฌ๊ฐ ์๊ฐํ๋ ์นด๋๋ชจ์๊ณผ๋ ๋ค๋ฅด๊ธฐ ๋๋ฌธ์ ๋ช๊ฐ์ง ์ต์ ๋ค์ ์ถ๊ฐํด๋ณผ๊ฒ์
const geometry = new THREE.ExtrudeGeometry(shape, {
depth: 0.01, // ์นด๋ ๋๊ป
bevelThickness: 0.1, // ๊ฒฝ์ฌ๋ฉด์ ๊ฐ์ง ์ ๋(default: 0.2)
});
extrude setting option์ ์ถ๊ฐํ๋ฉด ์๋์ฒ๋ผ ๋ณด์ด๊ฒ ๋ฉ๋๋ค!
๋๊ป๊ฐ ์์์ง๊ณ ๊ฒฝ์ฌ๋ฉด๋ ํจ์ฌ ๋งค๋๋ฝ๊ฒ ๋ณํ ๊ฒ์ ํ์ธํ ์ ์์ต๋๋ค.
๐02. OrbitControls ๋ณ๊ฒฝ
์ง๋ ์๊ฐ์ OrbitControls์ ๋ํด ๋ฐฐ์ ์ต๋๋ค. OrbitControls๋ฅผ ์ฌ์ฉํ๋ฉด ์นด๋ฉ๋ผ๊ฐ ๋์ ์ฃผ์๋ฅผ ๋๋ฉฐ ๊ณต์ ํ๊ธฐ ๋๋ฌธ์ ๋ง์น ๋์์ด ์์ง์ด๋ ๊ฒ์ฒ๋ผ ๋ณด์ด๊ฒ ํ ์ ์๋๋ฐ์, ์ค๋์ ์ง๋ ์ค์ ์ ์ด์ด ์๋ ๋๊ฐ์ง ์ค์ ์ ์ถ๊ฐํด๋ณด๊ฒ ์ต๋๋ค.
- ์นด๋ฉ๋ผ๊ฐ ์ค์ค๋ก ํ์ ํ๋ ๊ฒ์ฒ๋ผ ๋ณด์ด๊ฒ ํ๊ธฐ
- ์นด๋ฉ๋ผ ํ์ ์๋ ์ค์
- ํ๋ฉด์ ์ง์ ๋๋๊ทธํ ๋ ํ์ ์๋
- ์นด๋ฉ๋ผ๊ฐ ๋ฉ์ท์ ๋ ์ ์ฉ๋ ๊ด์ฑ ์๋
- ์ค ๊ธฐ๋ฅ ๋นํ์ฑํ
- ํ์ ์ต์, ์ต๋๊ฐ๋ ์ค์
const controls = new OrbitControls(camera, renderer.domElement);
controls.autoRotate = true;
controls.autoRotateSpeed = 2.5;
controls.rotateSpeed = 0.75; // default:1
controls.enableDamping = true;
controls.enableZoom = false;
controls.minPolarAngle = Math.PI / 2 - Math.PI / 3; // default: 0 ~ 180
controls.maxPolarAngle = Math.PI / 2 + Math.PI / 3; // default: 0 ~ 180
orbitcontrols์ ์ต์ ์ ์ ์ฝ๋๋ก ๋ณ๊ฒฝํ ์ ์๋๋ฐ์, ์นด๋ฉ๋ผ ์ค์ ์ ๋ณ๊ฒฝํ์ ๋์ ๋ง์ฐฌ๊ฐ์ง๋ก ์ค์ ๋ณ๊ฒฝํ์๋ ๊ผญ update ํจ์๋ฅผ ํธ์ถ์์ผ์ผํฉ๋๋ค. ๋ฐ๋ผ์ renderํจ์์ ์๋์ฒ๋ผ controls.update() ๋ฌธ์ ์ถ๊ฐํด์ค๋๋ค .
function render() {
renderer.render(scene, camera);
controls.update();
requestAnimationFrame(render);
}
OrbitControls์ ๋ํ ๋ด์ฉ์ ์๋ ๋ฌธ์๋ฅผ ์ฐธ๊ณ ํด์ฃผ์ธ์
https://threejs.org/docs/#examples/ko/controls/OrbitControls
three.js docs
threejs.org
๋ง์ง๋ง์ผ๋ก ์นด๋๊ฐ ๊ฐ๋งํ ํ์ ํ๋ ๊ฒ ๋ฐ๋ฐํด ๋ณด์ด๋ฏ๋ก, z์ถ๋ฐฉํฅ์ผ๋ก ์ด์ง ๊ธฐ์ธ์ด์ ธ ๋ณด์ด๊ฒ ์ค์ ํด๋ณด๊ฒ ์ต๋๋ค.
const card = new Card({
width: 10,
height: 15.8,
radius: 0.5,
color: "#0077ff",
});
card.mesh.rotation.z = Math.PI * 0.1;
scene.add(card.mesh);
์ ์ฝ๋๋ฅผ ์ถ๊ฐํ๋ฉด ์๋์ ๊ฐ์ด ๋ณด์ด๊ฒ ๋ฉ๋๋ค.
๋ฌผ์ฒด ๊ธฐ์ธ์ด๋ ์ฝ๋์์ Card๊ฐ์ฒด์ Mesh๊ฐ์ ๋ณด๊ณ ์๊ฐ์ ์ผ๋ก mesh์ ์ ์๊ฐ ํท๊ฐ๋ ค ์ง๋ ๊ฐ์ ๋ด์ฉ์ ๋ค์ ์ฐพ์๋ณด์์ต๋๋ค.ใ ใ ์ญ์ ์ฃผ๊ธฐ์ ์ผ๋ก ๋ณต์ต์ ํด์ค์ผํ๋ ๊ตฐ์ ใ ใ ... Geometry๋ ๋ฌผ์ฒด ๋ํ, ํํ๋ฅผ Material์ ๋ฌผ์ฒด์ ์ง๊ฐ์ ๊ทธ๋ฆฌ๊ณ Mesh๋ ์ด ๋์ props๋ก ๋ฐ์ ํ๋์ ํํ๋ฅผ ๋ง๋ ๋ค๋ ๊ฒ์ ์์ง๋ง์์ผ๊ฒ ์ต๋๋ค.
๋ณด๋ฉด์ ํญ์ ์๋์ฝ๋๊ฐ ๋ฐ๋ณต๋๋ ๊ฒ ๊ฐ์์.
const geometry = new THREE.Geometry();
const material = new THREE.Material();
const mesh = new THREE.mesh(geometry, material);
scene.add(mesh)
๊ทธ๋ฆฌ๊ณ orbitcontrols์ angle ์ค์ ๊ด๋ จํด์๋ ์ข ๋ ์ฐพ์๋ดค์ต๋๋ค. ์ฌ์ค polarAngle, AzimuthAngle ์ด๋ผ๋ ๋จ์ด๊ฐ ์ข ์์ํด์์
ใ ใ AzimuthAngle์ ํํ๋งํ๋ ๋ฐฉ์๊ฐ์ผ๋ก Three.js์์๋ ์ํ์ผ๋ก ์ผ๋ง๋ ๋ณผ์์๊ฒ ์ค์ ํ ์ง๋ฅผ ๋ํ๋ด๊ณ , polarAngle์ ์์ง๋ฐฉํฅ์ผ๋ก ์ผ๋ง๋ ๋ฉ๋ฆฌ ๋ฐ๋ผ๋ณด๊ฒํ ์ง๋ฅผ ์ค์ ํ ์ ์์ต๋๋ค.
์ฐธ๊ณ ๋ก polar๋ผ๋ ๋จ์ด๋ฅผ polar bear๋ก ๊ธฐ์ตํ์ด์ ๋ง์ฐํ ๋ถ๊ทน(...)์ด๋ผ๊ณ ๋ง ์๊ฐ๋์ด ๋ถ๊ทน๊ฐ๋..๊ทน๊ฐ๋..?๊ฐ ๋ฌด์จ์๋ฏธ์ผ๊น ํ๋๋ฐ
์ด๋ฏธ์ง๋ฅผ ์ฐพ์๋ณด๋ ์ข ๋ ๋ช ํํ๊ฒ ์ดํด๊ฐ ๋๋ ๊ฒ ๊ฐ์ต๋๋ค. ๋ญ๊ฐ ์์ง๋ฐฉํฅ์ ๊ทน์ ์ ์๋ฏธํ๋ ๊ฒ ์๋๊ฐ ์ถ๋ค์.
๋ง์ง๋ง์ผ๋ก shape์ ๋ํด์๋ ์ฐพ์๋ณด์์ต๋๋ค. ์ด์ ์ ์ฌ์ฉํ๋ geometry์์๋ Shape๋ฅผ ๋ฐ๋ ๋ถ๋ถ์ด ๋ฐ๋ก ์์๋ ๊ฒ ๊ฐ์์์..! (*geometry์ ์ฒซ๋ฒ์งธ ์ธ์ ํ์ ์ geometry๋ง๋ค ๋ค๋ฅด๋ค์..!)
shape๋ ์ ๊ณผ ์์ ์ฌ์ฉํ์ฌ ๋ง๋ 2d ํ์์ผ๋ก ๊ฐ์์์ ๋์จ ExtrudeGeometry๋ ShapeGeometry์ ํจ๊ป ์ฌ์ฉํ ์ ์๋ค๊ณ ํ๋ค์..! Three.js๋ ์ ๊ณตํ๋ ๊ธฐ๋ฅ์ด ์๋ ๋ฐฉ๋ํ๋ค๋ณด๋ ํธํ๊ธฐ๋ ํ์ง๋ง ํ๋ํ๋ ๋ฐฐ์๋๊ฐ ๊ฒ๋ ์๊ฐ๋ณด๋ค ๋ง์ ๊ฒ ๊ฐ์ต๋๋ค.
โจ์ค๋์ ํ์ต ์ธ์ฆ ์ท
๋ณธ ํฌ์คํ ์ ํจ์คํธ์บ ํผ์ค ํ๊ธ ์ฑ๋ฆฐ์ง ์ฐธ์ฌ๋ฅผ ์ํด ์์ฑํ์์ต๋๋ค.
https://fastcampus.co.kr/event_online_challenge_2401_mission
์ปค๋ฆฌ์ด ์ฑ์ฅ์ ์ํ ์ต๊ณ ์ ์ค๋ฌด๊ต์ก ์์นด๋ฐ๋ฏธ | ํจ์คํธ์บ ํผ์ค
์ฑ์ธ ๊ต์ก ์๋น์ค ๊ธฐ์ , ํจ์คํธ์บ ํผ์ค๋ ๊ฐ์ธ๊ณผ ์กฐ์ง์ ์ค์ง์ ์ธ '์ (ๆฅญ)'์ ์ฑ์ฅ์ ๋๊ณ ์ ๋ชจ๋ ์ข ๋ฅ์ ๊ต์ก ์ฝํ ์ธ ์๋น์ค๋ฅผ ์ ๊ณตํ๋ ๋ํ๋ฏผ๊ตญ No. 1 ๊ต์ก ์๋น์ค ํ์ฌ์ ๋๋ค.
fastcampus.co.kr