๐ป Geometry ๋?
three.js
์์ geometry
๋ 3์ฐจ์ ๊ณต๊ฐ์์์ ์ขํ๋ค์ ์๋ฏธํ๋ ์ ์ ๋ค(vertices)๊ณผ ๊ทธ ์ ์ ๋ค์ ์ฐ๊ฒฐํด ๋ง๋ ์ผ๊ฐํ ๋ชจ์์ ๋ฉด(face)๋ค๋ก ์ด๋ฃจ์ด์ง ๋ชจ์(shape) ์
๋๋ค.
๋ณดํต geometry
๋ mesh
๋ฅผ ๊ตฌ์ฑํ์ง๋ง, ์ ์ผ๋ก ๋ ๋ํ์ ๊ตฌ์ฑํ ์๋ ์์ต๋๋ค. ๋ํ ํ๋์ ์ ์ (vertex)์ ์ขํ ์ ๋ณด๋ฟ๋ง ์๋๋ผ normal
, color
, uv
์ ๊ฐ์ ์ ๋ณด๋ ์ ์ฅํ ์ ์์ต๋๋ค.
๐ป ์์ ๋ชจ๋ธ(Primitive Model)
three.js
์๋ ๊ธฐ๋ณธ์ผ๋ก ์ ๊ณตํ๋ ์์๋ชจ๋ธ์ด ์กด์ฌํฉ๋๋ค. ๊ฐ ์์๋ชจ๋ธ๋ค์ ๋ฐํ์์ ๋ค์ํ ์ธ์๋ฅผ ๋ฐ์ ๋ชจ์์ ํ์ฑํฉ๋๋ค. ๋ํ ๋ชจ๋ ์์ ํ์
๋ค์ BufferGeometry
ํด๋์ค๋ฅผ ์์๋ฐ์ต๋๋ค.
๐จโ๐ป ์ข ๋ฅ
๐จโ๐ป BoxGeometry
์์ ๋ชจ๋ธ์๋ ๋ค์ํ ์ธ์๋ค์ด ์๋๋ฐ, ์ก๋ฉด์ฒด๋ฅผ ์์๋ก ์ธ์๋ค์ ์๋ฏธ๋ฅผ ์ดํด๋ณด๊ฒ ์ต๋๋ค.
BoxGeometry(width: Float, height: Float, depth: Float, widthSegments: Integer, heightSegments: Integer, depthSegments: Integer)
1
const geometry = new THREE.BoxGeometry(1, 1, 1, 1, 1, 1);
BoxGeometry
๋ ์์ ๊ฐ์ด 6๊ฐ์ ์ธ์๋ฅผ ๋ฐ๊ณ ์๋๋ฐ, ๊ฐ ์ธ์๋ ์๋์ ๊ฐ์ ์๋ฏธ๋ฅผ ๊ฐ์ต๋๋ค.
width
์ก๋ฉด์ฒด์ ๋์ด, ์ฆx
์ถ์ ํํํ ๋ชจ์๋ฆฌ์ ๊ธธ์ด์ ๋๋ค.height
์ก๋ฉด์ฒด์ ๋์ด, ์ฆy
์ถ์ ํํํ ๋ชจ์๋ฆฌ์ ๊ธธ์ด์ ๋๋ค.depth
์ก๋ฉด์ฒด์ ๊น์ด, ์ฆz
์ถ๊ณผ ํํํ ๋ชจ์๋ฆฌ์ ๊ธธ์ด์ ๋๋ค.widthSegments
x
์ถ์ ๋ฐ๋ผ ๋ถํ ๋ ์ง์ฌ๊ฐํ ๋ฉด์ ์ ์ ๋๋ค.heightSegments
y
์ถ์ ๋ฐ๋ผ ๋ถํ ๋ ์ง์ฌ๊ฐํ์ ๋ฉด์ ์ ์ ๋๋ค.depthSegments
z
์ถ์ ๋ฐ๋ผ ๋ถํ ๋ ์ง์ฌ๊ฐํ์ ๋ฉด์ ์ ์ ๋๋ค.
์ ์ด๋ฏธ์ง๋ width
, height
, depth
์์ฑ์ ๊ฐ๊ฐ 2๋ก ์ฆ๊ฐ์ํจ ํ ๋ ๋๋ง๋ BoxGeometry
์
๋๋ค.
์ ๊ฒฐ๊ณผ๋ ์๋์ ์ฝ๋๋ฅผ ์คํ์ํจ ๊ฒฐ๊ณผ์ ๋๋ค.
1
2
3
4
5
6
7
8
// ...์๋ต...
const boxGeometry = new THREE.BoxGeometry(1, 1, 1, 1, 1, 1);
const material = new THREE.MeshBasicMaterial({
color: 0xff0000,
wireframe: true,
});
const mesh = new THREE.Mesh(boxGeometry, material);
// ...์๋ต...
๋ถํ ๋ ์ฌ๋ถ๋ฅผ ํ์ธํ๊ธฐ ์ํด material
์ wireframe
์ต์
์ true
์ค์ ํ ๊ฒ์ ์ ์ ์์ต๋๋ค.
widthSegments
๋ฅผ 2
๋ก ์ค์ ํ๊ฒ๋๋ฉด, x
์ถ ๋ฐฉํฅ(๋์ด)์ผ๋ก ์ฌ๊ฐํ์ ์ด๋ฑ๋ถํ์์ ์ ์ ์์ต๋๋ค. heightSegments
์ depthSegments
๋ ๊ฐ์ ๋ฐฉ์์ผ๋ก ๋์ํฉ๋๋ค.
segment
๊ฐ ์ฆ๊ฐํ๋ฉด, ๊ณก์ ํํ์ ์ ๋ฆฌํด์ง๋๋ค. ํ๋ฉด์ segment
์ ๊ฐฏ์์ ๋ฌด๊ณผํ์ง๋ง, ๊ตฌ์ ๊ฒฝ์ฐ segment
์ ๊ฐฏ์๊ฐ ์ฆ๊ฐํ ์๋ก ์๋ฒฝํ ๊ตฌ์ ๊ฐ๊น์ ์ง๋๋ค.
๐จโ๐ป TextGeometry
TextGeometry
๋ ํ
์คํธ๋ฅผ ํ๋์ geometry
๋ก ํํํ๊ธฐ ์ํด ์ฌ์ฉํฉ๋๋ค.
TextGeometry
์ ๋ถ๋ชจ ํด๋์ค๋ BufferGeometry
๋ฅผ ์์๋ฐ๋ ExtrudeGeometry
์ด๋ฉฐ, ์์ฑ์์ ํํํ ํ
์คํธ์ ์ต์
์ ๋๊ฒจ์ค๋๋ค.
๐ ์ฌ์ฉ๊ฐ๋ฅํ ํฐํธ
TextGeometry
๋ typeface.json
์ ์ฌ์ฉํฉ๋๋ค.
typeface.json
์ ์ฌ์ฉํ๊ธฐ ์ํด์๋ Facetype.js ์ ๊ฐ์ ๋ณํ ์ฌ์ดํธ๋ฅผ ์ด์ฉํด ์ผ๋ฐ ๊ธ๊ผด์ typeface.json
์ผ๋ก ๋ณํ ์ํค๊ฑฐ๋ three.js
์์ ์ ๊ณตํ๋ built-in typeface.json
๋ฅผ ์ด์ฉํ๋ ๋ฐฉ๋ฒ์ด ์์ต๋๋ค.
three.js
์ built-in typeface.json
๋ค์ /examples/fonts/
ํ์์ ์์นํ๊ณ ์์ต๋๋ค.
๐ ํฐํธ ๋ถ๋ฌ์ค๊ธฐ
์ฌ์ฉํ typeface.json
์ ๋ถ๋ฌ์ค๊ธฐ ์ํด์๋ FontLoader
๋ฅผ ์ฌ์ฉํด์ผํฉ๋๋ค.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
import { FontLoader } from "three/addons/loaders/FontLoader";
const fontLoader = new FontLoader();
fontLoader.load(
"font-path",
(font) => {
console.log("font is loaded");
},
(xmlHttpRequest) => {
console.log("font is loading");
},
() => {
console.log("font cannot be loaded");
}
);
์ ์์๋ FontLoader
๋ฅผ ์ด์ฉํ์ฌ typeface.json
์ ๋ถ๋ฌ์ค๋ ์ฝ๋์
๋๋ค.
์ ์ฝ๋๋ฅผ ํตํด FontLoader
๊ฐ three/addons
๊ฒฝ๋ก(three/examples/jsm
)์ ์์นํ๊ณ ์์์ ์ ์ ์์ต๋๋ค. ๋ํ load
๋ฉ์๋๋ typeface.json
์ ๊ฒฝ๋ก์ธ์๋, onLoad
, onProgress
, onError
๋ฅผ ์ฝ๋ฐฑํจ์๋ก ๋ฐ๊ณ ์์ต๋๋ค.
์ถ๊ฐ๋ก texture ์์ ์ดํด๋ณด๊ฒ ์ง๋ง, FontLoader
๋ Loader
ํด๋์ค๋ฅผ ์์๋ฐ๋ ์์ ํด๋์ค์ด๊ธฐ ๋๋ฌธ์ LoadingManager
๋ฅผ ์ฌ์ฉํ ์ ์์ต๋๋ค.
๐ TextGeometry ์์ฑํ๊ธฐ
์๋๋ TextGeometry
์ ์์ฑ์์ ์ธ์๋ค๊ณผ, ํด๋น ํด๋์ค๋ฅผ ๋ฐํ์ผ๋ก TextGeometry
๋ฅผ ์์ฑํ๋ ์ฝ๋์
๋๋ค.
TextGeometry(text: String, { font: THREE.Font, size: Float, height: Float, curveSegments: Integer, bevelEnabled: Boolean, bevelThickness: Float, bevelSize: Float, bevelOffset: Float, bevelSegments: Integer })
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
import { TextGeometry } from "three/addons/geometry/TextGeometry";
// ...์๋ต...
fontLoader.load("font-path", (font) => {
const textGeometry = new THREE.Text("Hello", {
font,
size: 0.5,
height: 0.2,
curveSegments: 12,
bevelEnabled: true,
bevelThickness: 0.03,
bevelSize: 0.02,
bevelOffset: 0,
bevelSegments: 5,
});
const material = new THREE.MeshBasicMaterial();
const mesh = new THREE.Mesh(textGeometry, material);
scene.add(mesh);
});
// ...์๋ต...
์ ์ฝ๋๋ฅผ ์คํ์ํจ ๊ฒฐ๊ณผ๋ ์๋์ ๊ฐ์ต๋๋ค. (์ฝ๋์๋ ์๋ต๋์์ง๋ง AxesHelper
๋ฅผ ์ถ๊ฐํ์ต๋๋ค.)
์ด์ TextGeometry
์ ์์ฑ์ ์ธ์์ค, ๋๋ฒ์งธ ๊ฐ์ฒด ์ธ์์ ์์ฑ๋ค์ ์๋ฏธ๋ฅผ ์ดํด๋ณด๊ฒ ์ต๋๋ค.
font
TextGeometry
์์ ์ฌ์ฉํfont
๋ฅผ ์ค์ ํ๋ ์ต์ ์ ๋๋ค.size
font
์ ํฌ๊ธฐ๋ฅผ ์๋ฏธํฉ๋๋ค. ๊ธฐ๋ณธ๊ฐ์100
์ ๋๋ค.height
TextGeometry
์ ๋๊ป๋ฅผ ์๋ฏธํฉ๋๋ค. ๊ธฐ๋ณธ๊ฐ์50
์ ๋๋ค.์ ์ด๋ฏธ์ง๋
material
์wireframe
์ต์ ์true
์ค์ ํ ๋ค์height
์ ํฌ๊ธฐ๋ฅผ ๋ณ๊ฒฝํ ๊ฒฐ๊ณผ์ ๋๋ค.curveSegments
ํ๋์ ๊ณก์ ์ ๊ตฌ์ฑํ๋ ์ ์ ์๋ฅผ ์ค์ ํ๋ ์ต์ ์ ๋๋ค. ๊ธฐ๋ณธ๊ฐ์12
์ ๋๋ค.
๊ฐ์ด ํด ์๋ก ๊ณก์ ์์segment
์๊ฐ ๋ง์์ง๊ณ , ๋ถ๋๋ฌ์ ์ง๋๋ค.
bevelEnabled
beveled edge
์ฌ์ฉ ์ฌ๋ถ๋ฅผ ์ค์ ํ๋ ์ต์ ์ ๋๋ค. ๊ธฐ๋ณธ๊ฐ์false
์ ๋๋ค.๐
beveled edge
๋?beveled edge
๋ ์๋์ ๊ฐ์ด ๋ฌผ์ฒด์ ๊ฐ์ฅ์๋ฆฌ๋ ๋ชจ์๋ฆฌ๋ฅผ ํ๋ฉด์ผ๋ก ๋ค๋ฌ์ ๊ฒ์ ์๋ฏธํฉ๋๋ค.
bevelEnabled
๋ฅผtrue
๋ก ์ค์ ํ ์ ํ ์คํธ์ ๋ชจ์๋ฆฌ ๋ถ๋ถ์ด ๋ฅ๊ธ๊ฒ ์ฒ๋ฆฌ๋จ์ ๋ณผ ์ ์์ต๋๋ค.bevelThickness
bevel
์ ๋๊ป๋ฅผ ์ค์ ํ๋ ์ต์ ์ ๋๋ค. ๊ธฐ๋ณธ๊ฐ์10
์ ๋๋ค.
bevelSize
ํ ์คํธ์ ์ค๊ณฝ(outline)์ผ๋ก ๋ถํฐbevel
์ด ์ผ๋ง๋ ๋จ์ด์ ธ ์๋์ง๋ฅผ ์ค์ ํ๋ ์ต์ ์ ๋๋ค. ๊ธฐ๋ณธ๊ฐ์8
์ ๋๋ค.bevelOffset
ํ ์คํธ์ ์ค๊ณฝ์ด ์์ํ๋ ์์น๋ฅผ ์ค์ ํ๋ ์ต์ ์ ๋๋ค. ๊ธฐ๋ณธ๊ฐ์0
์ ๋๋ค.
bevelOffset
์0.01
์ค์ ํ์ ๋, ํ ์คํธ์ ์ค๊ณฝ์ ์ด ์์ ์์ ๋จ์ด์ง์ ๋ณผ ์ ์์ต๋๋ค.bevelSegments
bevel edge
์segment
์๋ฅผ ์ค์ ํ๋ ์ต์ ์ ๋๋ค. ๊ธฐ๋ณธ๊ฐ์3
์ด๋ฉฐ, ๋์ ์๋ก ๋ถ๋๋ฌ์ดbevel edge
๋ฅผ ์ป์ ์ ์์ต๋๋ค.
๐ ๊ฐ์ด๋ฐ ์ ๋ ฌํ๊ธฐ
BufferGeometry
๋ฅผ ์์๋ฐ๋ ๊ฐ์ฒด๋ค์ center
๋ฉ์๋๋ฅผ ์ฌ์ฉํด์ ๊ฐ์ด๋ฐ๋ก ์์น๋ฅผ ์ฎ๊ธธ ์ ์์ต๋๋ค.
center
๋ฉ์๋๋ bounding box
๋ฅผ ๊ธฐ๋ฐ์ผ๋ก geometry
๋ฅผ ๊ฐ์ด๋ฐ๋ก ์ด๋์ํค๋๋ฐ, ์ด๋์ํค๋ ๊ณผ์ ์ ์ง์ ๊ตฌํํด๋ณด๊ฒ ์ต๋๋ค.
bounding
์ด๋?
bounding
์Geometry
๋ฅผ ๋๋ฌ์ธ๊ณ ์๋ ๊ฒฝ๊ณ๋ฅผ ์๋ฏธํ๋ฉฐ, ํฌ๊ธฐ ์ธก์ , ์ถฉ๋๊ฐ์ง ๋ฑ ๋ค์ํ ์ฉ๋๋ก ์ฌ์ฉํ ์ ์์ต๋๋ค. ๋๋ฌ ์ธ๊ณ ์๋ ๊ฒฝ๊ณ์ ๋ชจ์์ ๋ฐ๋ผ,bounding box
,bounding sphere
๋ฑ์ผ๋ก ๊ตฌ๋ถํ ์ ์์ต๋๋ค.
computeBoundingBox
๋กbounding box
๊ตฌํ๊ธฐ
Bounding box
๋ ๊ธฐ๋ณธ์ผ๋ก ๊ณ์ฐ๋์ง ์๊ธฐ ๋๋ฌธ์ ํด๋น ํจ์๋ฅผ ์ฌ์ฉํด์ ๊ณ์ฐํด์ฃผ์ด์ผ ํฉ๋๋ค. ์ด๋bounding sphere
๋ ๋ง์ฐฌ๊ฐ์ง ์ ๋๋ค. (computeBoundingSphere
)boundingBox
์์ฑ ์ด์ฉํ๊ธฐ
1
2
textGeometry.computeBoundBox();
console.log(textGeometry.boundingBox);
์ ์ฝ๋๋ฅผ ์คํ์ํค๋ฉด ์๋์ ๊ฐ์ด ์ถ๋ ฅ๋ฉ๋๋ค.
max
์ min
๋ ๊ฐ์ง ์์ฑ์ ํ์ธํ ์ ์๋๋ฐ, ํด๋น ์ขํ๋ bounding box
์ ์ต๋, ์ต์ ์ขํ๋ฅผ ์๋ฏธํฉ๋๋ค.
๋ํ min
์์ฑ์ Vector3
๊ฐ 0
์ด ์๋์ ์ ์ ์๋๋ฐ, ์ด๋ bevelSize
์ bevelThickness
๊ฐ ๋๋ฌธ์
๋๋ค.
์์ ๋ด์ฉ๋ค์ ๋ฐํ์ผ๋ก ์์ฑํ ์ฝ๋๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
1
2
3
4
5
6
7
// ...์๋ต...
textGeometry.translate(
-(textGeometry.boundingBox.max.x - bevelSize) * 0.5,
-(textGeometry.boundingBox.max.y - bevelSize) * 0.5,
-(textGeometry.boundingBox.max.z - bevelThickness) * 0.5
);
// ...์๋ต...
๐ป ์ฌ์ฉ์ ์ง์ BufferGeometry
BufferGeometry
๋ three.js
๋ด์ ๋ชจ๋ geometry
๋ฅผ ๋ํ๋
๋๋ค (์์ ๋ชจ๋ธ์ ๋ถ๋ชจ ํด๋์ค). ๋ํ BufferAttribute
์์ฑ๋ค์ ์งํฉ์ด๋ผ๊ณ ํ ์ ์์ต๋๋ค. BufferGeometry
๋ก ์ง์ geometry
๋ฅผ ๋ง๋ค๊ธฐ ์ํด์๋ ์ ์ ๋ค์ ์ถ๊ฐํด์ฃผ์ด์ผ ํฉ๋๋ค. ์ ์ ๋ค์ ์ถ๊ฐํด์ฃผ๊ธฐ ์ํด์๋ ๋ฐฐ์ด์ ์ฌ์ฉํด์ผํ๋๋ฐ, ์ด๋ Float32Array
๋ฅผ ์ฌ์ฉํฉ๋๋ค.
BufferGeometry
๋ฅผ ์ด์ฉํด์ ์ก๋ฉด์ฒด๋ฅผ ๋ง๋ค์ด๋ณด๊ฒ ์ต๋๋ค.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
// ...์๋ต...
const vertices = [
-1, -1, 1, 1, -1, 1, -1, 1, 1, -1, 1, 1, 1, -1, 1, 1, 1, 1, 1, -1, 1, 1, -1,
-1, 1, 1, 1, 1, 1, 1, 1, -1, -1, 1, 1, -1, 1, -1, -1, -1, -1, -1, 1, 1, -1, 1,
1, -1, -1, -1, -1, -1, 1, -1, -1, -1, -1, -1, -1, 1, -1, 1, -1, -1, 1, -1, -1,
-1, 1, -1, 1, 1, 1, 1, -1, -1, 1, -1, 1, 1, 1, 1, 1, 1, -1, 1, -1, -1, 1, 1,
1, -1, 1, -1, -1, 1, 1, -1, -1, 1, -1, -1, -1, -1, 1, -1, -1, -1,
];
const myBoxPositionAttribute = new THREE.BufferAttribute(
new Float32Array(vertices),
3
);
const boxGeometry = new THREE.BufferGeometry();
boxGeometry.setAttribute("position", myBoxPositionAttribute);
const material = new THREE.MeshBasicMaterial({ color: 0xff0000 });
const mesh = new THREE.Mesh(boxGeometry, material);
// ...์๋ต...
์ ์ก๋ฉด์ฒด๋ฅผ ๋ง๋ค๊ธฐ ์ํด vertices
๋ฐฐ์ด์ 108๊ฐ์ ์์๊ฐ ๋ค์ด์์ต๋๋ค. ์ ์ก๋ฉด์ฒด์ ๋ฉด์ ๋ชจ๋ 6๊ฐ์ด๊ณ , ํ ๋ฉด์ด 2๊ฐ์ ์ผ๊ฐํ์ผ๋ก ๋์ด์์ผ๋ ์ด 12๊ฐ์ ์ผ๊ฐํ์ด ํ์ํฉ๋๋ค. 12๊ฐ์ ์ผ๊ฐํ ๊ผญ์ง์ ์ ๋ชจ๋ 36๊ฐ์ด๊ณ ๊ฐ ์ ์ (x, y, z)
์ขํ์ ์ ๋ณด๊ฐ ๋ค์ด์์ด 108๊ฐ(6 X 2 X 3 X 3)์ ์์๊ฐ ๋ฉ๋๋ค.
์ขํ์ ์ ๋ณด๋ฅผ ๋ด์ vertices
๋ฐฐ์ด์ Float32Array
๋ก ๋ณ๊ฒฝ์ํจ ํ, ์ขํ์ ๊ด๋ จ๋ BufferAttribute
์ ์์ฑํ๊ณ ์์ต๋๋ค. ์ด ๋ ๋๋ฒ์งธ ์ธ์๋ก, 3
์ ์ ๋ฌํ๋๋ฐ, ์ด๋ ๋ฐฑํฐ์ ๊ฐฏ์๋ฅผ ์๋ฏธํฉ๋๋ค. ์๋ฅผ ๋ค์ด, ์์ vertices
์ ๊ฒฝ์ฐ ์ขํ์ 3๊ฐ์ ๋ฐฑํฐ (x, y, z)
๋ฅผ ๊ฐ์ง๊ณ ์๊ธฐ๋๋ฌธ์ 3
์ ์ ๋ฌํด์ฃผ์์ต๋๋ค.
์ขํ์ BufferAttribute
๋ฅผ ์์ฑํ ํ, setAttribute
๋ฅผ ์ด์ฉํด BufferGeometry
์ ์ถ๊ฐ๋ฅผ ํด์ฃผ์ด์ผ ํฉ๋๋ค.
โ๏ธ BufferGeometry
์ attribute
์ ์ ๊ทผํ ๋๋ ์ง์ ์ ๊ทผ๋ณด๋ค๋ getter
์ setter
๋ฉ์๋๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ด ๋น ๋ฆ
๋๋ค.
๐จโ๐ป Vertex์ ๋ค๋ฅธ ์ ๋ณด ์ ์ฅํ๊ธฐ
์์์ ์ธ๊ธํ๋๋ก, ์ ์ ์๋ uv
, normal
, color
์ ๊ฐ์ ์ ๋ณด๋ ์ ์ฅํ ์ ์์ต๋๋ค.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
// ...์๋ต...
const vertices = [
// ์์ชฝ
{ pos: [-1, -1, 1], norm: [0, 0, 1], uv: [0, 0] },
{ pos: [1, -1, 1], norm: [0, 0, 1], uv: [1, 0] },
{ pos: [-1, 1, 1], norm: [0, 0, 1], uv: [0, 1] },
{ pos: [-1, 1, 1], norm: [0, 0, 1], uv: [0, 1] },
{ pos: [1, -1, 1], norm: [0, 0, 1], uv: [1, 0] },
{ pos: [1, 1, 1], norm: [0, 0, 1], uv: [1, 1] },
// ์ค๋ฅธ์ชฝ
{ pos: [1, -1, 1], norm: [1, 0, 0], uv: [0, 0] },
{ pos: [1, -1, -1], norm: [1, 0, 0], uv: [1, 0] },
{ pos: [1, 1, 1], norm: [1, 0, 0], uv: [0, 1] },
{ pos: [1, 1, 1], norm: [1, 0, 0], uv: [0, 1] },
{ pos: [1, -1, -1], norm: [1, 0, 0], uv: [1, 0] },
{ pos: [1, 1, -1], norm: [1, 0, 0], uv: [1, 1] },
// ๋ค์ชฝ
{ pos: [1, -1, -1], norm: [0, 0, -1], uv: [0, 0] },
{ pos: [-1, -1, -1], norm: [0, 0, -1], uv: [1, 0] },
{ pos: [1, 1, -1], norm: [0, 0, -1], uv: [0, 1] },
{ pos: [1, 1, -1], norm: [0, 0, -1], uv: [0, 1] },
{ pos: [-1, -1, -1], norm: [0, 0, -1], uv: [1, 0] },
{ pos: [-1, 1, -1], norm: [0, 0, -1], uv: [1, 1] },
// ์ผ์ชฝ
{ pos: [-1, -1, -1], norm: [-1, 0, 0], uv: [0, 0] },
{ pos: [-1, -1, 1], norm: [-1, 0, 0], uv: [1, 0] },
{ pos: [-1, 1, -1], norm: [-1, 0, 0], uv: [0, 1] },
{ pos: [-1, 1, -1], norm: [-1, 0, 0], uv: [0, 1] },
{ pos: [-1, -1, 1], norm: [-1, 0, 0], uv: [1, 0] },
{ pos: [-1, 1, 1], norm: [-1, 0, 0], uv: [1, 1] },
// ์๋จ
{ pos: [1, 1, -1], norm: [0, 1, 0], uv: [0, 0] },
{ pos: [-1, 1, -1], norm: [0, 1, 0], uv: [1, 0] },
{ pos: [1, 1, 1], norm: [0, 1, 0], uv: [0, 1] },
{ pos: [1, 1, 1], norm: [0, 1, 0], uv: [0, 1] },
{ pos: [-1, 1, -1], norm: [0, 1, 0], uv: [1, 0] },
{ pos: [-1, 1, 1], norm: [0, 1, 0], uv: [1, 1] },
// ํ๋จ
{ pos: [1, -1, 1], norm: [0, -1, 0], uv: [0, 0] },
{ pos: [-1, -1, 1], norm: [0, -1, 0], uv: [1, 0] },
{ pos: [1, -1, -1], norm: [0, -1, 0], uv: [0, 1] },
{ pos: [1, -1, -1], norm: [0, -1, 0], uv: [0, 1] },
{ pos: [-1, -1, 1], norm: [0, -1, 0], uv: [1, 0] },
{ pos: [-1, -1, -1], norm: [0, -1, 0], uv: [1, 1] },
];
const positions = [];
const normals = [];
const uvs = [];
for (const vertex of vertices) {
positions.push(...vertex.pos);
normals.push(...vertex.norm);
uvs.push(...vertex.uv);
}
const geometry = new THREE.BufferGeometry();
geometry.setAttribute(
"position",
new BufferAttribute(new Float32Array(positions), 3)
);
geometry.setAttribute(
"normal",
new BufferAttribute(new Float32Array(normals), 3)
);
geometry.setAttribute("uv", new BufferAttribute(new Float32Array(uvs), 2));
// ...์๋ต...
์ ์ฝ๋๋, ์ขํ์ ์์น ์ธ์ ์ ๋ณด๋ฅผ BufferAttribute
๋ก ์ถ๊ฐํ ์์์
๋๋ค.
๐ป index
BufferGeometry
๋ก geometry
๋ฅผ ๋ง๋ค๊ธฐ ์ํ vertices
๋ฐฐ์ด์๋ ์ค๋ณต๋๋ ์ ์ ์ด ์์ต๋๋ค.
์์์ ๋ง๋ ์ ์ก๋ฉด์ฒด๋ฅผ ์ดํด๋ณด๋ฉด, ํ ๋ฉด์ ๋๊ฐ์ ์ผ๊ฐํ์ผ๋ก ๊ตฌ์ฑ๋์ด์๊ณ ์ด 6๊ฐ์ ์ ์ ์ด ์๊น๋๋ค. ์ด์ค์์ 2๊ฐ์ ์ ์ ์ด ์ค๋ณต๋ฉ๋๋ค. ๊ณ์ฐ์ ํจ์จ์ฑ์ ์ํด ์ค๋ณต๋๋ ์ ์ ๋ค์ ์ ๊ฑฐํ๊ณ ๊ฐ, ์ขํ์ ์ธ๋ฑ์ค๋ฅผ ํ์ฉํด geometry
๋ฅผ ์์ฑํ ์ ์์ต๋๋ค.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
// ...์๋ต...
const vertices = [
// ์์ชฝ
{ pos: [-1, -1, 1], norm: [0, 0, 1], uv: [0, 0] }, // 0
{ pos: [1, -1, 1], norm: [0, 0, 1], uv: [1, 0] }, // 1
{ pos: [-1, 1, 1], norm: [0, 0, 1], uv: [0, 1] }, // 2
{ pos: [1, 1, 1], norm: [0, 0, 1], uv: [1, 1] }, // 3
// ์ค๋ฅธ์ชฝ
{ pos: [1, -1, 1], norm: [1, 0, 0], uv: [0, 0] }, // 4
{ pos: [1, -1, -1], norm: [1, 0, 0], uv: [1, 0] }, // 5
{ pos: [1, 1, 1], norm: [1, 0, 0], uv: [0, 1] }, // 6
{ pos: [1, 1, -1], norm: [1, 0, 0], uv: [1, 1] }, // 7
// ๋ค์ชฝ
{ pos: [1, -1, -1], norm: [0, 0, -1], uv: [0, 0] }, // 8
{ pos: [-1, -1, -1], norm: [0, 0, -1], uv: [1, 0] }, // 9
{ pos: [1, 1, -1], norm: [0, 0, -1], uv: [0, 1] }, // 10
{ pos: [-1, 1, -1], norm: [0, 0, -1], uv: [1, 1] }, // 11
// ์ผ์ชฝ
{ pos: [-1, -1, -1], norm: [-1, 0, 0], uv: [0, 0] }, // 12
{ pos: [-1, -1, 1], norm: [-1, 0, 0], uv: [1, 0] }, // 13
{ pos: [-1, 1, -1], norm: [-1, 0, 0], uv: [0, 1] }, // 14
{ pos: [-1, 1, 1], norm: [-1, 0, 0], uv: [1, 1] }, // 15
// ์๋จ
{ pos: [1, 1, -1], norm: [0, 1, 0], uv: [0, 0] }, // 16
{ pos: [-1, 1, -1], norm: [0, 1, 0], uv: [1, 0] }, // 17
{ pos: [1, 1, 1], norm: [0, 1, 0], uv: [0, 1] }, // 18
{ pos: [-1, 1, 1], norm: [0, 1, 0], uv: [1, 1] }, // 19
// ํ๋จ
{ pos: [1, -1, 1], norm: [0, -1, 0], uv: [0, 0] }, // 20
{ pos: [-1, -1, 1], norm: [0, -1, 0], uv: [1, 0] }, // 21
{ pos: [1, -1, -1], norm: [0, -1, 0], uv: [0, 1] }, // 22
{ pos: [-1, -1, -1], norm: [0, -1, 0], uv: [1, 1] }, // 23
];
geometry.setAttribute(
"position",
new THREE.BufferAttribute(positions, positionNumComponents)
);
geometry.setAttribute(
"normal",
new THREE.BufferAttribute(normals, normalNumComponents)
);
geometry.setAttribute("uv", new THREE.BufferAttribute(uvs, uvNumComponents));
geometry.setIndex([
0,
1,
2,
2,
1,
3, // ์์ชฝ
4,
5,
6,
6,
5,
7, // ์ค๋ฅธ์ชฝ
8,
9,
10,
10,
9,
11, // ๋ค์ชฝ
12,
13,
14,
14,
13,
15, // ์ผ์ชฝ
16,
17,
18,
18,
17,
19, // ์๋จ
20,
21,
22,
22,
21,
23, // ํ๋จ
]);
// ...์๋ต...
๐ ์ฐธ๊ณ ์๋ฃ
Primitives
Custom BufferGeometry
Three.js: Geometries and materials
Bevel