หมุนกล้องคนที่ 3 ไปยังเป้าหมาย


10

ฉันมีกล้องคนที่ 3 ที่ไม่ได้ดูที่ผู้เล่นโดยตรง แต่อยู่ตรงหน้าเขา

เมื่อผู้ใช้เข้าสู่โหมดถ่ายภาพฉันต้องการให้กล้องหมุนไปรอบ ๆ ผู้เล่นเพื่อเผชิญหน้ากับเป้าหมาย

ตัวอย่างของสิ่งที่ฉันพูดถึง

ในภาพด้านบน "O" คือผู้เล่น (ต้นทาง) "L" คือการค้นหา "C" คือตำแหน่งกล้องและ "T" เป็นเป้าหมาย ฉันต้องการหมุนเส้น lookat C-> L เพื่อให้มันผ่าน T (C '-> L' -> T ') รอบ Origin ("O")

โดยทั่วไปฉันต้องหามุมอัลฟาที่ใส่สีแดงไว้ในภาพ

ฉันเก็บตำแหน่งกล้องของฉันในโครงสร้างเช่น:

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

ดังนั้นหากฉันสามารถหามุมที่ฉันกำลังมองหาฉันสามารถทำสิ่งที่ชอบ:

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

เพื่อให้ผู้เล่นมองเป้าหมายเสมอ

หากการค้นหาผ่านต้นกำเนิดฉันก็สามารถทำได้

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;

อย่างไรก็ตามในแผนภาพด้านบนสิ่งนี้ไม่ได้ผลเนื่องจากการหมุนถูกชดเชยจากแหล่งกำเนิด

คำตอบ:


1

ตอบตัวเองถ้ามันช่วยคนอื่นได้วันหนึ่ง:

SFDKT มีความคิดที่ถูกต้องเกี่ยวกับการฉายจุดเป้าหมายในทิศทางที่กล้องมองในปัจจุบัน

อย่างไรก็ตามปัญหาที่ใหญ่ที่สุดของฉันคือการหาจุดนี้ P. ปรากฎว่าตรีโกณมิติเล็กน้อยสามารถแก้ไขได้

พิจารณารูปสามเหลี่ยมที่เกิดขึ้นจากสามจุด CPO:

  1. เมื่อฉันรู้ความยาว LO, OC และ CL ฉันสามารถคำนวณมุมที่ C

  2. ตอนนี้ฉันรู้มุม C และความยาวของ OC และ PO แล้ว การใช้กฎของไซน์คุณสามารถหามุมที่ O. (ฉันพบว่าเว็บไซต์นี้มีประโยชน์มากสำหรับการหามุมที่หายไป)

  3. จากนั้นฉันสามารถหามุมที่หายไปล่าสุด P และใช้กฎของ Sines อีกครั้งเพื่อหาความยาว CP

  4. ใช้ทิศทางการมองที่ posC + normalized (CL) * lengthCP ให้ตำแหน่งของ P กับฉัน

  5. เมื่อฉันมี PI สามารถคำนวณการหมุนที่สั้นที่สุดระหว่าง OP และ OT ซึ่งให้ค่า quaternion ที่ฉันต้องหมุนกล้องของฉัน

ฉันมีปัญหาเล็กน้อยเกี่ยวกับการม้วนที่ไม่พึงประสงค์ในแบบ 3 มิติ แต่ฉันเพิ่งแก้ปัญหาด้วย Z = 0 จากนั้นคำนวณการหมุนระยะห่างที่หายไปเพื่อให้เวกเตอร์ตั้งตรงของกล้อง


0

รูปภาพนี้เพิ่มความสมมาตรที่จำเป็นสำหรับการแก้ปัญหาให้ง่ายขึ้น

ป้อนคำอธิบายรูปภาพที่นี่

เพียงแค่โครงการLพร้อมเวกเตอร์เพื่อให้CL|P-O|=|T-O|

ตอนนี้มันเห็นได้ชัดว่ามีรูปสามเหลี่ยมสองอันที่เหมือนกัน ( CPOและC'TO) หมุนตามมุมที่คุณต้องการ IEang(OT)-ang(OP)

C'และL'มีทั้งเหมือนCและLหลังหมุนประมาณOด้วยจำนวนเดียวกัน

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.