🔄 3D 회전 순서의 중요성

🎯 핵심 개념

3D 회전에서 순서가 중요한 이유

일반 숫자: a × b = b × a ✅
회전 행렬: R₁ × R₂ ≠ R₂ × R₁ ❌
쿼터니언: Q₁ × Q₂ ≠ Q₂ × Q₁ ❌

📐 실제 비교: 45° Yaw + 30° Pitch

순서 1: Yaw → Pitch

앞면
뒷면
우측
좌측
아래
Y축 회전 → X축 회전
rotateY(45°) × rotateX(30°)

순서 2: Pitch → Yaw

앞면
뒷면
우측
좌측
아래
X축 회전 → Y축 회전
rotateX(30°) × rotateY(45°)
⚠️ 같은 각도지만 완전히 다른 결과!

🎮 드론 코드에서의 적용

// 언리얼 엔진 드론 코드 FQuat NewQuat = YawQuat * CurrentQuat * PitchQuat; // 실제 적용 순서 (오른쪽부터): // 1. PitchQuat (상하 회전) - 로컬 좌표계 // 2. CurrentQuat (현재 회전) // 3. YawQuat (좌우 회전) - 월드 좌표계

🔍 왜 이 순서인가?

  • Pitch 먼저: 드론의 로컬 좌표계에서 상하 회전 (고개 끄덕임)
  • Yaw 나중: 월드 좌표계에서 좌우 회전 (몸 전체 회전)
  • 결과: 자연스러운 FPS 게임 카메라 움직임

🚁 실제 드론 움직임 시뮬레이션

🔢 수학적 증명

간단한 예시: 90° + 90° 회전

벡터 (1, 0, 0)을 회전시키기: 방법 1: X축 90° → Y축 90° (1,0,0) → (1,0,0) → (0,0,-1) 방법 2: Y축 90° → X축 90° (1,0,0) → (0,0,1) → (0,-1,1)
❌ 완전히 다른 결과가 나옵니다!

회전 행렬 계산:

R_x(90°) × R_y(90°) ≠ R_y(90°) × R_x(90°) 첫 번째: [0 0 1] 두 번째: [0 -1 0] [0 1 0] [0 0 1] [-1 0 0] [1 0 0]

💡 깃허브 프로젝트 적용 팁

README.md에 포함할 내용:

# 3D 회전 순서 주의사항 ## 올바른 쿼터니언 곱셈 순서 ```cpp // ✅ 올바른 순서 FQuat Result = YawQuat * CurrentQuat * PitchQuat; // ❌ 잘못된 순서 FQuat Result = PitchQuat * CurrentQuat * YawQuat; ``` ## 이유 - 쿼터니언 곱셈은 교환법칙이 성립하지 않음 - 회전 순서에 따라 완전히 다른 결과 - FPS 게임에서 자연스러운 조작감을 위해 순서 중요