์ค๋์ ์ด์ด์ Part3 [Three.js ๊ธฐ์ด]์ Chapter02 3Dํ๋ธ ๊ฐ์๋ฅผ ๋ค์์ต๋๋ค.(08~10๊ฐ)
๊ทธ๋ผ ์ค๋ ๊ฐ์์์ ๋ฐฐ์ด ๋ด์ฉ๋ค์ ๊ฐ๋ตํ๊ฒ ์์ฑํด ๋ณผ๊ฒ์!
8, 9 ๊ฐ์ threejs ๋ฌธ์์์ Material๊ณผ Camera ์ฌ์ฉ๋ฒ๊ณผ ์์๋ฅผ ๊ฐ์ด ์ดํด๋ณด์์ต๋๋ค.
https://threejs.org/docs/index.html#api/en/materials/LineBasicMaterial
three.js docs
threejs.org
๐01. Material ์ดํด๋ณด๊ธฐ
LineBasicMaterial
- ์ ํํ์ ์ค๋ธ์ ํธ๋ฅผ ํํํ ๋ ์ฌ์ฉํ ์ ์์ต๋๋ค.
MeshBasicMaterial
- ์กฐ๋ช ์ ์ํฅ์ ๋ฐ์ง ์๊ธฐ ๋๋ฌธ์ ๋น ์ ๋ฌด์ ์๊ด์์ด ์ ๋ณด์ด๋ ์์ํํ์ด ๋์ง ์์ต๋๋ค.
MeshMaterial Properties
- transparent์ opacity๋ฅผ ํจ๊ป ์ค์ ํด์ผ ์ ์ฉ์ด ๋ฉ๋๋ค.
const material = new THREE.MeshStandardMaterial({
color: new THREE.Color(0xcc99ff),
transparent: true,
opacity: 0.5
})
- visible ๊ฐ์ ํตํด ๋ฉ์ฌ์ ๊ฐ์์ฑ์ ์ค์ ํ ์ ์์ต๋๋ค.
- wireframe: Material์ ๋ผ๋๋ฅผ ๋ณด์ด๊ฒ ํ ์ ์์ต๋๋ค.
- side: ๋ํ์ ์ด๋ค ๋ฉด์ ๋ ๋๋งํ ์ง ์ค์ ํ ์ ์์ต๋๋ค. (default: FrontSide)
* ์๋ฉด ๋ ๋๋ง(DoubleSide)์ ๋ ๋ง์ ์ปดํจํฐ ๋ฆฌ์์ค๊ฐ ํ์ํ๋ฏ๋ก ํ์์๋ฐ๋ผ ์ ์ ํ ์ ํ
const material = new THREE.MeshStandardMaterial({
color: new THREE.Color(0xcc99ff),
transparent: true,
opacity: 0.5
side: THREE.BackSide
})
- ์ธ์คํด์ค ์์ฑ ํ์๋ ์ง์ ์์ฑ ๋ณ๊ฒฝ์ด ๊ฐ๋ฅํฉ๋๋ค.
material.color = new THREE.color(0x00c896);
๋ค์ Material๋ค์ ๋น์ ๋ฐ์ํ๋ Material๋ค(๋ฐ์ฌ, ๊ตด์ , ๋ช ์ ํจ๊ณผ ๋ฑ)์ ๋๋ค.
MeshLambertMaterial
- emissive: material์ด ์์ฒด์ ์ผ๋ก ๋ด๋ฟ๋ ์ ๋ณ๊ฒฝ
- envMaps: mesh์ ์ฃผ๋ณ ํ๊ฒฝ์ ๋ฉํฐ๋ฆฌ์ผ์ ๋น์ถฐ๋ณด์ด๊ฒ ํ ์ ์์ต๋๋ค. (reflection: ๋ฐ์ฌ, refraction: ๊ตด์ )
- *๋ฐ์ฌ์ ํํ์ ํ๊ณ ์์.
MeshPhongMaterial
- MeshLambertMaterial๋ณด๋ค ๋น์ ์ํด ์๊ธฐ๋ ๋ฐ์ฌ์ ํํ์ด ์ข ๋ ์์ฐ์ค๋ฌ์
MeshStandardMaterial
- PBR(Physically based rendering) ๋ฌผ๋ฆฌ๊ธฐ๋ฐ ๋ ๋๋ง ๋ฐฉ์ ์ฌ์ฉ. ์ด ๋ฐฉ์์ด ๋ค๋ฅธ Unity๋ Unreal 3D ์ฑ์์ ์ฌ์ฉํ๋ ํ์ค๋ฐฉ์์ด ๋์๋ค๊ณ ํ์ฌ ์ด๋ฆ์ด standard material์ด๋ผ๊ณ ํฉ๋๋ค.
- roughness: ์ฌ์ง์ ๊ฑฐ์น ๊ธฐ ์ค์ (1์ ๊ฐ๊น์ธ์๋ก ๊ฑฐ์น ์ด์ง)
- metalness: ์ฌ์ง์ ๊ธ์์ฑ ์ค์
* ํํํ ์์ญ์ด ๋ง์๋งํผ ์ฑ๋ฅ์ด ๋จ์ด์ง. ๋ค์ํ ์ ์ฌ์ ํ๊ฒฝ์ ์ง์ํ๋ ค๋ฉด ํ์์ ๋ฐ๋ผ ์ ์ ํ ์ ํํด์ผํจ
MeshToonMaterial
- ๋งํ ๋๋ ํํํ ์ ์๋ material
๐02. Camera ์ดํด๋ณด๊ธฐ
PerspectiveCamera
- ์ฌ๋์ ๋์ด ๋ณด๋ ๊ฒ๊ณผ ๋น์ทํ ๋ฐฉ์์ผ๋ก ์๊ทผ๊ฐ์ ๊ตฌํํ ์นด๋ฉ๋ผ๋ก, ์์ฃผ ์ฌ์ฉํ๋ ์นด๋ฉ๋ผ์ ๋๋ค.
์๋๋ ์ ๋ฒ ํฌ์คํธ์๋ ์ฌ๋ ธ์ง๋ง ๋ณต์ต๊ฒธ ์ถ๊ฐํฉ๋๋ค!
- fov: field of view(์์ผ๊ฐ). ์นด๋ฉ๋ผ๋ก ์ฅ๋ฉด์ ๋น์ถ ๋ ์ผ๋งํผ์ ์์ผ๊ฐ์ผ๋ก ๋ฐ๋ผ๋ณผ์ง๋ฅผ ์ค์ ํฉ๋๋ค. fov๊ฐ์ด ์ปค์ง๋ฉด ์นด๋ฉ๋ผ์ ๋ ๋ง์ ๋ฒ์๊ฐ ๋ด๊น๋๋ค.
- aspect: ์ข ํก๋น
- near: ์ผ๋ง๋ ๊ฐ๊น์ด, ๋ฉ๋ฆฌ ๋ณผ์ง๋ฅผ ์ค์ ํฉ๋๋ค. ์ด ๋ฒ์๋ฅผ ๋ฒ์ด๋๋ฉด ์นด๋ฉ๋ผ์ ๋ ๋๋ง ๋์ง ์์ต๋๋ค. ํ์๊ฐ์ ์๋๋ ์ฑ๋ฅ๊ณผ๋ ๊ด๋ จ์์ด, ๋ถํ์ํ ๋ฌผ์ฒด๋ ๋ ๋๋ง๋์ง ์๊ฒ ํ๋ ๊ฒ ์ข์ต๋๋ค.
๐ updateProjectionMatix
- ๋ชจ๋ ์ข ๋ฅ ์นด๋ฉ๋ผ์ ๊ณตํต์ผ๋ก ์๋ ๋ฉ์๋๋ก, ์นด๋ฉ๋ผ ์์ผ๊ฐ, ์ข ํก๋น ๋ฑ์ ์์ฑ ๋ณ๊ฒฝ ์ ์ด ๋ฉ์๋๋ฅผ ํธ์ถํด์ค์ผ ์ ์์ ์ผ๋ก ์ ์ฉ๋ฉ๋๋ค.
OrthorgraphicCamera
- ์๊ทผ๊ฐ์ด ์ ๊ฑฐ๋ ์นด๋ฉ๋ผ
- ์คํํฌ๋ํํธ, ๋กค๊ณผ ๊ฐ์ ๊ฒ์ ๋ง๋ค ๋ ์ฌ์ฉ
10๊ฐ์์๋ ๋ธ๋ผ์ฐ์ ์ฌ์ด์ฆ์ ๋ฐ๋ผ ๋ ๋๋ฌ ํฌ๊ธฐ๋ ํจ๊ป ์ ๋ฐ์ดํธ๋ ์ ์๋๋ก ์์ ํ๋ ๋ฒ์ ๋ฐฐ์ ์ต๋๋ค.
๐03. Rerender ๋ฆฌ์ฌ์ด์งํด๋ณด๊ธฐ
const handleResize = () => {
// ๋ธ๋ผ์ฐ์ ๋๋น, ๋์ด ๋น์จ๋ก ์นด๋ฉ๋ผ ์ข
ํก๋น ์ฌ์ค์
camera.aspect = window.innerWidth / window.innerHeight;
// UpdateProjectionMatrix()๊น์ง ํธ์ถํด์ผ ์นด๋ฉ๋ผ์ ๋ฐ์๋จ
camera.updateProjectionMatrix();
// ๋ ๋๋ฌ ์ฌ์ด์ฆ ๋ณ๊ฒฝ
renderer.setSize(window.innerWidth, window.innerHeight);
// ์๋กญ๊ฒ ๋ ๋๋ ๊ฒฐ๊ณผ๋ฅผ ํ๋ฉด์ ๋ฐ์
renderer.render(scene, camera);
};
window.addEventListener("resize", handleResize);
โจ์ค๋์ ํ์ต ์ธ์ฆ ์ท
๋ณธ ํฌ์คํ ์ ํจ์คํธ์บ ํผ์ค ํ๊ธ ์ฑ๋ฆฐ์ง ์ฐธ์ฌ๋ฅผ ์ํด ์์ฑํ์์ต๋๋ค.
https://fastcampus.co.kr/event_online_challenge_2401_mission
์ปค๋ฆฌ์ด ์ฑ์ฅ์ ์ํ ์ต๊ณ ์ ์ค๋ฌด๊ต์ก ์์นด๋ฐ๋ฏธ | ํจ์คํธ์บ ํผ์ค
์ฑ์ธ ๊ต์ก ์๋น์ค ๊ธฐ์ , ํจ์คํธ์บ ํผ์ค๋ ๊ฐ์ธ๊ณผ ์กฐ์ง์ ์ค์ง์ ์ธ '์ (ๆฅญ)'์ ์ฑ์ฅ์ ๋๊ณ ์ ๋ชจ๋ ์ข ๋ฅ์ ๊ต์ก ์ฝํ ์ธ ์๋น์ค๋ฅผ ์ ๊ณตํ๋ ๋ํ๋ฏผ๊ตญ No. 1 ๊ต์ก ์๋น์ค ํ์ฌ์ ๋๋ค.
fastcampus.co.kr