Câu trả lời:
Bạn có thể phân tách bộ tứ của bạn thành một tập hợp các góc ngáp / cao độ / cuộn, nhưng điều đó thường quá mức cần thiết.
Thay vì sáng tác tứ phương của bạn như thế này:
cameraOrientation = cameraOrientation * framePitch * frameYaw;
Thử đi:
cameraOrientation = framePitch * cameraOrientation * frameYaw;
Sau đó, nó sẽ không bao giờ tạo nghiêng / cuộn và tương đương với việc lưu trữ ngáp và cao độ riêng biệt
framePitch
và frameYaw
float
các loại? Ngoài ra, tôi sẽ biết ơn về một số làm rõ về câu đầu tiên của bạn.
cameraOrientation
, framePitch
và frameYaw
là tất cả các bậc bốn (mỗi bậc bốn là 4 phao hoặc đôi).
Đây là một vấn đề tôi đã có một thời gian và tôi không thể tìm thấy bất kỳ câu trả lời nào, vì vậy tôi nghĩ rằng tôi sẽ đăng nó ở đây.
Nó thực sự là khá đơn giản. Làm thế nào bạn có nhiều khả năng thực hiện các phép quay là như thế này:
currentDirection * newRotation;
Nhưng, làm như thế này cũng không hiệu quả.
newRotation * currentDirection;
Những gì bạn phải làm, là thực hiện theo thứ tự đầu tiên cho các vòng quay lên và xuống, và theo thứ tự thứ hai cho các vòng quay ngang.
Đối với tôi, nó là như thế này:
if (keyboard.IsKeyDown(Keys.Up))
Direction = Direction * Quaternion.CreateFromAxisAngle(new Vector3(1, 0, 0), TurnSpeed);
if (keyboard.IsKeyDown(Keys.Down))
Direction = Direction * Quaternion.CreateFromAxisAngle(new Vector3(-1, 0, 0), TurnSpeed);
if (keyboard.IsKeyDown(Keys.Left))
Direction = Quaternion.CreateFromAxisAngle(new Vector3(0, 0, 1), TurnSpeed) * Direction;
if (keyboard.IsKeyDown(Keys.Right))
Direction = Quaternion.CreateFromAxisAngle(new Vector3(0, 0, -1), TurnSpeed) * Direction;
Vì một lý do tại sao, cách thứ nhất có vòng xoay so với hướng đi ngang hiện tại, mà bạn muốn lên và xuống, nhưng bạn không muốn điều đó cho các vòng xoay ngang, đó là lý do tại sao thứ tự thứ hai là cần thiết.
Đối với máy ảnh FPS, bạn thường không muốn cuộn và bị giới hạn ở khoảng +/- 90 độ, vì vậy tôi chỉ cần theo dõi trạng thái hiện tại bằng cách sử dụng góc nghiêng và góc nghiêng. Toàn bộ sức mạnh của tứ phương không thực sự hữu ích cho việc này.
Bạn vẫn có thể chuyển đổi các góc ngáp / cao độ sang và từ các bậc bốn trong trường hợp bạn muốn chuyển đổi giữa máy ảnh FPS và máy ảnh hoạt hình bằng cách sử dụng phép nội suy khung hình tứ giác hoặc đại loại như thế.