저는 게임 개발자이며 수학을 공부하지 않았습니다. 그래서 나는 Quaternions를 도구로 사용하고 싶습니다. 그리고 3D 회전으로 작업하려면 쿼터니언 (또는 행렬)을 사용해야합니다. 그러나이 질문에서 쿼터니언에 머물도록하겠습니다. 많은 개발자들이 사용하는 것이 중요하다고 생각합니다. 그렇기 때문에 지식을 공유하고 희망을 채우고 싶습니다. 지금....
내가 이해하는 한 :
쿼터니언은 다음 두 가지를 설명 할 수 있습니다.
- 3D 객체의 현재 방향입니다.
- 객체가 할 수있는 회전 변형. (rotationChange)
쿼터니언으로 할 수 있습니다 :
곱셈 :
쿼터니언 endOrientation = 쿼터니언 rotationChange * 쿼터니언 currentOrientation;
예를 들어, 내 3D 개체가 왼쪽으로 90 ° 회전하고 내 회전에 180 ° 오른쪽으로 회전하면 3D 개체 90 °가 오른쪽으로 회전합니다.
쿼터니언 rotationChange = 쿼터니언 endRotation * 쿼터니언 .Inverse (startRotation);
이것으로 당신은 다른 방향에 적용 할 수있는 rotationChange를 얻습니다.
Vector3 endPostion = 쿼터니언 rotationChange * Vector3 currentPosition;
예를 들어, 내 3D 객체는 위치 (0,0,0)에 있고 내 회전은 180도 오른쪽으로 회전하며 내 위치는 (0, -50,0)과 같습니다. 그 쿼터니언 안에는 축이 있고 그 축을 중심으로 회전합니다. 그 축을 중심으로 Y도를 돌립니다.
Vector3 rotatedOffsetVector = 쿼터니언 rotationChange * Vector3 currentOffsetVector;
예를 들어 : 시작 방향이 위로-(0,1,0)을 표시하고 내 회전에 곱하기 회전이 180도에서 오른쪽으로, 끝 방향이 아래로 표시됩니다. (0, -1,0)
블렌딩 (Lerp and Slerp) :
쿼터니언 currentOrientation = 쿼터니언 .Slerp (startOrientation, endOrientation, 보간 기)
보간 기가 1 인 경우 : currentOrientation = endOrientation
보간 기가 0 인 경우 : currentOrientation = startOrientation
Slerp는보다 정밀하게 보간하고, Lerp는 성능이 더 뛰어납니다.
내 질문 :
지금까지 설명한 모든 것이 정확합니까?
쿼터니언으로 "모두"할 수 있습니까? (obv. 아님)
그들과 다른 무엇을 할 수 있습니까?
2 개 쿼터니언 사이의 Dot 제품과 Cross 제품은 무엇입니까?
편집하다:
일부 답변으로 업데이트 된 질문
n
다른 방향 (태도, 자세 등) 이 있다고 가정 해보십시오 . 그런 다음 가중치를 사용하여 평균화하여 효과적으로 slerp / lerp를 일반화 할 수 있습니다. 쿼터니언을 로터로 변환 할 수도 있는데, 이는 일정 시간 동안 강체에 각속도를 적용하는 것과 같습니다. 따라서 쿼터니언과 각속도 통합을 설명 할 수 있습니다. 또한 서로 다른 두 방향이 어떻게되는지를 추정 할 수 있습니다 (초 구면의 두 쿼터니언이 차지하는 호의 길이 계산).