Three.js/기초튼튼

three.js 카메라 위치 변경, 객체 위치 변경, 애니메이팅 - Camera Position, LookAt, Mesh Position, Animating, AxesHelper, SphereGeometry

carrotweb 2023. 6. 11. 01:07
728x90
반응형

Camera(카메라)는 위치(position)를 설정하지 않으면 Scence(씬, 장면)의 중앙을 보게 됩니다.

 

그래서 Camera(카메라)의 위치(position)는 조정하여 객체가 입체적으로 보이도록 하겠습니다.

 

 

1. Camera(카메라)의 Z 위치가 커지면 Scence(씬, 장면)를 중심으로 카메라가 뒤로 이동합니다.

 

Camera(카메라)의 Z 위치를 2로 설정합니다.

// 카메라 Z 위치를 이동
camera.position.z = 2;

Camera(카메라)의 Z 위치를 5로 다시 설정합니다.

// 카메라 Z 위치를 이동
camera.position.z = 5;

Camera(카메라)의 Z 위치는 Camera(카메라)를 생성할 때 설정한 near(카메라부터 가까운 거리)부터 far(카메라부터 먼 거리) 안의 값으로 설정해야 합니다. (이전 생성할 때 near는 0.1, far는 1000입니다.)

 


2. Camera(카메라)의 X 위치 커지면 Scence(씬, 장면)를 중심으로 오른쪽으로 카메라가 이동합니다.

 

Camera(카메라)의 X 위치를 1로 설정합니다.

// 카메라 X 위치를 이동
camera.position.x = 1;

Camera(카메라)의 X 위치를 2로 다시 설정합니다.

// 카메라 X 위치를 이동
camera.position.x = 2;

 

 

3. Camera(카메라)의 Y 위치 커지면 Scence(씬, 장면)를 중심으로 위쪽으로 카메라가 이동합니다.

 

Camera(카메라)의 Y 위치를 1로 설정합니다.

// 카메라 Y 위치를 이동
camera.position.y = 1;

Camera(카메라)의 Y 위치를 2로 다시 설정합니다.

// 카메라 Y 위치를 이동
camera.position.y = 2;

 

Camera(카메라)의 위치(position)를 조정하니 객체가 입체적으로 보입니다.

 

Camera(카메라)는 위치(position)를 한 번에 설정할 수도 있습니다.

// 카메라 X, Y, Z 위치를 이동
camera.position.set(2, 2, 5);

 

 

객체들을 Scence(씬, 장면)에 추가할 때 Scence(씬, 장면)의 중앙이 어디에 있는지 헷갈릴 수 있습니다.

그래서 Scence(씬, 장면)에 3개의 축(X, Y, Z)을 시각화할 수 있습니다. 

 

4. Scence(씬, 장면)에 추가할 축 도우미(AxesHelper, 엑시즈 헬퍼)를 생성합니다.

AxesHelper(size : Number)
  • size(크기) : 축의 길이입니다. 기본값 1 (입력하지 않으면 기본값으로 설정됩니다.)

축의 길이를 5로 설정하고 Scence(씬, 장면)에 추가합니다.

// 장면에 X, Y, Z 축을 표시 (X : Red, Y : Green, Z : Blue) 
const axes = new THREE.AxesHelper(5);
scene.add(axes);

 

그러면 Scence(씬, 장면)에  X 축은 붉은색, Y 축은 녹색, Z 축은 파란색으로 표시됩니다.

확실하게 Scence(씬, 장면)의 중앙 위치가 확인됩니다.

 

이어서 구(Sphere)를 생성하여 위치(position)를 지정하여 추가해 보도록 하겠습니다.

 

5. Scence(씬, 장면)에 추가할 SphereGeometry(스피어 지오메트리, 구)를 생성합니다.

SphereGeometry(radius : Float, widthSegments : Integer, heightSegments : Integer, phiStart : Float, phiLength : Float, thetaStart : Float, thetaLength : Float)
  • radius(레이디어스, 반지름, 반경) : 구의 반지름입니다. 기본값 1 (입력하지 않으면 기본값으로 설정됩니다.)
  • widthSegments(수평 세그먼트, 가로 분절 수) : 가로를 분할 면의 수입니다. 최소값 3, 기본값 32 (입력하지 않으면 기본값으로 설정됩니다.)
  • heightSegments(수직 세그먼트, 세로 분절 수) : 세로를 분할 면의 수입니다.  최소값 2, 기본값 16 (입력하지 않으면 기본값으로 설정됩니다.)
  • phiStart(파이 시작) : 수평 시작 각도입니다. 기본값 0 (입력하지 않으면 기본값으로 설정됩니다.)
  • phiLength(파이 길이) : 수평 스위프 각도 크기입니다. 기본값 Math.PI X 2 (입력하지 않으면 기본값으로 설정됩니다.)
  • thetaStart(세타 시작) : 수직 시작 각도입니다. 기본값 0 (입력하지 않으면 기본값으로 설정됩니다.)
  • thetaLength(세타 길이) : 수직 스위프 각도 크기입니다. 기본값 Math.PI (입력하지 않으면 기본값으로 설정됩니다.)

 

 

파이(Math.PI)는 180도입니다. (호도법, 라디안을 참고하세요.)

그래서 1도 = Math.PI / 180 입니다.

phiStart(파이 시작), phiLength(파이 길이), thetaStart(세타 시작), thetaLength(세타 길이)에서 각도 값을 설정할 때 사용하시면 됩니다.

(Math.PI/180) * 각도

 

반지름이 1인 구를 생성하고 구의 색상을 파란색으로 하기 위해서 Material(머티리얼)을 생성합니다.

SphereGeometry(스피어 지오메트리, 구)와 Material(머티리얼)을 사용하여 객체를 생성하고 객체의 위치(position)를 기존의 육면체 뒤에 오게 설정하여 Scence(씬, 장면)에 추가합니다.

// 구 지오메트리 생성
const sphere1Geometry = new THREE.SphereGeometry(1);
// 구에 사용할 색상과 질감의 데이터를 생성
const sphere1Material = new THREE.MeshBasicMaterial({color: 0x0000ff});
// 구와 색상과 질감의 데이터를 결합하여 구 객체 생성
const sphere1 = new THREE.Mesh(sphere1Geometry, sphere1Material);
// 구의 X, Y, Z 위치를 이동
sphere1.position.set(2, 1, -2);
// 장면에 구 객체 추가
scene.add(sphere1);

 

그러면 Scence(씬, 장면)에  구가 나타난 것을 확인할 수 있습니다.

 

 

Camera LookAt

 

Camera(카메라)가 객체를 바라보게 변경해 보도록 하겠습니다.

 

Camera(카메라)의 lookAt 함수를 사용하면 지정된 위치를 중심으로 렌더링 됩니다.

.lookAt(vector : Vector3)
.lookAt(x : Float, y : Float, z : Float)

 

Camera(카메라)가 육면체 객체를 중심으로 보게 변경합니다.

// 카메라를 육면체 객체를 보게 변경
camera.lookAt(box1.position);

 

그러면 육면체 객체가 화면 중앙에 오게 됩니다.

 

Camera(카메라)가 구 객체를 중심으로 보게 변경합니다.

// 카메라를 구 객체를 보게 변경
camera.lookAt(sphere1.position);

그러면 구 객체가 화면 중앙에 오게 됩니다.

 

Camera(카메라)가 Scence(씬, 장면)을 중심으로 보게 변경하면 육면체 객체를 중심으로 보게 변경합니다.

그 이유는 육면체 객체의 위치(position)가 X : 0,  Y : 0,  Z : 0이기 때문입니다.

// 카메라를 장면 중앙을 보게 변경
camera.lookAt(scene.position);

 

 

Animating(애니메이팅)

 

애니메이션처럼 계속 렌더링 되게 처리해 보겠습니다.

 

변경된 정보로 다시 렌더링 되게 하기 위해서는 HTML5를 지원하는 웹 브라우저의 내장 메서드인 requestAnimationFrame 메서드를 사용합니다.

requestAnimationFrame(callback : Function)
  • callback : 애니메이션을 업데이트할 시간이 되었을 때 호출할 함수입니다. (설정된 콜백 함수를 일반적으로 초당 60회 호출하지만 브라우마다 조금씩 다를 수 있습니다.)

 

1. 기존의 렌더러 함수는 주석 처리하고 애니메이션 함수를 생성합니다. 애니메이션 함수에는 렌더링을 위한 렌더러 함수와 애니메이션 함수를 다시 호출하기 위해 requestAnimationFrame 메서드를 추가합니다.

// 랜더링
// renderer.render(scene, camera);

// 애니메이팅
function animate() {
    renderer.render(scene, camera);
    requestAnimationFrame(animate);
};

animate();

 

2. 애니메이션을 위해 육면체 객체가 Scence(씬, 장면)의 X, Y, Z 축을 중심으로 회전(rotation) 시키겠습니다. (단위는 radian(라디안) 입니다.)

 

rotation.x는 객체가 Scence(씬, 장면)의 X 축을 중심으로 회전하게 합니다.

 

rotation.y는 객체가 Scence(씬, 장면)의 Y 축을 중심으로 회전하게 합니다.

 

rotation.z는 객체가 Scence(씬, 장면)의 Z 축을 중심으로 회전하게 합니다.

 

1 radian(라디안)은 약 57.3도입니다.

그래서 0.01 radian(라디안)은 0.573도입니다.

// 애니메이팅
function animate() {
    box1.rotation.x += 0.01;
    box1.rotation.y += 0.01;
    box1.rotation.z += 0.01;
    renderer.render(scene, camera);
    requestAnimationFrame(animate);
};

 

그러면 육면체 객체가 Scence(씬, 장면)의 X, Y, Z 축 방향으로 회전하는 것을 확인할 수 있습니다.

 

728x90
반응형