Làm cách nào để giữ cho máy ảnh FPS sử dụng Quancyion của tôi không bị nghiêng và lộn xộn?


17

Tôi đang sử dụng một máy ảnh giống như FPS, và nó sử dụng tứ phương. Nhưng, bất cứ khi nào tôi cố gắng nhìn lên và sau đó đi ngang, nó nghiêng và đôi khi nó có thể đảo lộn. Làm thế nào tôi có thể sửa lỗi này?


3
(Sẽ tự trả lời sau 7 giờ) ...
Aeodyn

Câu trả lời:


16

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


3
Điều này. Điều này thật đúng với gì mà tôi đã tìm kiếm. Giải quyết vấn đề của tôi trong một lót. Đẹp!
aardvarkk

1
framePitchframeYaw floatcá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.
sirdank

1
@sirdank cameraOrientation, framePitchframeYawlà tất cả các bậc bốn (mỗi bậc bốn là 4 phao hoặc đôi).
Dan

8

Đâ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.


Tôi đã phải chờ 7 giờ để tự trả lời ...
Aeodyn

xin lỗi, bạn có thể giải thích điều này với một số ảnh chụp màn hình? "Đơn hàng đầu tiên" và "đơn hàng thứ hai" hơi khó hiểu - cảm ơn!
Atav32

Khi làm việc với Quancyions, trật tự không thành vấn đề, như mọi khi với xoay 3D. Trong ví dụ của tôi, "Direction * = newRotation" giống như "Direction = Direction * newRotation". Nhưng, với các góc quay trái và phải, chúng tôi muốn nó theo cách khác. Điều này làm cho nó không phụ thuộc vào độ nghiêng lên và xuống, gây ra cuộn.
Aeodyn

Ồ, mặc dù điểm quan trọng của nó là nó tránh được khóa gimbal và các phép quay hoàn toàn độc lập, nhưng tôi có thể đã đọc sai sách giáo khoa. Vì vậy, chỉ cần làm rõ, bạn đang nói rằng nếu bạn đảo ngược thứ tự của các biến đổi xoay, bạn có thể ngăn máy ảnh nghiêng? Hoặc đang tự cài đặt các phép biến đổi cuộn và cao độ thành 0 khi bạn xoay ngáp?
Atav32

5

Đố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ế.


0

Một mẹo đơn giản khác là đặt camera trong GameObject và điều khiển xoay Yaw đối tượng trò chơi, trong khi camera con được cấu hình với tọa độ Pitch:

playerCameraHolder.transform.Rotate(0, rotationYaw, 0);
playerCamera.transform.Rotate(rotationPitch, 0, 0);
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.