본문 바로가기
프론트엔드/Three.js

오일러(Euler) vs. 쿼터니언(Quaternion)

by 느바 2025. 2. 1.
반응형

오일러(Euler) vs. 쿼터니언(Quaternion)

Three.js에서 3D 객체를 회전시키는 방법에는 오일러 각(Euler Angles)쿼터니언(Quaternion) 두 가지가 있습니다. 이 두 개념은 각각 장단점이 있기 때문에, 사용 목적에 따라 선택해야 합니다.


1. 오일러(Euler) 각

특징

  • X, Y, Z 축을 기준으로 회전을 적용하는 방식
  • 각 축에 대한 개별적인 회전 값을 직접 설정할 수 있음
  • 사람이 이해하기 쉬움 (각도 단위로 표현)

단점

  • 짐벌 락(Gimbal Lock) 문제가 발생할 수 있음
    → 특정 각도에서 하나의 회전 축이 다른 축과 정렬되면서 자유도를 잃는 현상
  • 연속적인 회전이 부드럽지 않을 수 있음

예제

cube.rotation.set(Math.PI / 4, Math.PI / 4, 0);  // X, Y, Z 각도 설정

2. 쿼터니언(Quaternion)

특징

  • 4차원 수학 개념을 기반으로 회전을 표현
  • 짐벌 락 문제 없음
  • 부드러운 회전과 보간(Interpolation)이 가능
    → 애니메이션, 자연스러운 움직임에 적합

단점

  • 직관적으로 이해하기 어려움
    → X, Y, Z 각도를 직접 설정하는 게 아니라, 내부적으로 4개의 값 (x, y, z, w)을 사용함

예제

cube.quaternion.setFromEuler(new THREE.Euler(Math.PI / 4, Math.PI / 4, 0));

또는 두 개의 쿼터니언을 보간하여 자연스럽게 회전:

const q1 = new THREE.Quaternion();
const q2 = new THREE.Quaternion().setFromEuler(new THREE.Euler(Math.PI / 4, Math.PI / 4, 0));
THREE.Quaternion.slerp(q1, q2, cube.quaternion, 0.1);

오일러 vs. 쿼터니언 비교 정리

  오일러(Euler) 쿼터니언(Quaternion)
이해하기 쉬운가? ✅ 직관적 (X, Y, Z 각도) ❌ 어렵다 (4D 개념)
짐벌 락(Gimbal Lock) 문제 ❌ 발생 가능 ✅ 문제 없음
애니메이션 / 보간 ❌ 부자연스러울 수 있음 ✅ 부드러움
사용 사례 개별 축을 기준으로 회전할 때 연속적인 회전이 필요할 때

결론: 언제 사용해야 할까?

  • 오일러(Euler) → 간단한 회전이 필요할 때 (예: 고정된 X, Y, Z 축 회전)
  • 쿼터니언(Quaternion) → 자연스럽고 부드러운 애니메이션이 필요할 때 (예: 카메라 이동, 캐릭터 회전)

둘 다 Three.js에서 함께 사용할 수 있으며, 필요할 때 변환이 가능합니다!

 

https://en.wikipedia.org/wiki/Quaternion

 

Quaternion - Wikipedia

From Wikipedia, the free encyclopedia Noncommutative extension of the complex numbers Cayley Q8 graph showing the six cycles of multiplication by i, j and k. (If the image is opened in the Wikimedia Commons by clicking twice on it, cycles can be highlighte

en.wikipedia.org

https://threejs.org/docs/index.html?q=eu#api/en/math/Euler

 

three.js docs

 

threejs.org

https://threejs.org/docs/index.html?q=Quaternion#api/en/math/Quaternion

 

three.js docs

 

threejs.org

 

반응형

'프론트엔드 > Three.js' 카테고리의 다른 글

Cannon.js  (0) 2025.02.01
Three.Clock  (0) 2025.02.01
THREE.Euler  (0) 2025.02.01
Three.js vs Unity  (1) 2025.01.05
Three.js 재질별 material 속성 정리  (0) 2024.08.15