Three.js:

[Three.js] To infinity and beyond! 3D 웹 도전기 #4

oni(오니) 2024. 1. 4. 17:35

⚠️ 1분 코딩님의 강의를 바탕으로 작성한 글입니다.

Geometry

BoxGeometry

BoxGeometry(
    width : Float, 
    height : Float, 
    depth : Float, 
    widthSegments : Integer, 
    heightSegments : Integer, 
    depthSegments : Integer
)

 

CylinderGeometry

CylinderGeometry(
    radiusTop : Float, 
    radiusBottom : Float, 
    height : Float, 
    radialSegments : Integer, 
    heightSegments : Integer, 
    openEnded : Boolean, 
    thetaStart : Float, 
    thetaLength : Float
)

 

SphereGeometry

SphereGeometry(
    radius : Float, 
    widthSegments : Integer, 
    heightSegments : Integer, 
    phiStart : Float, 
    phiLength : Float, 
    thetaStart : Float, 
    thetaLength : Float
)

 

위 이미지 처럼 segment를 많이 나눈다는 것은 vertex(점)가 추가되었다는 의미와 같다. 그리고 이 vertex를 이용하여 원하는 모양으로 만들어 낼 수 있다.

만든 geometry를 콘솔로 찍어 내부를 들여다보면 attributes의 position이 바로 vertex의 위치를 담고 있는 배열이다. 이때 배열은 typed array(형식화 배열)이다. 특정 형식만 들어갈 수 있는 배열이다.

typed array(형식화 배열)
WebGL에서 바이너리 데이터를 처리하는 효율적인 방법이 필요하기 때문에 비교적 최근에 브라우저에 추가된 것입니다.
WebGL 및 바이너리 데이터를 처리하는 기타 API에 데이터를 전달하는 데 JavaScript 배열보다 훨씬 잘 작동합니다.

 

Camera Control

OrbitControls

'orbit', '궤도'라는 의미를 가진 이 기법은 scence의 중앙을 기준으로 궤도를 그리듯 자유롭게 카메라를 이동할 수 있다.

import { OrbitControls } from 'three/examples/jsm/controls/OrbitControls';

const controls = new OrbitControls(camera, renderer.domElement);

첫번째 인자로 카메라,  두번째 인자는 캔버스 객체를 가리키는 domElement를 받는다.

 

+ option

controls.enableDamping = true;

해당 옵션을 추가하면 카메라 컨트롤이 훨씬 부드럽게 동작한다. 이때 반드시 반복실행되는 함수에 update를 매번 실행시켜야 한다.

 

controls.enableZoom = false; // 줌인,줌아웃을 막는다.

controls.maxDistance = 10; // 물체와 멀어지는 거리의 한계를 설정한다.

controls.minDistance = 5; // 물체와 가까워지는 거리의 한계를 설정한다.

controls.minPolarAngle = Math.PI / 4; // 수직 방향의 회전 각도의 한계를 설정한다.

controls.autoRotate = true; // 자동으로 회전한다. 
controls.autoRotateSpeed = 5; // 회전 속도를 설정한다.

 

TrackballControls

import { TrackballControls } from 'three/examples/jsm/controls/TrackballControls';

const controls = new TrackballControls(camera, renderer.domElement);

OrbitControls와 달리 수직 방향도 회전이 가능하다. 단, 반복 실행 함수에서 update 메서드를 실행하지 않으면 동작하지 않는다.

 

FlyControls

게임처럼 키보드로 방향을 움직일 수 있다. 화면의 마우스 위치에 따라 자동으로 회전한다.

단, update 메서드에 인자를 전달해주어야 동작한다.

controls.rollSpeed = 0.05; // 회전 속도 조절
controls.movementSpeed = 3; // 키보드 이동 속도 조절

 

PointerLockControls

import { PointerLockControls } from 'three/examples/jsm/controls/PointerLockControls';

const controls = new PointerLockControls(camera, renderer.domElement);

// console.log(controls.domElement === renderer.domElement);
controls.domElement.addEventListener('click', () => {
    controls.lock();
})

controls.addEventListener('lock', () => {
    console.log('lock!')
})
controls.addEventListener('unlock', () => {
    console.log('unlock!')
})

 

DragControls

import { DragControls } from 'three/examples/jsm/controls/DragControls';

const controls = new DragControls(meshes, camera, renderer.domElement);

드래그할 mesh를 첫번째 인자로 보내줘야 한다. 이때 해당 컨트롤 변수는 mesh 함수 아래에 만들어줘야 한다는 점을 기억하자. 

 

controls.addEventListener('dragstart', e => {
    console.log(e)
})

이벤트함수를 이용하여 드래그할 객체의 정보를 얻을 수 있다.

 


📜 출처