จะป้องกันไม่ให้กล้อง FPS ที่ใช้ Quaternion ของฉันเอียงและทำให้ยุ่งเหยิงได้อย่างไร


17

ฉันกำลังใช้กล้องที่เหมือน FPS และใช้งาน quaternions แต่เมื่อใดก็ตามที่ฉันลองมองหาและจากนั้นไปด้านข้างมันจะเอียงและบางครั้งมันอาจกลับหัวกลับหาง ฉันจะแก้ไขสิ่งนี้ได้อย่างไร


3
(จะตอบด้วยตนเองใน 7 ชั่วโมง) ...
Aeodyn

คำตอบ:


16

คุณสามารถแยกส่วนควอเทอเนียนของคุณออกเป็นมุมเอียง / พิน / ม้วนได้ แต่มันมักจะเกินแรง

แทนที่จะเขียน quaternions ของคุณเช่นนี้:

cameraOrientation = cameraOrientation * framePitch * frameYaw;

ลองสิ่งนี้:

cameraOrientation = framePitch * cameraOrientation * frameYaw;

จากนั้นจะไม่สร้างความเอียง / ม้วนและเทียบเท่ากับการจัดเก็บหันเหและระยะห่างแยกจากกัน


3
นี้. นี่คือสิ่งที่ฉันกำลังมองหา แก้ไขปัญหาของฉันในหนึ่งซับ ดี!
aardvarkk

1
เป็นframePitchและframeYaw floatประเภท? นอกจากนี้ฉันจะขอบคุณสำหรับการชี้แจงในประโยคแรกของคุณ
sirdank

1
@sirdank cameraOrientation, framePitchและframeYawเป็นหมู่ทั้งหมด (แต่ละ quaternion คือ 4 ลอยหรือคู่)
ด่าน

8

นี่เป็นปัญหาที่ฉันมีอยู่พักหนึ่งแล้วและฉันไม่สามารถหาคำตอบได้ดังนั้นฉันคิดว่าฉันจะโพสต์ไว้ที่นี่

จริงๆแล้วมันค่อนข้างง่าย การหมุนตัวเองเป็นอย่างไรเช่นนี้:

currentDirection * newRotation;

แต่การทำเช่นนี้ไม่ได้ผลเช่นกัน

newRotation * currentDirection;

สิ่งที่คุณต้องทำคือทำในลำดับแรกสำหรับการหมุนขึ้นและลงและในลำดับที่สองสำหรับการหมุนด้านข้าง

สำหรับฉันมันเป็นเช่นนี้:

        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;

ด้วยเหตุผลว่าทำไมวิธีแรกมีการหมุนที่สัมพันธ์กับทิศทางด้านข้างปัจจุบันซึ่งคุณต้องการขึ้นและลง แต่คุณไม่ต้องการสิ่งนั้นสำหรับการหมุนด้านข้างซึ่งเป็นสาเหตุที่ต้องการลำดับที่สอง


ฉันต้องรอ 7 ชั่วโมงเพื่อตอบคำถามของตัวเอง ...
Aeodyn

ขออภัยคุณสามารถอธิบายสิ่งนี้กับภาพหน้าจอบางภาพได้หรือไม่? "ลำดับแรก" และ "ลำดับที่สอง" ค่อนข้างสับสน - ขอบคุณ!
Atav32

เมื่อทำงานกับ Quaternions การสั่งซื้อก็มีความสำคัญเช่นเดียวกับการหมุน 3D ในตัวอย่างของฉัน "Direction * = newRotation" เหมือนกับ "Direction = Direction * newRotation" แต่ด้วยการหมุนซ้ายและขวาเราต้องการมันอีกทาง สิ่งนี้ทำให้ไม่ขึ้นอยู่กับการเอียงขึ้นและลงซึ่งทำให้ม้วน
Aeodyn

โอ้ฉันถึงแม้จะเป็นประเด็นที่น่าสงสัยก็คือว่ามันหลีกเลี่ยงการล็อกแบบ gimbal และการหมุนเป็นอิสระ แต่ฉันอาจอ่านตำราผิดไป ดังนั้นเพื่ออธิบายให้ชัดเจนคุณกำลังบอกว่าถ้าคุณย้อนกลับลำดับการแปลงการหมุนคุณสามารถป้องกันไม่ให้กล้องเอียงได้? หรือตั้งค่าการแปลงม้วนและพิทช์ด้วยตนเองเป็น 0 เมื่อคุณหมุนหันเห
Atav32

5

สำหรับกล้อง FPS คุณมักไม่ต้องการม้วนและถูก จำกัด ที่ระดับ +/- 90 องศาดังนั้นฉันจะติดตามสถานะปัจจุบันโดยใช้มุมหันเหและมุมเอียง พลังเต็มที่ของ quaternions ไม่เป็นประโยชน์สำหรับเรื่องนี้

คุณยังสามารถแปลงมุม yaw / pitch เป็นและจาก quaternions ในกรณีที่คุณต้องการเปลี่ยนระหว่างกล้อง FPS และกล้องเคลื่อนไหวโดยใช้การแก้ไขเฟรมเฟรม quaternion หรืออะไรทำนองนั้น


0

เคล็ดลับง่ายๆอีกอย่างคือการวางกล้องใน GameObject และให้ Yaw หมุนควบคุมวัตถุของเกมในขณะที่กล้องลูกได้รับการกำหนดค่าด้วยพิกัด Pitch:

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