Xoay camera người thứ 3 về phía mục tiêu


10

Tôi có một máy ảnh người thứ 3 không nhìn thẳng vào người chơi mà ở đâu đó trước mặt anh ta.

Khi người dùng vào chế độ chụp, tôi muốn camera quay xung quanh người chơi để đối mặt với mục tiêu.

ví dụ về những gì tôi đang nói về

Trong hình trên. "O" là trình phát (Xuất xứ), "L" là giao diện, "C" là vị trí camera và "T" là mục tiêu. Tôi muốn xoay dòng lookat C-> L để nó đi qua T (C '-> L' -> T ') xung quanh Origin ("O").

Về cơ bản tôi cần tìm góc alpha mà tôi đặt màu đỏ trong ảnh.

Tôi lưu trữ vị trí máy ảnh của mình trong một cấu trúc như vậy:

struct CameraTarget {
     Quaternion absoluteRotation;
     Vec3 absolutePosition;
     Vec3 cameraOffset;
     Vec3 lookatOffset;
     float FOV;
}

Vì vậy, nếu tôi có thể tìm thấy góc tôi đang tìm, tôi có thể làm một cái gì đó như:

cam->absoluteRotation = cam->absoluteRotation * alpha;

Để có được người chơi luôn luôn nhìn vào mục tiêu.

Nếu cái nhìn đi qua Nguồn gốc, tôi có thể làm

Vec3 origDir = cam->lookAtOffset - cam->absolutePosition;
origDir.normalize();
Vec3 newDir = cam->target - cam->absolutePosition;
newDir.normalize();
Quaternion q(origDir, newDir); // from->to
cam->absoluteRotation = cam->absoluteRotation * q;

Tuy nhiên, trong sơ đồ trên, điều này không thực sự hiệu quả do vòng quay được bù từ Nguồn gốc.

Câu trả lời:


1

Trả lời bản thân mình nếu nó giúp người khác một ngày nào đó:

SFDKT có ý tưởng đúng về việc chiếu điểm mục tiêu vào hướng nhìn của camera hiện tại.

Tuy nhiên, vấn đề lớn nhất của tôi là tìm ra điểm này P. Hóa ra một chút lượng giác đã xoay sở để giải quyết nó.

Xem xét tam giác hình thành bởi ba điểm CPO:

  1. Vì tôi biết độ dài LO, OC và CL nên tôi có thể tính góc tại C.

  2. Bây giờ tôi biết góc C và độ dài của OC và PO. Sử dụng định luật sin bạn có thể tìm góc ở O. (Tôi thấy trang web này rất hữu ích cho việc tìm các góc còn thiếu)

  3. Sau đó, tôi có thể tìm góc P bị thiếu cuối cùng và sử dụng lại định luật Sines để tìm độ dài CP.

  4. Hãy xem hướng nhìn posC + chuẩn hóa (CL) * lengthCP cho tôi vị trí của P.

  5. Khi tôi có PI, có thể tính toán vòng quay ngắn nhất giữa OP và OT, điều này mang lại cho tôi phần tư tôi cần để xoay máy ảnh.

Tôi đã gặp một chút rắc rối với cuộn 3D không mong muốn nhưng tôi chỉ giải quyết vấn đề với Z = 0 sau đó tính toán góc xoay bị thiếu để giữ cho vectơ của máy ảnh thẳng.


0

hình ảnh này thêm đối xứng cần thiết để giải quyết câu hỏi dễ dàng hơn.

nhập mô tả hình ảnh ở đây

Chỉ cần chiếu Ldọc theo vector CLđể vậy |P-O|=|T-O|.

Bây giờ rõ ràng chỉ là hai hình tam giác giống hệt nhau ( CPOC'TO) được xoay theo góc mong muốn của bạn. I Eang(OT)-ang(OP)

C'L'đều giống nhau CLsau khi quay, khoảng O, bằng cùng một lượng.

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.