6๊ฐ ์ฌ์ฉ์ ์ ์ ์ง์ค๋ฉํธ๋ฆฌ
three.js๊ฐ ์ ๊ณตํ๋ ์ง์ค๋ฉํธ๋ฆฌ ์ธ์๋ ์ง์ ์ ์ํ๋ ์ง์ค๋ฉํธ๋ฆฌ๋ฅผ ๋ง๋ค์ด๋ณด์
geometry๋ three.js์์ BufferGeometry ํด๋์ค๋ฅผ ํตํด ์ ์ํ๋ค.
BufferGeometry์ ์ ์ํ ์ ์๋ ์์ฑ
- position: geometry๋ฅผ ๊ตฌ์ฑํ๋ 3์ฐจ์ ์ขํ์ ๋ํ ์ ์ (Vertex)
- normal: ๊ฐ ์ ์ ์ ๋ํ ์์ง ๋ฒกํฐ
- color: ๊ฐ ์ ์ ์ ๋ํ ์์
- uv: ๊ฐ ์ ์ ์ ๋ํ ํ ์ค์ณ ๋งตํ ์ขํ
- Vertex index: position ์์ฑ์ผ๋ก ์ง์ ๋ ์ ์ ์ ๋ํ ์ธ๋ฑ์ค ๋ฐฐ์ด
- mesh๋ฅผ ๊ตฌ์ฑํ๋ ๋ฉด์ ์ต์ ๋จ์๋ ์ผ๊ฐํ์ด๊ณ ์ด ์ผ๊ฐํ์ 3๊ฐ์ ์ ์ ์ผ๋ก ๊ตฌ์ฑ๋๋ค.
- ์ด ์ผ๊ฐํ์ ๊ตฌ์ฑํ๋ 3๊ฐ์ ์ ์ ์ ๋ํ position ์์ฑ์์์ ์ ์ ์ธ๋ฑ์ค ๋ฒํธ๊ฐ Vertex index
๊ฐ๋จํ ์ฌ์ฉ์ ์ง์ค๋ฉํธ๋ฆฌ๋ฅผ ๊ตฌํํด ๋ณด์
1. ์ ์ ๋ฐ์ดํฐ ์ ์
const rawPositions = [
-1, -1, 0,
1, -1, 0,
-1, 1, 0,
1, 1, 0
];
const positions = new Float32Array(rawPositions);
2. ์ง์ค๋ฉํธ๋ฆฌ์ position ์์ฑ ์ง์
const geometry = new THREE.BufferGeometry();
geometry.setAttribute(
"poisition",
new THREE.BufferAttribute(positions, 3)
); // ํ๋์ ์ ์ ์ด (x, y, z) 3๊ฐ์ ํญ๋ชฉ์ผ๋ก ๊ตฌ์ฑ๋จ์ ์๋ฏธ
3. Vertex index ์ง์
Vertex index๋ ์ผ๊ฐํ ๋ฉด์ ์ ์ํ๋ค.
geometry.setIndex([
0, 1, 2,
2, 1, 3
])
- ์ผ๊ฐํ์ ๊ตฌ์ฑํ๋ ์ ์ ์ ๋ฐฐ์น ์์๋ ๋ฐ์๊ณ ๋ฐฉํฅ์ด๋ค.
- ๋ฐ์๊ณ ๋ฐฉํฅ์ธ ๋ฉด์ด ์๋ฉด์ด๋ค.
4. ๋ชจ๋ ์ ์ ์ ๋ํด ๋ฒ์ ๋ฒกํฐ ์ง์
๋ฒ์ ๋ฒกํฐ๋ ๊ด์์ด ๋ฉ์ฌ์ ํ๋ฉด์ ๋น์ถ๋ ์ ์ฌ๊ฐ๊ณผ ๋ฐ์ฌ๊ฐ์ ๊ณ์ฐํ์ฌ ์ฌ์ง๊ณผ ํจ๊ป ํ๋ฉด์ ์์์ ๊ฒฐ์ ํ๋ค.
๋ชจ๋ ์ ์ ์ ๋ํด ๋ฒ์ ๋ฒกํฐ๋ฅผ ์๋์ผ๋ก ์ง์ ํ๋ ๋ฐฉ๋ฒ
geometry.computeVertexNormals()
๋ฒ์ ๋ฒกํฐ๋ฅผ ์ง์ ์ง์ ํ๋ ๋ฐฉ๋ฒ
const rawNormals = [
0,0,1,
0,0,1,
0,0,1,
0,0,1,
];
const normals = new Float32Array(rawNormals);
geometry.setAttribute("normal", new THREE.BufferAttribute(normals, 3));
5. ๊ฐ ์ ์ ์ ์์ ๊ฐ ์ง์
const rawColors = [
1,0,0,
0,1,0,
0,0,1,
1,1,0,
];
const colors = new Float32Array(rawColors);
geometry.setAttribute("color", new THREE.BufferAttribute(colors, 3));
** ์ ์ ์์ ์ ์ฉํ๋ ค๋ฉด Material์ vertexColors: true
๋ก ์ง์ ํด์ผ ํ๋ค.
const material = new THREE.MeshPhongMaterial({ color: 0xffffff, vertexColors: true });
6. uv ์์ฑ์ผ๋ก ํ ์ค์ณ ๋งตํ
// uv ์ขํ๋ฅผ ๋ด๊ณ ์๋ ๋ฐฐ์ด
const rawUvs = [
0, 0,
1, 0,
0, 1,
1, 1,
];
const uvs = new Float32Array(rawUvs);
geometry.setAttribute("uv", new THREE.BufferAttribute(uvs, 2));
// ํ
์ค์ณ ๋งตํ
const textureLoader = new THREE.TextureLoader();
const map = textureLoader.load("/assets/uv_grid_opengl.jpg");
const material = new THREE.MeshPhongMaterial({ color: 0xffffff, map });
const rawPositions = [
-1, -1, 0,
1, -1, 0,
-1, 1, 0,
1, 1, 0
];
const rawUvs = [
0, 0,
1, 0,
0, 1,
1, 1,
];
์ง์ค๋ฉํธ๋ฆฌ ์ ์ ์ขํ์ uv ์ขํ๋ ๋ค์ ํ์ ๊ฐ์ด ๋งตํ๋๋ค.
์ง์ค๋ฉํธ๋ฆฌ ์ ์ ์ขํ | uv ์ขํ |
---|---|
(-1, -1, 0) | (0, 0) |
(1, -1, 0) | (1,0) |
(-1, 1, 0) | (0, 1) |
(1, 1, 0) | (1, 1) |
๋ง๋ฌด๋ฆฌ
์ง์ ์ขํ๋ฅผ ๋ง๋ค์ด์ ์ํ๋ ํํ์ ์ง์ค๋ฉํธ๋ฆฌ๋ฅผ ๊ตฌ์ฑํ ์ ์๋ค.
์ง์ค๋ฉํธ๋ฆฌ๋ฅผ ์ง์ ๋ง๋ค์ด๋ณด๋ฉด์ ์ง์ค๋ฉํธ๋ฆฌ๊ฐ ์ด๋ค ๋ฐฉ์์ผ๋ก ํํ๋ฅผ ์ ์ํ๋์ง ์ดํดํ ์ ์์๋ค.
ํ์ง๋ง ์ด๋ฐ ์์ ์ ๋๋ฌด ๋ฒ๊ฑฐ๋กญ๊ธฐ ๋๋ฌธ์ ์ค๋ฌด์์ ์ฌ์ฉํ๊ธฐ๋ ํ๋ค ๊ฒ ๊ฐ๋ค.
'๐ฟ ์คํฐ๋' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[three.js] ์ฌ๋ฌ๊ฐ์ง ๊ด์์ ๋ค๋ค๋ณด์ (0) | 2023.06.23 |
---|---|
[ํด๋ฆฐ์ฝ๋] 5์ฅ ํ์ ๋ง์ถ๊ธฐ (0) | 2023.06.23 |
[three.js] Material ์ฌ๋ฌ๊ฐ์ง map์ ์ ์ฉํด ๋์ฑ ์ฌ์ค์ ์ธ ํ ์ค์ณ๋ฅผ ๋ง๋ค์ด๋ณด์ (0) | 2023.06.15 |
[ํด๋ฆฐ์ฝ๋] 4์ฅ ์ฃผ์ (with Typescript) (0) | 2023.06.13 |
[three.js] Material์ ํ ์ค์ณ๋ฅผ ์ ํ๋ณด์ (0) | 2023.06.09 |