5๊ฐ ์ฌ์ง part4 - ํ ์ค์ณ2
์ ๋ฒ ์๊ฐ์๋ Material์ map ์์ฑ์ผ๋ก ์ด๋ฏธ์ง๋ฅผ ํ ์ค์ณ๋ก ๋ง๋ค์ด ์ ํ๊ณ , ์ด ํ ์ค์ณ์ ์ฌ๋ฌ ๊ฐ์ง ์์ฑ์ ๋ค๋ค๋ณด์๋ค.
์ด๋ฒ ์๊ฐ์๋ ๋ค์ํ map์ ํตํด ๋ ์ธ๋ฐํ๊ฒ ํ ์ค์ณ๋ฅผ ๊ณ ๋ํํ๋ ๋ฐฉ๋ฒ์ ๋ฐฐ์๋ณธ๋ค.
์ค๋นํ๊ธฐ
์ฐ์ตํ๊ธฐ ์ , ์ฌ์ฉํ ํ ์ค์ณ ์ด๋ฏธ์ง๋ฅผ ์ค๋นํด์ผ ํ๋ค.
์ฌ๊ธฐ์์ ํ ์ค์ณ ์ด๋ฏธ์ง๋ฅผ ๋ค์ด๋ก๋ํ๋ค.
[Glass Window 002
Glass Window 002 – Free seamless texture, 1024 x 1024, with the following maps: Diffuse Normal Displacement Roughness Ambient Occlusion Opacity
3dtextures.me](https://3dtextures.me/2020/07/15/glass-window-002/)
ํด๋น ์ด๋ฏธ์ง์ ํด์๋์ map ์์ฑ์ ์ง์ ํ ์ ์๋ ์ด๋ฏธ์ง๊ฐ ์ด๋ค ๊ฒ์ด ํฌํจ๋์ด ์๋์ง ์ ์ ์๋ค.
TextureLoader๋ก ์ด๋ฏธ์ง ํ์ผ์์ ํ ์ค์ณ ๊ฐ์ ธ์ค๊ธฐ
TextureLoader๋ฅผ ์ด์ฉ
const textureLoader = new THREE.TextureLoader();
const map = textureLoader.load("/assets/images/glass/Glass_Window_002_basecolor.jpg");
const mapAO = textureLoader.load("/assets/images/glass/Glass_Window_002_ambientOcclusion.jpg");
const mapHeight = textureLoader.load("/assets/images/glass/Glass_Window_002_height.png");
const mapNormal = textureLoader.load("/assets/images/glass/Glass_Window_002_normal.jpg");
const mapRoughness = textureLoader.load("/assets/images/glass/Glass_Window_002_roughness.jpg");
const mapMetalic = textureLoader.load("/assets/images/glass/Glass_Window_002_metallic.jpg");
const mapAlpha = textureLoader.load("/assets/images/glass/Glass_Window_002_opacity.jpg");
map ์์ฑ๋ง ์ ์ฉํ์ ๋
const material = new THREE.MeshStandardMaterial({
map: map,
});
- ์ ์ฒด๊ฐ์ด ๋๋ ทํ์ง ์๋ค.
normalMap
- ๋ฒ์ ๋ฒกํฐ๋ฅผ ์ด๋ฏธ์งํํ ๊ฒ
- ๋ฒ์ ๋ฒกํฐ๋ ๋ฉ์ฌ์ ํ๋ฉด์ ๋ํ ์์ง ๋ฒกํฐ๋ก, ๊ด์์ ์ํฅ์ ๊ณ์ฐํ๋ ๋ฐ ์ฌ์ฉํ๋ค.
const material = new THREE.MeshStandardMaterial({
map: map,
normalMap: mapNormal
});
- map๋ง ์ ์ฉํ์ ๋๋ณด๋ค ์ ์ฒด๊ฐ์ด ๋ณด์ธ๋ค.
normalMap์ด ์ ์ฒด๊ฐ์ ๋ถ์ฌํ๋ ๋ฐฉ์
normalMap๋ง ์ ์ฉํ๊ณ ๋ฒ์ ๋ฒกํฐ๋ฅผ ์๊ฐํํ๋ฉด ๋ค์๊ณผ ๊ฐ์ด ๋ณด์ธ๋ค.
๋ณธ๋ ์ง์ ๋์ง ์์ ํน์ ์ง์ ์ ๋ํ ๋ฒ์ ๋ฒกํฐ๋ ๊ตฌ์ฑ ์ขํ์ ๋ฒ์ ๋ฒกํฐ๋ค์ ์ด์ฉํด ๋ณด๊ฐ ๊ณ์ฐ๋๋ค.
ํ์ง๋ง normalMap์ ์ฌ์ฉํ๋ฉด ๋ฐ์ค ํ๋ฉด์ ๋ฒ์ ๋ฒกํฐ๋ฅผ normalMap ์ด๋ฏธ์ง์ RGB ๊ฐ์ ์ด์ฉํด ๊ณ์ฐํ๊ฒ ๋๋ค. ๋ฐ๋ผ์,
- ๋ฉ์ฌ ํ๋ฉด์ ๊ฐ ํฝ์ ์ ๋ํด ๋ฒ์ ๋ฒกํฐ๋ฅผ ์ง์ ํ ์ ์๋ค
- ๊ฐ ํฝ์ ๋จ์๋ก ๊ด์ ํจ๊ณผ๊ฐ ๋ฌ๋ผ์ ธ ์ ์ฒด๊ฐ์ ํํํ ์ ์๊ฒ ๋๋ค.
normalMap์ ์ง์ค๋ฉํธ๋ฆฌ ์ขํ๋ฅผ ๋ณํํ์ง๋ ์๋๋ค. ์ผ์ข ์ ์ฐฉ์ ํจ๊ณผ๋ฅผ ์ด์ฉํด ์ ์ฒด๊ฐ์ ๋ถ์ฌํ๋ค.
๋ฐ๋ผ์ ์ง์ค๋ฉํธ๋ฆฌ์ ๋งค์ฐ ์ ์ ์ขํ ๊ตฌ์ฑ๋ง์ผ๋ก๋ ์ ์ฒด๊ฐ์ ํจ๊ณผ์ ์ผ๋ก ํํํ ์ ์๋ค.
displacementMap
- normalMap๊ณผ ๋ฌ๋ฆฌ ์ง์ค๋ฉํธ๋ฆฌ ์ขํ๋ฅผ ๋ณํ์์ผ ์ ์ฒด๊ฐ์ ํํํ๋ค.
- ๋งต ์ด๋ฏธ์ง์ ํฝ์ ๊ฐ์ด ๋ฐ์์๋ก ์ขํ์ ๋ณ์๊ฐ ์ปค์ง๊ฒ ๋๋ค.
- ์ง์ค๋ฉํธ๋ฆฌ ์ขํ๋ฅผ ๋ณํ์ํค๊ธฐ ๋๋ฌธ์ ๋ฉ์ฌ ํ๋ฉด์ ๋ํ ๊ตฌ์ฑ ์ขํ๋ฅผ ์ ๊ณตํ์ฌ์ผ ํ๋ค.
์๋ ๊ฒฐ๊ณผ๋ฌผ์ box segment๊ฐ์ 256, sphere segment๊ฐ์ 512๋ก ์ค์ ํ์๋ค.
const material = new THREE.MeshStandardMaterial({
normalMap: mapNormal,
displacementMap: mapHeight,
displacementScale: 0.2,
displacementBias: -0.15
});
displacementScale
,displacementBias
: ๋ณ์๋ฅผ ์กฐ์ ํ ์ ์๋ ์์ฑ
displacementMap๋ฅผ ํจ๊ณผ์ ์ผ๋ก ์ฌ์ฉํ๋ ค๋ฉด
์ง์ค๋ฉํธ๋ฆฌ ํ๋ฉด์ ์ฌ๋ฌ ๊ฐ์ ์ธ๊ทธ๋จผํธ๋ก ๋ถํ ํด์ฃผ์ด์ผ ํ๋ค. ๋ง์ ์ธ๊ทธ๋จผํธ๋ก ๋ถํ ๋ ์๋ก ๋งต ํจ๊ณผ๊ฐ ์ ์ ์ฉ๋๋ค.
ํ์ง๋ง ์ขํ๋ฅผ ๋ ๋ง์ด ์ถ๊ฐํ๋ ๊ฒ์ ๋ ๋๋ง ์๋ ๋ฉด์์ ๋นํจ์จ์ ์ด๋ฏ๋ก ์ ์ ํ ๋ ธ๋ง ๋งต๊ณผ displacementMap ํจ๊ณผ๋ฅผ ์ํ ์ ์ ํ ์ธ๊ทธ๋จผํธ ๋ถํ ์ด ํ์
aoMap
- ํ ์ค์ณ ์ด๋ฏธ์ง์ ๋ฏธ๋ฆฌ ์์ ํจ๊ณผ๋ฅผ ๊ทธ๋ ค ๋ฃ์ ๊ฒ
const material = new THREE.MeshStandardMaterial({
map,
normalMap: mapNormal,
displacementMap: mapHeight,
displacementScale: 0.2,
displacementBias: -0.15,
aoMap: mapAO,
aoMapIntensity: 1 // ๊ทธ๋ฆผ์ ๊ฐ๋ ์ง์
});
aoMap์ ์ฌ์ฉํ ์ ์ ์ํ ์
aoMap ํจ๊ณผ๋ฅผ ๋ด๋ ค๋ฉด ๋ ๊ฐ์ง ์์ ์ด ํ์ํ๋ค.
- scene์
AmbientLight
์ถ๊ฐ: ๋ชจ๋ mesh์ ์ ์ฒด ๋ฉด์ ๋ํด์ ๊ท ์ผํ๊ฒ ๋น์ถ๋ ๊ด์ - ์ง์ค๋ฉํธ๋ฆฌ ์์ฑ์ uv2 ๋ฐ์ดํฐ ์ง์
box.geometry.attributes.uv2 = box.geometry.attributes.uv sphere.geometry.attributes.uv2 = sphere.geometry.attributes.uv
aoMap์ ์ด์ฉํ๋ฉด ๋ฏธ๋ฆฌ ๋ง๋ค์ด์ง ์ธ๋ฐํ ๊ทธ๋ฆผ์ ํจ๊ณผ๋ฅผ ์ง์ ํ ์ ์๋ค.
roughnessMap
- ๊ฑฐ์น ๊ธฐ์ ๋ํ ์ฌ์ง ์ ์ฉ
- ๋งต ์ด๋ฏธ์ง์ ํฝ์ ๊ฐ์ด ๋ฐ์์๋ก ๊ฑฐ์น ๊ธฐ๊ฐ ๊ฐํด์ง
roughness
์์ฑ์ผ๋ก ๊ฑฐ์น ๊ธฐ ์กฐ์ - ๋ฎ์์๋ก ๋ฐ์ง์ด๋ ํ๋ผ์คํฑ ๋๋์ด ๋๋ค
metalnessMap
- ๊ธ์ ์ฌ์ง์ ๋ํ ๋๋์ ๋ถ์ฌํ๋ ๋งต
metalness
์์ฑ์ผ๋ก ์กฐ์ (๊ธฐ๋ณธ๊ฐ: 0)
alphaMap
- ํฌ๋ช ๋์ ๋ํ ๋งต ์์ฑ
- ์ด๋ฏธ์ง์ ํฝ์ ๊ฐ์ด ๋ฐ์์๋ก ๋ถํฌ๋ช ํ๊ฒ ๋๋๋ฐ ํฝ์ ๊ฐ์ด ์์ ํ ๊ฒ์์์ผ ๋ ์์ ํ ํฌ๋ช
transparent: true
์์ฑ์ ์ค์ ํฌ๋ช ๋๋ฅผ ํ์ฑํํด์ฃผ์ด์ผ ํจ- ๋ฉ์ฌ์ ๋ท๋ฉด๋ ๋ ๋๋ง ํด์ผ ๋๊ธฐ ๋๋ฌธ์
side: THREE.DoubleSide
์ถ๊ฐ
- ๋ฉ์ฌ์ ๋ท๋ฉด๋ ๋ ๋๋ง ํด์ผ ๋๊ธฐ ๋๋ฌธ์
lightMap
- ์ง์ ๋ ์ด๋ฏธ์ง์ ์์์ผ๋ก ๋ฐ๊ดํ๋ ๋๋์ ํํ
lightMapIntensity
์์ฑ์ผ๋ก ๊ฐ๋ ์กฐ์
๋ง๋ฌด๋ฆฌ
์ฌ๋ฌ ๊ฐ์ง ํ ์ค์ณ ๋งตํ ์์ฑ์ ๋ค๋ค๋ณด๋ฉด์ ๋ฌผ์ฒด์ ์ ์ฒด์ ์ธ ํจ๊ณผ๋ฅผ ๋ํด์ฃผ๋ ๋ฐฉ์์ ์ดํดํ๋ค.
์ด์ ์ Material ๊ฐ์ฒด๋ฅผ ๋ค๋ค๋ณด๋ฉด์ opacity, metalness, roughness ๋ฑ์ ์์ฑ์ผ๋ก ํ ์ค์ณ๋ฅผ ๋ค๋ค์๋ค.
์ด๋ฐ ์์ฑ์ ์ค๋ธ์ ํธ์ ์ ์ฒด ํฝ์ ์ ๋์ผํ๊ฒ ์ ์ฉ๋๋ค.
ํ์ง๋ง ์ด๋ฒ ์๊ฐ์ ๋ค๋ค๋ ๊ฒ์ฒ๋ผ ์ด๋ฏธ์ง๋ฅผ ์ด์ฉํด ๋งตํ์ ํ๋ฉด, ํฝ์ ๋ง๋ค ํน์ ํ ์์ฑ๊ฐ์ ์ ์ฉ์ํฌ ์ ์๋ค.
๋ณด๋ค ์ฌ์ค์ ์ธ 3D ๊ฐ์ฒด๋ฅผ ๊ตฌํํ๊ธฐ ์ํด์๋ ํ ์ค์ณ ๋งตํ์ผ๋ก ์ ์ฒด๊ฐ์ ๋ถ์ฌํ๋ ๊ฒ์ด ํ์์ธ ๊ฒ ๊ฐ๋ค.
BumpMap
bumpMap์ normalMap์ ์ค์ ํ๋ฉด ๋ฌด์๋๋ ์์ฑ์ด๋ค.
normalMap์ X, Y, Z ์ถ์ ๋ํ ๋ฒ์ ๋ฒกํฐ๋ฅผ ๊ฐ์ง๊ณ ์๋ ๋ฐ๋ฉด, bumpMap์ Y์ถ ๋ฒกํฐ๊ฐ๋ง ๊ฐ์ง๊ณ ์๋ค.
์ค๋ฌด์์๋ bumpMap๋ณด๋จ normalMap์ด ์ฃผ๋ก ์ฌ์ฉ๋๋ค๊ณ ํ๋ค.
'๐ฟ ์คํฐ๋' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[ํด๋ฆฐ์ฝ๋] 5์ฅ ํ์ ๋ง์ถ๊ธฐ (0) | 2023.06.23 |
---|---|
[three.js] ์ฌ์ฉ์ ์ ์ ์ง์ค๋ฉํธ๋ฆฌ (0) | 2023.06.22 |
[ํด๋ฆฐ์ฝ๋] 4์ฅ ์ฃผ์ (with Typescript) (0) | 2023.06.13 |
[three.js] Material์ ํ ์ค์ณ๋ฅผ ์ ํ๋ณด์ (0) | 2023.06.09 |
[three.js] Material - ์ค๋ธ์ ํธ์ ์ฌ์ง์ ๋ค์ํ๊ฒ ์ค์ ํด๋ณด์ (0) | 2023.06.09 |