5๊ฐ ์ฌ์ง (part1 ~ 2)
Material์ ์ง์ค๋ฉํธ๋ฆฌ์ ํจ๊ป Object3D ๊ฐ์ฒด๋ฅผ ์์ฑํ๊ธฐ ์ํ ํ์ ์์
Object์ ์ธ ๊ฐ์ง ํ์ ํด๋์ค (Mesh, Line, Points) ๊ฐ๊ฐ์ ์ํ ํด๋์ค๋ก ๋ถ๋ฅ๋์ด ์ ๊ณต๋๋ค
Material
๋ชจ๋ material ํ์ ํด๋์ค๋ ๋ถ๋ชจ ํด๋์ค์ธ Material์ ์์ฑ์ ์ฌ์ฉํ ์ ์๋ค
const material = new THREE.MeshBasicMaterial({
// Material์ ์์ฑ๊ฐ (๊ธฐ๋ณธ๊ฐ์ผ๋ก ์ค์ )
visible: true,
transparent: true,
opacity: 1,
depthTest: true,
depthWrite: true,
side: THREE.FrontSide,
// MeshBasicMaterial์ ์์ฑ๊ฐ
color: 0xffffff,
wireframe: false,
});
visible
: ๋ ๋๋ง ์ mesh๊ฐ ๋ณด์ผ์ง ์๋ณด์ผ ์งtransparent
: ๋ถํฌ๋ช ๋(opacity)๋ฅผ ์ฌ์ฉํ ์ง ์ฌ๋ถopacity
: ์ฌ์ง์ ๋ถํฌ๋ช ๋๋ฅผ ์ง์ (0~1 ์ฌ์ด์ ๊ฐ) 0์ ์์ ํฌ๋ช , 1์ ์์ ๋ถํฌ๋ชdepthTest
: ๋ ๋๋ง ๋๊ณ ์๋ Mesh์ ํฝ์ ์์น์ z๊ฐ์ depth buffer ๊ฐ์ ์ด์ฉํด ๊ฒ์ฌํ ์ง์ ๋ํ ์ฌ๋ถdepthWrite
: ๋ ๋๋ง๋๊ณ ์๋ Mesh์ ํฝ์ ์ ๋ํ z๊ฐ์ depth buffer์ ๊ธฐ๋กํ ์ง์ ๋ํ ์ฌ๋ถside
: mesh๋ฅผ ๊ตฌ์ฑํ๋ ์ผ๊ฐํ ๋ฉด์ ๋ํด ์ ๋ฉด๋ง ๋ ๋๋งํ ๊ฒ์ธ์ง, ๋ท ๋ฉด๋ง ๋ ๋๋ง ํ ๊ฒ์ธ์ง, ๋ชจ๋ ๋ ๋๋ง ํ ๊ฒ์ธ์ง ์ง์ (๊ด์์ ์ํฅ์ ๋ฐ์ง ์๋ ์ฌ์ง(MeshBasicMaterial ๋ฑ)์์๋ ์ฐจ์ด๋ฅผ ์ ํ์ ํ ์ ์์)
Mesh์ side
์ผ๊ฐํ ๋ฉด์ด ์๋ฉด์ธ์ง๋ ์ผ๊ฐํ์ ๊ตฌ์ฑํ๋ ์ขํ๊ฐ ๋ฐ์๊ณ ๋ฐฉํฅ์ผ๋ก ๊ตฌ์ฑ๋์๋ ์ง๋ก ๊ฒฐ์ ํ๋ค
Depth Buffer
๊น์ด ๋ฒํผ ๋๋ z ๋ฒํผ๋ผ๊ณ ๋ถ๋ฆฐ๋ค
3์ฐจ์ ๊ฐ์ฒด๋ฅผ ์นด๋ฉ๋ผ๋ฅผ ํตํด ์ขํ๋ก ๋ณํ์์ผ ํ๋ฉด์์ ๋ ๋๋ง ๋ ๋, ํด๋น 3์ฐจ์ ๊ฐ์ฒด๋ฅผ ๊ตฌ์ฑํ๋ ๊ฐ ํฝ์ ์ ๋ํ z ์ขํ๊ฐ์ 0~1๋ก ์ ๊ทํ์ํจ๋ค. ์ด ์ ๊ทํ๋ z๊ฐ์ด ์ ์ฅ๋ ๋ฒํผ๊ฐ z ๋ฒํผ.
- ์ด ๊ฐ์ด ์์์๋ก ์นด๋ฉ๋ผ์์ ๊ฐ๊น์ด 3์ฐจ์ ๊ฐ์ฒด์ ํฝ์ ์ด๋ค.
- ์ฃผ๋ก ๋ ๋ฉ๋ฆฌ ์๋ 3์ฐจ์ ๊ฐ์ฒด๊ฐ ๊ฐ๊น์ด ๊ฐ์ฒด๋ฅผ ๋ฎ์ง ์๋๋ก ํ๊ธฐ ์ํด ์ฌ์ฉํ๋ค.
Points ํ์ ์ Object3D Material
PointsMaterial
const material = new THREE.PointsMaterial({
color: 0xff0000,
size: 1,
sizeAttenuation: false
})
sizeAttenuation
: ํฌ์ธํธ๊ฐ ์นด๋ฉ๋ผ์ ๊ฑฐ๋ฆฌ์ ๋ฐ๋ผ ํฌ๊ธฐ๊ฐ ๊ฐ์๋๋๋ก ํจ. (๊ธฐ๋ณธ๊ฐ์ true)
- sizeAttenuation === true: ์นด๋ฉ๋ผ์ ๊ฐ๊น์ด ํฌ์ธํธ์ ๋จผ ํฌ์ธํธ์ ํฌ๊ธฐ๊ฐ ๋ค๋ฅด๋ค
- sizeAttenuation === false: ๊ฑฐ๋ฆฌ์ ์๊ด์์ด ํญ์ ๊ฐ์ ํฌ๊ธฐ์ ํฌ์ธํธ๋ก ๋ ๋๋ง๋๋ค
point ๋ชจ์ ๋ณ๊ฒฝํ๊ธฐ
์์ ์ ์ด๋ฏธ์ง๋ฅผ ์ด์ฉํด์ ๋ชจ์์ ๋ณ๊ฒฝํด๋ณด์
const sprite = new THREE.TextureLoader().load("/assets/disc.png")
const material = new THREE.PointsMaterial({
map: sprite,
alphaTest: 0.5,
color: 0xff0000,
size: 0.1,
sizeAttenuation: true
})
- TextureLoader๋ฅผ ์ด์ฉํ๋ฉด ์ด๋ฏธ์ง๋ฅผ ๋ก๋ํด์ texture ๊ฐ์ฒด๋ก ๋ง๋ค ์ ์๋ค
- alphaTest: ์ด๋ฏธ์ง์ ํฝ์ ๊ฐ ์ค ์ํ๊ฐ์ด ์ด ๊ฐ๋ณด๋ค ํด ๋๋ง ํฝ์ ์ด ๋ ๋๋ง๋๋ค.
๊ฒฐ๊ณผ
Line ํ์ ์ Object3D Material
๋ผ์ธ ๋ ๋๋ง ๋ฐฉ์
Line ํ์ ์ Object3D๋ vertices์ ๊ตฌ์ฑ ์ขํ๊ฐ ์์๋๋ก ์ฐ๊ฒฐ ๋์ด ๋ผ์ธ์ผ๋ก ๋ ๋๋ง๋๋ค.
vertices๊ฐ ๋ค์๊ณผ ๊ฐ์ ๋ ๊ฐ Line ํ์ ๋ณ๋ก ์๋์ ๊ฐ์ด ๋ ๋๋ง๋๋ค.
const vertices = [
-1, 1, 0,
1, 1, 0,
-1, -1, 0,
1, -1, 0
];
- Line: vertices์ ์์๋๋ก ์ฐ๊ฒฐ๋๋ค
- LineSegments: vertices๋ฅผ 2๊ฐ์ฉ ์ง์ง์ด์ ํ๋์ ์ ์ผ๋ก ๋ ๋๋งํ๋ค
- LineLoop: Line๊ณผ ๋์ผํ ๋ฐฉ์์ผ๋ก ๋ ๋๋ง ๋๋ค๊ฐ ๋ง์ง๋ง ์ขํ์ ์ฒซ ๋ฒ์งธ ์ขํ๋ฅผ ์ฐ๊ฒฐ์ํจ๋ค.
LineBasicMaterial
color ์์ฑ์ผ๋ก ์ ์ ์์๊ฐ๋ง ์ง์ ํ ์ ์๋ค. (๊ตต๊ธฐ๋ ๋ณ๊ฒฝํ ์ ์์)
const material = new THREE.LineBasicMaterial({
color: 0xffff00
})
LineDashedMaterial
์ ์ ๊ธธ์ด๋ฅผ ์ฐธ์กฐํด์ ์ฌ์ง์ด ์ ์ฉ๋๋ฏ๋ก ์ ์ ๊ธธ์ด๋ฅผ ๊ณ์ฐํด์ฃผ์ด์ผ ํ๋ค. line.computeLineDistances()
const material = new THREE.LineDashedMaterial({
color: 0xffff00,
dashSize: 0.2,
gapSize: 0.1,
scale:1
});
const line = new THREE.LineLoop(geometry, material);
line.computeLineDistances()
Mesh ํ์ ์ Object3D Material
MeshBasicMaterial
color
: ์์wireframe
: mesh๋ฅผ ์ ํํ๋ก ๋ ๋๋งํ ์ง์ ๋ํ ์ฌ๋ถ
MeshLambertMaterial
mesh๋ฅผ ๊ตฌ์ฑํ๋ ์ ์ ์์ ๊ด์์ ์ํฅ์ ๊ณ์ฐํ๋ ์ฌ์ง
const material = new THREE.MeshPhongtMaterial({
color: 0xff0000,
emissive: 0x555500,
wireframe: false,
});
emissive
: ๋ค๋ฅธ ๊ด์์ ์ํฅ์ ๋ฐ์ง ์๋, material ์์ฒด์์ ๋ฐฉ์ถํ๋ ์์ ๊ฐ- ** ๊ฒ์ ์์ผ๋ก ์ง์ ํ ๊ฒฝ์ฐ ์๋ฌด๋ฐ ์๋ ๋ฐฉ์ถํ์ง ์์
MeshPhongMaterial
mesh๊ฐ ๋ ๋๋ง๋๋ ํฝ์ ๋จ์๋ก ๊ด์์ ์ํฅ์ ๊ณ์ฐํ๋ material
const material = new THREE.MeshPhongMaterial({
color: 0xff0000,
emissive: 0x555500,
specular: 0xffff00,
shininess: 10,
flatShading: true,
});
specular
: ๊ด์์ ์ํ ๋ฐ์ฌ ๋๋ ์์. (๊ธฐ๋ณธ๊ฐ์ ์ฐํ ํ์)shininess
: specular ์์ผ๋ก ๋ฐ์ฌ๋๋ ์ ๋flatShading
: mesh๋ฅผ ํํํ๊ฒ ๋ ๋๋ง ํ ์ง์ ๋ํ ์ฌ๋ถ
๋ฌผ๋ฆฌ๊ธฐ๋ฐ ๋ ๋๋ง(PBR)์ ์ํ Material
- MeshStandardMaterial์ MeshPhysicalMaterial, 2๊ฐ์ง๊ฐ ์กด์ฌ
- 3์ฐจ์ ๊ทธ๋ํฝ์์ ๊ฐ์ฅ ๋ง์ด ์ฌ์ฉํ๋ ์ฌ์ง์ด๋ค.
- ์๋๋ฉด์์๋ ๋ค๋ฅธ ์ฌ์ง์ ์๋์ ์ผ๋ก ๋๋ฆฌ์ง๋ง ํจ์ฌ ๊ณ ํ์ง์ ๋ ๋๋ง ๊ฒฐ๊ณผ๋ฅผ ์ป์ ์ ์๋ค.
MeshStandardMaterial
const material = new THREE.MeshStandardMaterial({
color: 0xff0000,
emissive: 0x555500,
roughness: 0.25,
matalness: 1,
wireframe: false,
flatShading: false,
});
roughness
: ๊ฑฐ์น ๊ธฐ(0~1). 0์ผ ๊ฒฝ์ฐ ํ๋ฉด์ด ๋ง์น ๊ฑฐ์ธ๊ณผ ๊ฐ์ ์ํ. 1์ผ ๊ฒฝ์ฐ ํ๋ฉด์ ๊ด์์ด ๋ฐ์ฌ๋์ง ์์metalness
: ๊ธ์์ฑ(0~1). 0์ผ ๊ฒฝ์ฐ ๋๊ณผ ๊ฐ์ ์ํ. 1์ผ ๊ฒฝ์ฐ ์์ ํ ๊ธ์์ฑ
MeshPhysicalMaterial
MeshStandardMaterial์ ์์ ๋ฐ๊ณ ์๋ ๋ณด๋ค ๋ฐ์ ๋ ๋ฌผ๋ฆฌ ๊ธฐ๋ฐ ๋ ๋๋ง ์ฌ์ง
ํ๋ฉด์ ์ฝํ ํจ๊ณผ๋ฅผ ์ค ์ ์๊ณ , ๋จ์ ํฌ๋ช ๋ ์ฒ๋ฆฌ๊ฐ ์๋ ์ค์ ์ ๋ฆฌ๊ฐ์ ํจ๊ณผ๋ฅผ ํํํ ์ ์๋ค
clearcoat
: 0~1 ์ฌ์ด ๊ฐ. 0์ด๋ฉด mesh์ ํ๋ฉด์ ์ฝํ ์ด ์ ํ ์๋์ด ์๋ ์ฌ์ง, 1์ด๋ฉด ์ฝํ ์ ๋ํ ํจ๊ณผ๋ฅผ ์ต๋๋ก ํํclearcoatRoughness
: 0~1 ์ฌ์ด ๊ฐ. ์ฝํ ์ ๊ฑฐ์น ๊ธฐ
clearcoat๊ฐ์ด ์ปค์ง ์๋ก ์ฝํ ํจ๊ณผ๊ฐ ์ ์ฉ๋์ด ๊ด์์ ๋ฐ์ฌ ํจ๊ณผ๊ฐ ๋ํ๋๋ค.
๋ง๋ฌด๋ฆฌ
- ์ฌ์ง์ ์์ ์ ์์ฑ๊ฐ ๋ณํ์ ์ธ๋ถ ๊ด์์ ์ํฅ์ ๋งค์ฐ ํฌ๊ฒ ๋ฐ๋๋ค.
- ์ํ๋ ์ฌ์ง ํจ๊ณผ๋ฅผ ์ป๊ธฐ ์ํด์ ๋ค์ํ ๊ฒฝํ์ด ํ์ํ๋ค.
์ํ ํ ์คํธ ์ถ๊ฐ ๊ณต๋ถ
๋ฐ์ ๋งํฌ์์ ์ถ๊ฐ์ ์ผ๋ก ์ํ ํ ์คํธ์ ๋ํด ๊ณต๋ถํด๋ณด์๋ค.
์์ฆ์ ๊ฒ์ ์์ง์์ ์ํ ํ ์คํธ์ ๋ธ๋ ๋ฉ์ ์ ๊ตฌํํด๋์๊ธฐ ๋๋ฌธ์ ์์ด๋๋ฅผ ์ฌ์ฉํ๋ฉด ๋๋ค๊ณ ํ๋ค.
Depth Buffer ์ถ๊ฐ ๊ณต๋ถ
๋ค๋ฅธ ํ์์ด Depth Buffer์ ๋ํด ์ถ๊ฐ์ ์ผ๋ก ๊ณต์ ํด์ฃผ์ จ๋ค.
Depth Buffer๊ฐ ์ค์ํ ์ด์
์ฐ๋ฆฌ๋ 3์ฐจ์ ์์ object.position.set(x,y,z)์ผ๋ก ๊ฐ์ฒด๋ฅผ ๋ค์ํ๊ฒ ์์น์ํค๊ฒ ๋๋ค. ๊ทธ๋ฌ๋ ๊ทธ ๊ฐ์ ๊ทธ๋๋ก ์ด๋ค๋ฉด ์ฐ์ฐ์ด ๋งค์ฐ ์ปค์ง๋ค.
๋ฐ๋ผ์ ์ฐ์ฐ์ ์ต์ ํํ๊ธฐ ์ํด์ ์ด ๊ฐ์ ์ ๊ทํํ๋ ๊ฒ์ด๋ค. (์ขํ๊ฐ์ ์ต์๊ฐ~์ต๋๊ฐ ๋ฒ์๋ด์์ ์์ถํจ.)
์ด z-buffer๊ฐ์ ์ปฌ๋ฌ๋ฅผ ์ ํ๋ฉด ์ ์ฒด๊ฐ์ด ๋ง๋ค์ด์ง๊ฒ ๋๋ค!
'๐ฟ ์คํฐ๋' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[ํด๋ฆฐ์ฝ๋] 4์ฅ ์ฃผ์ (with Typescript) (0) | 2023.06.13 |
---|---|
[three.js] Material์ ํ ์ค์ณ๋ฅผ ์ ํ๋ณด์ (0) | 2023.06.09 |
[three.js] Scene Graph๋ฅผ ์ด์ฉํ ๊ณต๊ฐ๊ตฌ์ฑ (0) | 2023.06.08 |
[ํด๋ฆฐ์ฝ๋] 3์ฅ ํจ์ with Typescript (0) | 2023.06.03 |
[three.js] ๋ค์ํ ์ง์ค๋ฉํธ๋ฆฌ ์ฌ์ฉํด ๋ณด๊ธฐ (0) | 2023.06.01 |