สิ่งที่คุณขอเรียกว่าการหมุน Arcball Quaternions เป็นคำตอบที่ง่ายถ้าคุณเข้าใจว่ามันทำงานอย่างไร คุณสามารถบรรลุเป้าหมายเดียวกันได้โดยไม่ต้องมีคำถาม
requisites ก่อน
คุณรู้วิธีหมุนวัตถุโดยทั่วไปหรือไม่? สมมติว่าคุณมีวัตถุอยู่ที่จุดกำเนิด คุณรู้วิธีหมุนอย่างไร (คำแนะนำ: คูณด้วยเมทริกซ์การหมุนบางส่วน)? ถ้าใช่ฉันกำลังสมมติว่าคุณรู้ว่าจะเกิดอะไรขึ้นถ้าคุณแปลวัตถุก่อนแล้วหมุนมัน
คุณต้องรู้วิธีการคำนวณเมทริกซ์การหมุนจากแกนมุม (ง่ายเหมือนพายดูที่สมการมากมายในระบบออนไลน์ซึ่งส่วนมากจะให้รหัสด้วย)
วิธีการแก้
- รับกล้องขึ้นและขวาเวกเตอร์ โปรดทราบว่าพวกเขาควรจะเป็นมาตรฐาน
- รับเวกเตอร์จากจุดโฟกัสไปยังกล้อง (camPosition - Focus) นี่คือเวกเตอร์ที่คุณกำลังจะหมุน มาเรียกcamFocusVectorนี้กัน
- ตัดสินใจว่าคุณต้องการหมุนในรูปหันเห / ระยะห่างที่เกี่ยวข้องกับกล้องมากน้อยเพียงใด
- สร้างเมทริกซ์การหมุนสองตัว เมทริกซ์การหมุนครั้งที่ 1 จะใช้ค่าสูงสุดของกล้องเป็นแกนและมุมหันเหที่คุณตัดสินใจ เมทริกซ์การหมุนครั้งที่ 2 จะใช้ด้านขวาของกล้องเป็นแกนและมุมพิทช์ที่คุณตัดสินใจ
- ตอนนี้หมุนcamFocusVectorด้วยเมทริกซ์การหมุนใหม่ นี่คือตำแหน่งใหม่ของกล้องเมื่อเทียบกับจุดกำเนิด แน่นอนว่าเราต้องการให้สัมพันธ์กับจุดโฟกัส ...
- เพิ่มตำแหน่งจุดโฟกัสไปcamFocusVector นี่คือตำแหน่งใหม่ของกล้องของคุณ แปลกล้องของคุณตาม
- สุดท้ายขอให้กล้องโฟกัสที่จุดโฟกัสโดยเรียกใช้ฟังก์ชัน lookAt () ของคุณ
คำเตือน
คุณจะต้องระวังในบางกรณีหรือภาวะเอกฐานที่กล้องของคุณจะหยุดทำงาน ยกตัวอย่างเช่น ฉันจะให้คุณหาวิธีจัดการกับสิ่งเหล่านั้น
EDIT1: วิธีการคำนวณเวกเตอร์ออร์โธกราฟปกติของกล้อง
คุณรู้ทิศทางของกล้องแล้ว ((cameraPos - focusPoint). normalize ()) ทีนี้สมมติว่ากล้องของคุณมีค่า + Y (หรือแกนที่มีอยู่ในโลกปัจจุบันของคุณคือ ... ที่ขึ้นอยู่กับคุณ) ตอนนี้เพียงแค่ข้ามทิศทางที่มีขึ้นที่จะได้รับสิทธิ ทำ? Nope! เวกเตอร์อัพของคุณนั้นไม่มีมุมฉากอีกต่อไป ในการแก้ไขปัญหาที่ข้ามที่เหมาะสมกับทิศทางและคุณได้รับใหม่ของคุณขึ้นมา
โปรดทราบว่าGram-Schmidtเป็นสิ่งที่ควรนำมาใช้เพื่อเวกเตอร์แบบออร์โทไนซ์
อีกครั้งจดบันทึก caveats เช่นนี้จะล้มเหลวในการทำงานในบางกรณี ( ทิศทางขนานกับขึ้นตัวอย่าง)