ที่จริงแล้วมันกลับกลายเป็นว่าคุณไม่สามารถมี 'ทั้งสองวิธี': หากความตั้งใจของคุณคือการไม่มีความรู้สึก 'การปฐมนิเทศสัมบูรณ์' บนทรงกลม (นั่นคือถ้าผู้เล่นไม่ได้หันหน้าเข้าหาเสาเสมอ ) จากนั้นคุณจะต้องมีแนวคิดเกี่ยวกับการวางแนวของผู้เล่น นี่เป็นเพราะตรงกันข้ามกับสิ่งที่สัญชาตญาณอาจแนะนำการเคลื่อนที่บนทรงกลมนั้นไม่เหมือนกับการเคลื่อนที่บนเครื่องบิน ความโค้งที่แท้จริงของทรงกลมหมายความว่าผู้เล่นสามารถดำเนินการที่จะหมุนตัวเอง!
สำหรับตัวอย่างที่ดีที่สุดของสิ่งที่ฉันกำลังพูดถึงให้จินตนาการว่าผู้เล่นเริ่มต้นที่จุดหนึ่งบนเส้นศูนย์สูตร (เพื่อความสะดวกสบายเราจะจินตนาการว่าหน้าปัดนาฬิกาเทียบเคียงกับเส้นศูนย์สูตรจากด้านบนและทำให้ผู้เล่นอยู่ที่ 6 โมง ) หันหน้าขึ้น - นั่นคือไปทางขั้วโลกเหนือ สมมติว่าผู้เล่นเดินไปตลอดทางจนถึงขั้วโลกเหนือ จากนั้นพวกเขาจะหันเข้าหาจุด 12 นาฬิกาโดยตรง ตอนนี้ให้ผู้เล่นย้ายไปทางขวาของพวกเขาจากขั้วโลกเหนือกลับไปที่เส้นศูนย์สูตร พวกเขาจะไขลานที่จุด 3 นาฬิกา - แต่เพราะใบหน้าของพวกเขาไม่เปลี่ยนเมื่อพวกเขาขยับไปทางขวา(ความคิดคือใบหน้าของพวกเขาไม่เปลี่ยนแปลงไม่ว่าพวกเขาจะเคลื่อนไหวอย่างไร) พวกเขาจะยังคงเผชิญหน้ากับจุด 12 นาฬิกาตอนนี้พวกเขากำลังเผชิญหน้ากับเส้นศูนย์สูตร! ตอนนี้ให้พวกเขาย้าย 'ถอยหลัง' กลับไปที่จุดเริ่มต้น (6 โมง) จากนั้นพวกเขาจะยังคงหันหน้าไปตามเส้นศูนย์สูตรดังนั้นพวกเขาจะหันไปทางจุด 3 นาฬิกา - เพียงแค่เคลื่อนที่ไปตามทรงกลมโดยไม่เปลี่ยนการวางแนว 'ส่วนตัว' ของพวกเขาทำให้พวกเขาหมุนจากหันหน้าไปทางขั้วโลกเหนือเพื่อ หันหน้าเข้าหาเส้นศูนย์สูตร! เรียกได้ว่านี่คือการบรรเลงอย่างละเอียดของ 'นักล่าที่เคลื่อนไหวไปทางทิศใต้หนึ่งไมล์ทางตะวันตกและจากนั้นก็เป็นเรื่องตลกที่อยู่ทางเหนือหนึ่งไมล์ - แต่ที่นี่เราใช้ประโยชน์จากความโค้งของทรงกลมเพื่อเปลี่ยนทิศทาง โปรดทราบว่าเอฟเฟกต์เดิมยังคงเกิดขึ้นแม้ในสเกลที่เล็กลง
โชคดีที่ quaternions ทำ (ตามที่คุณจดบันทึกไว้) จัดการกับสถานการณ์นี้ เนื่องจาก quaternion แสดงถึงการหมุนตามอำเภอใจมันแสดงถึงจุดและทิศทางของจุดบนแกนทรงกลมได้อย่างมีประสิทธิภาพ: จินตนาการเริ่มต้นด้วย 'triaxis' ที่จุดกำเนิดและให้การหมุนตามอำเภอใจแล้วย้ายหนึ่งหน่วยในทิศทางใดก็ตามของแกนหมุน จุดแกน Z ความคิดเล็กน้อยจะทำให้คุณเชื่อว่าสิ่งนี้จะนำคุณไปสู่จุดบนหน่วยทรงกลมด้วย 'การวางแนว' บางอย่าง (เช่นการจัดเรียงของแกน X และ Y ของ Triaxis ของคุณ) และคุณสามารถไปยังทุกจุด + การวางแนวบน หน่วยทรงกลมด้วยวิธีนี้ (เพียงกำหนดแกน Z ของคุณให้ชี้ตามเส้นจากจุดกำเนิดไปยังจุดที่อยู่บนทรงกลมจากนั้นส่งทริกซ์กลับไปที่จุดกำเนิดตามเส้นนั้น) มีอะไรอีก, เนื่องจากการคูณ quaternions สอดคล้องกับองค์ประกอบของการหมุนแต่ละการดำเนินการที่คุณอธิบายสามารถแสดงโดยการคูณ 'การวางแนวปัจจุบัน' ของคุณโดยการเลือก quaternion ที่เหมาะสม: โดยเฉพาะตั้งแต่ quaternion (หน่วย) (qx, qy, qz, qw) แปลว่า 'หมุนเกี่ยวกับแกน (qx, qy, qz) โดย arccos (qw)' จากนั้น (ขึ้นอยู่กับตัวเลือกเฉพาะของระบบพิกัดและให้ c_a เป็น cos (alpha) และ s_a sin (alpha) สองตัว สาม quaternions M_x = (s_a, 0, 0, c_a), M_y = (0, s_a, 0, c_a), และ M_z = (0, 0, s_a, c_a) จะแสดง 'หมุน (เช่นย้าย) ในทิศทางที่ฉัน 'm กำลังเผชิญโดย alpha' และ 'หมุนในทิศทาง orthogonal ไปยังที่ฉันกำลังเผชิญโดย alpha' (สามในสี่ส่วนเหล่านั้นจะเป็นตัวแทน 'หมุนตัวละครของฉันเกี่ยวกับแกนของเขาเอง'Cur_q = M_x * Cur_q
ถ้าผู้เล่นกดขึ้นหรือCur_q = M_y * Cur_q
ถ้าผู้เล่นกดขวา (หรืออาจเป็นไปได้ว่าCur_q = M_yinv * Cur_q
ถ้าผู้เล่นกดซ้ายซึ่ง M_yinv คือ 'ผกผัน' ของ M_y quaternion แสดงการหมุนในอีกทางหนึ่ง) โปรดทราบว่าคุณจะต้องระมัดระวังซึ่ง 'ด้าน' ที่คุณใช้การหมุนบนไม่ว่าจะก่อนหรือหลังการคูณ เพื่อความตรงไปตรงมาอาจเป็นวิธีที่ง่ายที่สุดในการแก้ปัญหาด้วยการลองผิดลองถูกทั้งสองแบบ
การเปลี่ยนจาก quaternion ที่ปรับปรุงใหม่ของคุณไปยังจุดบนทรงกลม (และการปรับตัวของคุณ) นั้นค่อนข้างตรงไปตรงมาเช่นกัน: โดยการโต้ตอบของย่อหน้าสุดท้ายสิ่งที่คุณต้องทำคือใช้ quaternion ของคุณบนพื้นฐานเวกเตอร์ (1, 0,0), (0,1,0) และ (0,0,1) ของเฟรมของคุณผ่านการดำเนินการ 'หมุนเวกเตอร์โดย quaternion' v → qvq -1 (โดยการคูณที่นี่คือการคูณ quaternion และเราระบุเวกเตอร์ v = (x, y, z) ด้วย 'degenerate quaternion' (x, y, z, 0) ตัวอย่างเช่นตำแหน่งบนทรงกลมของหน่วยได้รับโดยการแปลง z เวกเตอร์: pos = (qx, qy, qz, qw) * (0, 0, 1, 0) * (-qx, -qy, -qz, qw) = (qx, qy, qz, qw) * (qy, -qx, qw, qz) = (2 (qy * qw + qz * qx), 2 (qz * qy-qw * qx), (qz ^ 2 + qw ^ 2) - (qx ^ 2 + qy ^ 2), 0) ดังนั้น(2(qy*qw+qz*qx), 2(qz*qy-qw*qx), (qz^2+qw^2)-(qx^2+qy^2))
จะเป็นพิกัดของผู้ใช้ที่ 'แปลง' ในหน่วยของทรงกลม (และเพื่อให้ได้พิกัดบนทรงกลมตามอำเภอใจแน่นอนคุณจะคูณพวกมันด้วยรัศมีของทรงกลม); การคำนวณที่คล้ายกันใช้งานได้กับแกนอื่น ๆ เพื่อกำหนดเช่นทิศทางหันหน้าของผู้ใช้