개요
Scene에 담긴 오브젝트를 변형함으로써 나중에 애니메이션을 구현할 수 있다.
변형할 속성에는 4가지가 있는데 position, scale, rotation, quaternion이다.
Object3D 클래스를 갖고 있는 모든 클래스 (예: Camera, Mesh, ... ) 들은 4가지 속성을 전부 가지고 있다.
패키지 내부를 살펴보면 Object3D 클래스 내 4가지 속성과 이를 상속 받고 있는 클래스들을 볼 수 있다.
아래 박스와 AxesHelper를 가지고 오브젝트 변형을 실험해보자.
위를 준비하기 위한 코드는 아래와 같다.
LineSegments는 편의상 추가한 것이므로 이후 코드에서는 생략한다.
// Object
const geometry = new THREE.BoxGeometry(1, 1, 1);
const edges = new THREE.EdgesGeometry( geometry );
const line = new THREE.LineSegments(edges, new THREE.LineBasicMaterial( { color: "white" } ) );
scene.add(line);
const material = new THREE.MeshBasicMaterial({ color: 0x3333ff });
const mesh = new THREE.Mesh(geometry, material);
scene.add(mesh);
/**
* Axes Helper
*/
const axesHelper = new THREE.AxesHelper(2)
scene.add(axesHelper)
1. Position : 오브젝트 움직이기
Three.js는 객체 지향 프로그래밍으로 설계된 라이브러리여서 메서드 체이닝을 뜯어보는 것이 흥미롭다.
Mesh는 기본적인 3D 객체를 나타내는 클래스이다. 표면을 가지는 고체 객체나 모형을 표현할 수 있다.
Mesh는 위에서 언급했듯 Object3D 클래스를 상속받는데, 여기엔 position 속성이 있다. position은 Vector3 생성자를 통해 만들어진다.
Vector3 클래스를 살펴보면? x, y, z를 매개변수로 받으며 Vector3 인스턴스의 x, y, z 값이 해당 매개변수로 값으로 된다. 디폴트 값은 0, 0, 0이다. 또한 set 메서드를 통해 x, y, z 값을 변경할 수 있다. 그 외에 Vector3라는 이름에 맞게 벡터 관련 연산을 하는 메서드들이 많이 있는 걸 볼 수 있다.
1. position 변경해 Box 이동시키기
mesh.position.x = 0.7
mesh.position.y = - 0.6
mesh.position.z = 1
mesh.position.set(0.7, -0.6, 1)
위 두 가지 방법 중 하나로 객체의 위치를 조정할 수 있다.
2. 벡터 거리 측정하기
console.log("mesh.position.length()",mesh.position.length())
console.log("mesh.position.distanceTo(camera.position)", mesh.position.distanceTo(camera.position))
length와 distanceTo 메서드를 살펴보면
length는 원점에 대한 벡터 거리를 나타내고, distanceTo 는 인수로 주는 벡터와의 거리를 나타낸다.
camera.position은 Vector3 인스턴스로 distanceTo 인수에 넣을 수 있다.
3. 벡터 정규화하기
normalize 메서드는 벡터를 단위 벡터로 변환한다. 즉, 방향은 같지만 길이가 1인 벡터로 설정한다.
정규화는 여러 그래픽스 및 물리학 계산을 간단히 해주는 중요한 역할을 하므로 필요하다.
this.length || 1을 해주는 이유는, 정규화 하려는 벡터의 크기가 0인 경우를 처리하여 0으로 나누는 오류를 방지하기 위함이다.
'three.js journey' 카테고리의 다른 글
[three.js journey] 14강 복습: Lights (1) | 2024.06.27 |
---|---|
[three.js journey] 4강 복습: object transform (2) (0) | 2024.06.23 |
[three.js journey] 3강 복습: Three.js 프로젝트 시작하기 (2) (1) | 2024.06.16 |
[three.js journey] 23강 Blender 기초 (1) | 2024.06.10 |
[three.js journey] 3강 복습: Three.js 프로젝트 시작하기 (2) | 2024.06.07 |