ควอเทอร์เนียนและการหมุนรอบแกนโลก


11

ข้อจำกัดความรับผิดชอบ: ฉันเป็นโปรแกรมเมอร์เกมมืออาชีพและใช้งาน quaternions เกือบทุกวัน แต่พวกเขาก็ใกล้เคียงกับเวทย์มนตร์ดำสำหรับฉัน ฉันค่อนข้างอยู่บ้านกับคณิตศาสตร์ แต่ตัวเลขในจินตนาการมักทำให้ฉันสับสน ฉันมักจะปฏิบัติต่อ quats ว่ามีประโยชน์และจบลงด้วยการทวีคูณมากกว่าหนึ่งครั้ง ฉันพยายามให้เหตุผลกับพวกเขาเช่นเดียวกับการฝึกอบรมด้วยความสำเร็จที่ จำกัด

ทั้งนี้ ....

สิ่งที่ทำให้ฉันงุนงงคือต่อไปนี้ เมื่อฉันต้องการหมุนวัตถุรอบ ๆ มันเป็นแกนท้องถิ่นฉันคูณการหมุนด้วย quaternion ที่แสดงถึงการหมุนที่ฉันต้องการใช้ ดังนั้นจึงเป็นการหมุนในพื้นที่ท้องถิ่น

ตอนนี้ถ้าฉันต้องการหมุนรอบแกนในอวกาศโลกเหตุผลของฉันก็คือ: หมุนพื้นที่โลกเป็น quaternion ทวีคูณการผกผันของการหมุนวัตถุของฉันด้วย quaternion นี้ สิ่งนี้จะทำให้โลกหมุนของฉันในอวกาศ ทวีคูณการหมุนของฉันด้วยควอเทอร์ชันใหม่นี้ เช่น: newRot = oldRot * (ผกผัน oldRot * worldRot)

อย่างไรก็ตามสิ่งที่ฉันต้องทำคือ newRot = oldRot * (ผกผัน oldRot * worldRot) * oldRot

ทำไมฉันหลังจากคูณด้วย quat invat ยังคงต้องคูณกับ quat ของตัวเองก่อนที่จะใช้มัน ฉันรู้ว่าต้องมีเหตุผลที่สมบูรณ์ แต่ฉันไม่สามารถให้เหตุผลกับมันได้และมันก็น่าหงุดหงิดเหมือนฉัน ฉันลองคำถามต่าง ๆ และอะไรก็ตาม แต่ส่วนใหญ่ไปที่ลึกในคณิตศาสตร์ทำให้ฉันชัดเจนน้อยลง

ทุกคนที่สามารถอธิบายสิ่งนี้กับฉันเหมือนฉันอายุ 5 ขวบ?


มันไม่ได้เป็นบิตเช่นแปลเมทริกซ์และ roatations (ie. คุณจำเป็นต้องย้ายวัตถุไปยังศูนย์การหมุนและจากนั้นย้ายกลับมาเมื่อคุณต้องการหมุนรายการที่อยู่รอบ ๆ ตัวเอง: Minv_transl * * * * * * * * Mrot Mtransl)
Valmond

I try to reason about them like I would with matrices- จากนั้นคุณก็เดินไปถูกทางแล้ว หากคุณเข้าใจวิธีหมุนรอบแกนของวัตถุและแกนโลกโดยใช้เมทริกซ์คุณสามารถทำเช่นเดียวกันโดยใช้ควอเทอร์เนียน ลำดับการคูณนั้นเหมือนกันทั้งเมทริกซ์และควอเทอร์เนียน
Maik Semder

คำตอบ:


11

Quaternions มีความเกี่ยวข้อง:

คุณพูดถึงว่าทางออกของคุณคือ:

newRot = oldRot * (inverse oldRot * worldRot) * oldRot

ซึ่งเหมือนกับ:

newRot = oldRot * inverse oldRot * worldRot * oldRot

ซึ่งเหมือนกับ:

newRot = identity * worldRot * oldRot
newRot = worldRot * oldRot

ซึ่งนำคุณกลับมาสู่สิ่งที่เกิดขึ้นจริง:

localTransformed = oldRot * rot
worldTransformed = rot * oldRot

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


1
+1 สำหรับส่วนแรกส่วนที่สองเป็นการเข้าใจผิดเล็กน้อย หากคุณใช้ 'เน่า' ในตัวอย่างรหัสสุดท้ายแทนที่จะเป็น 'localRot' และ 'worldRot' ตัวอย่างจะชัดเจนขึ้น มิฉะนั้นจะหมายความว่าเน่าของตัวเอง แต่อย่างใดมีความแตกต่างกัน แต่ความแตกต่างอยู่ในลำดับการคูณเท่านั้นตามที่คุณแสดงแทนที่จะเป็นควอเทอร์เนียนต่าง ๆ ('localRot' และ 'worldRot') 'localTransformed' และ 'worldTransformed' จะดีกว่าเช่น: 'rotatedAroundLocalAxis' และ 'rotatedAroundWorldAxis' นั่นจะอธิบายสมการและทำให้ย่อหน้าสุดท้ายล้าสมัยซึ่งมีข้อบกพร่องบางอย่าง
Maik Semder

ข้อบกพร่องในย่อหน้าสุดท้าย: ความแตกต่างระหว่างเมทริกซ์และการแปลง (ทั้งคู่จะเหมือนกันที่นี่และแทนกันได้ดังนั้นมันจึงดีกว่าที่จะใช้เมทริกซ์เพื่อป้องกันความสับสน) และคำว่า "การแปลงอวกาศในท้องถิ่น" และ "การเปลี่ยนโลก" ถูกต้องเพื่อบอกว่าสมการแรกให้คุณ 'เมทริกซ์ท้องถิ่นสู่โลก' หลังจากที่หมุนรอบแกนท้องถิ่นของวัตถุแล้วอันที่สองจะให้ 'เมทริกซ์ท้องถิ่นสู่โลก' หลังจากที่หมุนรอบแกนโลก ในทั้งสองกรณีสิ่งที่คุณจะได้รับคือ 'เมทริกซ์ท้องถิ่นสู่โลก' อย่างไรก็ตามส่วนแรกมี +1 ของฉันต่อไปสำหรับการวิเคราะห์
Maik Semder

+1 @Maik บางทีคุณอาจจะเขียนคำตอบแยกกันเพื่อสร้างความเฉยเมยระหว่างการหมุนและปัญหาของการคูณเพื่อให้ชัดเจนยิ่งขึ้น? ขอบคุณสำหรับความคิดเห็นอย่างใดอย่างหนึ่ง!
Max Dohme

อาตอนนี้มันสมเหตุสมผลแล้ว ฉันไม่รู้ (อุ๊ยนั่นจะอยู่ในคำถามที่พบบ่อย) ว่าการคูณ quaternion นั้นเชื่อมโยงกันดังนั้นการหมุนและการผกผันยกเลิกแต่ละอันออกมาทำให้ฉันมีความเข้าใจที่ฉันต้องการหนึ่งมีการหมุนรอบตัวทางขวาและอีกอันบน ทางซ้ายซึ่งโดยทั่วไปบอกว่า 'ใช้การหมุนในพื้นที่หลัก' หรือ 'ใช้การหมุนในพื้นที่ท้องถิ่น' .... ไม่แตกต่างจากเมทริกซ์ สวยประถมเมื่อคุณเห็นมัน! ขอบคุณ!
Kaj
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.