반응형
쿼터니언 이해에 아주 애를 먹고 있다..
번역
- 각 오브젝트마다 X, Y, Z, pitch, yaw, roll을 저장하는 대신에 X,Y,Z, 방향(orientation)을 정의해라. 방향은 (0, 0, 0, 1)의 값을 가지는 쿼터니언으로 선언한다. 즉 0도 회전을 의미한다. pitch, yaw, roll을 저장하는 것은 특이 현상(짐벌락)에 취약하다. 그 이유는 작은 변화가 추가될 수록 중간 회전들은 회전축과 평행해지는 결과를 낳을 수 있다. 그래서 다음 회전이 실패할 수 있다.
- 그리고 오브젝트가 회전할 때 한 프레임에서 발생한 pitch, yaw, roll을 결정해라. 그리고 그것을 쿼터니언으로 변환해라. 그리고 미리 곱해라 이 쿼터니언과 오브젝트의 방향 쿼터니언을. 이 접근은 특이 현상에 덜 취약하다. 왜냐하면 회전의 변화가 각 프레임마다 매우 적을 것으로 예상되기 때문이다.
- 방향을 바꾼 후 직접적으로 오브젝트의 x, y, z를 수정하지마라. (너의 정점 버퍼의?) 대신 오브젝트의 방향이 변할 때 새로운 회전 행렬을 만들어라. -> 오브젝트의 월드 행렬의 부분 역할을 하는
- 방향 쿼터니언은 항상 노멀라이즈를 해라.
1. Instead of storing X, Y, Z, pitch, yaw, roll for each object, instead store X, Y, Z, orientation in each object, where orientation is a quaternion starting at the initial value (0, 0, 0, 1), meaning no rotation. Storing pitch, yaw, and roll for each object is vulnerable to singularities (gimbal lock) because as small changes are added, one of the intermediate rotations (say, a pitch) could result in the object being parallel to a rotation axis (say, the yaw axis), so that the next rotation about that axis could fail.
2. Then, as an object is rotated, determine the pitch, yaw, and roll for that object that occurred during that frame (assuming that your input device provides the rotation in that form), convert it to a quaternion, then pre-multiply that quaternion into the object's orientation quaternion. This approach is less vulnerable to singularities because the changes in the rotation are expected to be very small each frame.
3. Don't modify the object's X, Y, and Z (your verticies array) directly after changing the orientation. Instead, when an object's orientation changes, create a new rotation matrix to serve as part of the object's world transformation matrix (along with scaling and translation; for best results, calculate the world transform as translation * rotation * scaling).
4. Every few frames, you should normalize the orientation quaternion to avoid undesirable changes in the orientation, which can happen due to rounding error.
https://stackoverflow.com/questions/28776788/quaternion-reaching-gimbal-lock
'게임 공부 > DirectX' 카테고리의 다른 글
Geometry Shader (0) | 2021.05.27 |
---|---|
셰이더로 행렬을 전달하기 전에 전치를 취해야 하는 이유는? (1) | 2021.05.07 |
XMMatrixLookAtLH과 XMMatrixLookToLH 차이 (0) | 2021.05.04 |
[DX11] UpdateSubresource 와 map은 각각 언제? (0) | 2021.04.18 |
Blend state (0) | 2021.04.03 |
댓글