ฉันกำลังใช้กล้องที่เหมือน FPS และใช้งาน quaternions แต่เมื่อใดก็ตามที่ฉันลองมองหาและจากนั้นไปด้านข้างมันจะเอียงและบางครั้งมันอาจกลับหัวกลับหาง ฉันจะแก้ไขสิ่งนี้ได้อย่างไร
ฉันกำลังใช้กล้องที่เหมือน FPS และใช้งาน quaternions แต่เมื่อใดก็ตามที่ฉันลองมองหาและจากนั้นไปด้านข้างมันจะเอียงและบางครั้งมันอาจกลับหัวกลับหาง ฉันจะแก้ไขสิ่งนี้ได้อย่างไร
คำตอบ:
คุณสามารถแยกส่วนควอเทอเนียนของคุณออกเป็นมุมเอียง / พิน / ม้วนได้ แต่มันมักจะเกินแรง
แทนที่จะเขียน quaternions ของคุณเช่นนี้:
cameraOrientation = cameraOrientation * framePitch * frameYaw;
ลองสิ่งนี้:
cameraOrientation = framePitch * cameraOrientation * frameYaw;
จากนั้นจะไม่สร้างความเอียง / ม้วนและเทียบเท่ากับการจัดเก็บหันเหและระยะห่างแยกจากกัน
framePitch
และframeYaw
float
ประเภท? นอกจากนี้ฉันจะขอบคุณสำหรับการชี้แจงในประโยคแรกของคุณ
cameraOrientation
, framePitch
และframeYaw
เป็นหมู่ทั้งหมด (แต่ละ quaternion คือ 4 ลอยหรือคู่)
นี่เป็นปัญหาที่ฉันมีอยู่พักหนึ่งแล้วและฉันไม่สามารถหาคำตอบได้ดังนั้นฉันคิดว่าฉันจะโพสต์ไว้ที่นี่
จริงๆแล้วมันค่อนข้างง่าย การหมุนตัวเองเป็นอย่างไรเช่นนี้:
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;
ด้วยเหตุผลว่าทำไมวิธีแรกมีการหมุนที่สัมพันธ์กับทิศทางด้านข้างปัจจุบันซึ่งคุณต้องการขึ้นและลง แต่คุณไม่ต้องการสิ่งนั้นสำหรับการหมุนด้านข้างซึ่งเป็นสาเหตุที่ต้องการลำดับที่สอง
สำหรับกล้อง FPS คุณมักไม่ต้องการม้วนและถูก จำกัด ที่ระดับ +/- 90 องศาดังนั้นฉันจะติดตามสถานะปัจจุบันโดยใช้มุมหันเหและมุมเอียง พลังเต็มที่ของ quaternions ไม่เป็นประโยชน์สำหรับเรื่องนี้
คุณยังสามารถแปลงมุม yaw / pitch เป็นและจาก quaternions ในกรณีที่คุณต้องการเปลี่ยนระหว่างกล้อง FPS และกล้องเคลื่อนไหวโดยใช้การแก้ไขเฟรมเฟรม quaternion หรืออะไรทำนองนั้น
เคล็ดลับง่ายๆอีกอย่างคือการวางกล้องใน GameObject และให้ Yaw หมุนควบคุมวัตถุของเกมในขณะที่กล้องลูกได้รับการกำหนดค่าด้วยพิกัด Pitch:
playerCameraHolder.transform.Rotate(0, rotationYaw, 0);
playerCamera.transform.Rotate(rotationPitch, 0, 0);