3๊ฐ Geometry

BufferGeometry
Geometry๋ ๊ธฐ๋ณธ์ ์ผ๋ก BufferGeometry๋ฅผ ์์๋ฐ๋๋ค.
Geometry์ ํ์์ ์ ์ํ๊ธฐ ์ํ ๋ฐ์ดํฐ๋ ์ด 6๊ฐ์ง์ด๋ค.

Geometry์ ํ์์ ์ ์ํ๊ธฐ ์ํ ๋ฐ์ดํฐ
- ์ ์ : xyz ์ถ์ ๋ํ ์ขํ
- ์ ์ ์ธ๋ฑ์ค: 3์ฐจ์ ์ค๋ธ์ ํธ์ ๋ฉด์ ๊ตฌ์ฑํ๋ ์ ์ ์ ๋ํ ์ธ๋ฑ์ค
- ์์ง ๋ฒกํฐ: ์ ์ ์ ๋ํ ์์ง ๋ฒกํฐ
- ์ ์ ์์: ๋ฒกํฐ ์ ์ ์ ์์
- ํ ์ค์ณ ๋งตํ์ ์ํ UV ์ขํ
- ์ฌ์ฉ์ ์ ์ ๋ฐ์ดํฐ
3์ฐจ์ ์๊ฐํ๋ ์ด ์ฌ์ฏ ๊ฐ์ง ๋ฐ์ดํฐ๊ฐ GPU์ ์ ๋ฌ๋๋ฉด์ ์ฒ๋ฆฌ๋๋ค.
โUV ์ขํ๋

- UV ์ขํ๋ ํ ์ค์ณ ์ด๋ฏธ์ง๋ฅผ 3์ฐจ์ ์ค๋ธ์ ํธ์ ์ ํ๊ธฐ ์ํ ๋ณํ ๊ธฐ์ค.
- 3D ๋ชจ๋ธ์ ํ๋ฉด์ 2์ฐจ์ ์ขํ๋ก ์ ๊ฐํ๋ฉด UV ์ขํ๊ฐ ๋๋ค
- ์ขํ๊ฐ์ 0 ~ 1 ์ฌ์ด์ ๊ฐ๋ง ๊ฐ์ง ์ ์๋ค.
three.js๊ฐ ์ ๊ณตํ๋ Geometry
ParametricGeometry
: ์ํ์ ํจ์์์ 2๊ฐ์ ๊ฐ์ ์ ๋ ฅํ์ฌ ์ป์ ์ ์๋ ์ขํ๋ก ๊ตฌ์ฑ๋๋ GeometryEdgesGeometry
: ์ง์ค๋ฉํธ๋ฆฌ๋ฅผ ๊ตฌ์ฑํ๋ ์ธ์ ๋ฉด์ ๊ฐ๋์ ๋ฐ๋ผ Geometry๋ฅผ ์ฌ๊ตฌ์ฑํจPolyhedrongGeometry
: ๋ค๋ฉด์ฒด๋ฅผ ๊ตฌ์ฑํ๋ Geometry
๊ทธ ์ธ Geometry๋ ์ค์ต์ ํตํด ํ๋์ฉ ์์๋ณด๋๋ก ํ๋ค.
Geometry๋ฅผ ์ดํดํ๊ธฐ ์ํ ์ค๋น ์ฝ๋ ์์ฑ
1. geometry
๋ฅผ ์์ด์ดํ๋ ์ ํํ๋ก ํํํ๊ธฐ ์ํด LineSegments ๊ฐ์ฒด๋ฅผ geometry
๋ชจ๋ธ๊ณผ ๊ทธ๋ฃนํํ๋ค
const line = new THREE.LineSegments(new THREE.WireframeGeometry(geometry), lineMaterial);
const group = new THREE.Group();
group.add(cube);
group.add(line);
this._scene.add(group);
LineSegments
: ์ ์ ์๋ค์ ์ฐ๊ฒฐํ๋ line ์ค๋ธ์ ํธWireframeGeometry
: ๋ชจ๋ธ์ ๋ชจ๋ ์ธ๊ณฝ์ ์ ํ์ํ๊ธฐ ์ํ GeometryGroup
: ์๋ก ๋ค๋ฅธ ์ค๋ธ์ ํธ๋ฅผ ํ๋์ ์ค๋ธ์ ํธ๋ก ๋ฌถ์ด์ ๋ค๋ฃฐ ์ ์์
2. ์ฌ์ฉ์๊ฐ ๋ง์ฐ์ค๋ฅผ ์ด์ฉํด ์ค๋ธ์ ํธ๋ฅผ ์ง์ ํ์ ์ํฌ ์ ์๋๋ก ํ๋ค.
- three.js examples์์ ์ ๊ณตํ๊ณ ์๋ OrbitControls.js ์ฝ๋๋ฅผ ์ํฌํธ ํ์ฌ ์ฌ์ฉ
OrbitsControls
๋ Camera์ ๋ง์ฐ์ค ์ด๋ฒคํธ๋ฅผ ๋ฐ๋ DOM element(_divContainer
) ๋ฅผ ๋ฐ์
three.js๊ฐ ์ ๊ณตํ๋ Geometry ์ฌ์ฉํด ๋ณด๊ธฐ
three.js ๊ณต์๋ฌธ์์์ Geometry์ ์ธ์๋ฅผ ๋ณ๊ฒฝํด ๊ฐ๋ฉฐ ๊ฒฐ๊ณผ๋ฅผ ๋ฐ๋ก ํ์ธํ ์ ์๋ค.
Geometry์ ํ๋ผ๋ฏธํฐ
Geometry์ ์ฌ์ด์ฆ๋ฅผ ์กฐ์ ํ๋ ํ๋ผ๋ฏธํฐ ์ธ์๋ ๋ค์๊ณผ ๊ฐ์ ํ๋ผ๋ฏธํฐ๊ฐ ์ฌ์ฉ๋๋ค.
segments
: ๋ถํ ์- ex)
CircleGeometry
(2์ฐจ์ ์๋ฐ ํ์)์ segments๊ฐ์ ๋ฐ๋ผ ์ผ๊ฐํ, ์ฌ๊ฐํ, โฆ, ์ํ(์ ๊ฐ๊น์ด ํ์)์ด ๋๋ค. - ex)
ConeGeometry
(3์ฐจ์ ๊ณ ๊น ํ์)์ radial segments์ ๋ฐ๋ผ ์ผ๊ฐ๋ฟ, ์ฌ๊ฐ๋ฟ, โฆ, ์๋ฟ(์ ๊ฐ๊น์ด ํ์)์ด ๋๋ค.
- ex)
- openEnded: ๋ฐ๋ฅ ๋๋ ์ฒ์ฅ์ด ์๋ ํ์์ผ ๊ฒฝ์ฐ false๋ฉด ๋งํ์๊ณ true์ด๋ฉด ๋ซ๋ ค์๋ค
- theta: radian ๋จ์๋ฅผ ์ฌ์ฉํ๋ฉฐ, ํ์์ ๊ฐ๋๋ฅผ ์กฐ์ ํ๋ค
- thetaStart: ์์ ๊ฐ๋. ๊ธฐ๋ณธ๊ฐ 0
- thetaLength: ์ฐ์ฅ ๊ฐ๋. ๊ธฐ๋ณธ๊ฐ 2pi

ShapeGeometry
์์ฑ ์ Shape ํด๋์ค ๊ฐ์ฒด๋ฅผ ์ธ์๋ก ๋ฐ์
Shape ๊ฐ์ฒด๋ฅผ Mesh๋ก ํํํ๋ค.
Shape ํด๋์ค: 2์ฐจ์ ๋ํ์ ์ ์ํ๋ ํด๋์ค
- moveTo(x, y): ์ขํ ์ด๋
- lineTo(x, y): ํ์ฌ ์ขํ์์ (x, y) ์ขํ๊น์ง ์ ์ ๊ทธ์
- closePath(): ๋ํ์ ๋ซ๋๋ค
- bezierCurveTo(): ๋ฒ ์ด์ ๊ณก์ ์ ๊ทธ๋ฆฐ๋ค
TubeGeometry
์์ฑ ์ Curve ํด๋์ค ๊ฐ์ฒด๋ฅผ ์ธ์๋ก ๋ฐ์
Curve ๊ณก์ ์ ๋ฐ๋ผ์ ์ํต์ด ์ด์ด์ง๋ Mesh
Curve ํด๋์ค: ๊ณก์ ์ ์ ์ํ๋ ํด๋์ค
- Curve ํด๋์ค๋ฅผ ์์๋ฐ๊ณ
getPoint(t)
๋ฅผ override ํ์ฌ ๊ณก์ ์ ์ ์ํ ์ ์๋ค. - ์ปค๋ธ๋
getPoint(t)
์์ ๋ฐฉ์ ์์ผ๋ก ์ ์ํ๋ค getPoints(divisions)
: divisions๋ ์ปค๋ธ๋ฅผ ๊ตฌ์ฑํ๋ ์ขํ์ ๊ฐ์. ๊ฐ์ด ํด์๋ก ๋ ๋ถ๋๋ฌ์ด ๊ณก์ ์ด ๋๋ค.
LatheGeometry
y์ถ์ผ๋ก ํ์ ํ์ฌ ์ป์ด์ง๋ 3์ฐจ์ Mesh
์์ฑ ์ ํ์ ์ํฌ ๋ํ์ ์ธ์๋ก ๋ฐ์
์ค์ต์์๋ 2์ฐจ์ Vector array๋ฅผ ์ธ์๋ก ๋ฐ๊ณ ์ด ๊ฒ์ y์ถ์ ๋ํด ํ์ ์ํจ๋ค.
const points = [];
for (let i = 0; i < 10; ++i) {
points.push(new THREE.Vector2(Math.sin(i * 0.2) * 3 + 3, (i - 5) * 0.8));
}
ExtrudeGeometry
์์ฑ ์ Shape ํด๋์ค ๊ฐ์ฒด์ ์ธํ ๊ฐ์ด ๋ค์ด์๋ object๋ฅผ ์ธ์๋ก ๋ฐ์
ํ๋ฉด Shape์ ๊น์ด ๊ฐ์ ๋ถ์ฌํด ์ฃผ๊ณ Mesh์ ์ ๋ฉด๊ณผ ๋ฐ ๋ฉด์ ๋น์ค๋ฌํ๊ฒ ์ฒ๋ฆฌํด ์ฃผ๋ Geometry
** extrude: ๋์ถํ๋ค, beveling: ๋น์ค๋ฌํ๊ฒ ํ๊ธฐ, ์ฌ๊ฐ ๋ง๋ค๊ธฐ.
ExtrudeGeometry์ ์ธํ ๊ฐ
- steps: ๊น์ด๋ฅผ ๋ฐ๋ผ segments๋ก ๋ถ๋ฆฌํ ๋ ์ฌ์ฉ๋๋ point์ ๊ฐ์
- depth: ์ด๋ ๊น์ด๊น์ง Shape์ ๋์ถ์ํฌ์ง
- bevelEnabled: ๋ฒ ๋ฒจ๋ง ์ฌ๋ถ
- bevelThickness: ๋ฒ ๋ฒจ๋ง์ ์๋ Shape์ผ๋ก๋ถํฐ ์ผ๋ง๋ ๊น๊ฒ ํ ๊ฒ์ธ์ง
- bevelSize: ๋ฒ ๋ฒจ์ด Shape์ ํ ๋๋ฆฌ๋ก๋ถํฐ ์ผ๋งํผ ํ์ฅ๋ ์ ์๋์ง
- bevelSegments: ๋ฒ ๋ฒจ layer ๊ฐ์
TextGeometry
ExtrudeGeometry
๋ฅผ ์์๋ฐ๋๋ค.
font ๋ฐ์ดํฐ๊ฐ ํ์ํ๋ฉฐ, font๋ฅผ ๋ก๋ํ ๋๋ FontLoader ํด๋์ค๋ฅผ ์ฌ์ฉํ๋ค.
- FontLoader.load(): font ๋ฐ์ดํฐ๋ฅผ ๋น๋๊ธฐ์ ์ผ๋ก ๋ก๋ํ๋ ํจ์
- ๋ก๋๋ font๋ฅผ TextGeometry์ ์ ๋ฌํ๋ฉด ํด๋น font๋ก 3D ํ ์คํธ๊ฐ ๋ ๋๋ง ๋๋ค.
๋ง๋ฌด๋ฆฌ
three.js์์ ์ ๊ณตํ๋ ์ฌ๋ฌ ์ข ๋ฅ์ ์ง์ค๋ฉํธ๋ฆฌ๋ฅผ ์ง์ ๋ค๋ค๋ณผ ์ ์์๋ค.
๋จ์ํ ๋ฐ๋ผ ์น๋ ๊ฒ์ด ์๋๋ผ ์ด๋ค ์์ฑ๋ค์ด ๊ณตํต์ ์ผ๋ก ์ฌ์ฉ๋๋์ง, ์ด๋ป๊ฒ ์์ฉ๋ ์ ์์์ง๋ฅผ ์๊ฐํ๋ฉฐ ๋ค์๋ค.
๋์์ด๋์ ํ์ ํ๋ค๋ฉด ์ง์ ์ง์ค๋ฉํธ๋ฆฌ๋ฅผ ๊ตฌ์ฑํ๋ ์ผ์ ๋ง์ด ์์ ๊ฒ ๊ฐ๋ค๋ ์๊ฐ์ด ๋ค์์ง๋ง, ์ง์ค๋ฉํธ๋ฆฌ๊ฐ ์ด๋ป๊ฒ ๊ตฌ์ฑ๋๊ณ ์ด๋ค ์์ฑ์ ๋ฐ๋ผ ํํ๊ฐ ๊ฒฐ์ ๋๋์ง ์ดํดํ ์ ์์๋ค.
bevel์ด๋ผ๋ ๊ฐ๋ ์ด ์กฐ๊ธ ์์ํ๋๋ฐ ๊ต์ฅํ ์ค์ํ๊ณ ์์ฃผ ์ฌ์ฉ๋๋ ์์ฑ์ด๋ผ๊ณ ํ๋ค.
์ด ์ฌ์ดํธ๋ ์ฌ๋ฌ 3d ๊ฐ์ฒด์ ์์ฑ๊ฐ์ ๋ณ๊ฒฝํด ๋ณผ ์ ์๋ค. ์ฌ๊ธฐ์ bevel ๊ฐ์ ์ด๋ฆฌ์ ๋ฆฌ ๋ณ๊ฒฝํด ๋ณด๋ฉด์ 3d ๊ฐ์ฒด์ ํ ๋๋ฆฌ๋ฅผ ๋ถ๋๋ฝ๊ฒ ๊น์๋ด๋ ์์ฑ์ด๋ผ๊ณ ์ดํดํ๋ค.
'๐ฟ ์คํฐ๋' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[three.js] Scene Graph๋ฅผ ์ด์ฉํ ๊ณต๊ฐ๊ตฌ์ฑ (0) | 2023.06.08 |
---|---|
[ํด๋ฆฐ์ฝ๋] 3์ฅ ํจ์ with Typescript (0) | 2023.06.03 |
[ํด๋ฆฐ์ฝ๋] 2์ฅ ์๋ฏธ์๋ ์ด๋ฆ with Typescript (0) | 2023.05.28 |
[three.js] ๊ธฐ๋ณธ ๊ตฌ์ฑ ์์ - ํ์ ํ๋ ํ๋์ ์ ์ก๋ฉด์ฒด ๋ ๋๋งํ๊ธฐ (0) | 2023.05.26 |
[ํด๋ฆฐ์ฝ๋] 1์ฅ ๊นจ๋ํ ์ฝ๋๋ ๋ฌด์์ธ๊ฐ์ ๊ฐ๋ฐ์์ ์ฑ ์๊ณผ ์๋ฌด (0) | 2023.05.21 |