ฉันกำลังอ่านหนังสือ "การเรียนรู้การเขียนโปรแกรมกราฟิก 3D สมัยใหม่" โดย Jason L. McKesson
ณ ตอนนี้ฉันถึงปัญหาล็อก gimbal และวิธีแก้ปัญหาโดยใช้ quaternions
แต่ที่นี่ที่หน้า Quaternions
ส่วนหนึ่งของปัญหาคือเรากำลังพยายามเก็บการปฐมนิเทศเป็นชุดของการหมุนแกนสะสม 3 ชุด การวางแนวคือการหมุนไม่ใช่การหมุน และทิศทางไม่แน่นอนชุดของการหมุน ดังนั้นเราต้องปฏิบัติต่อการวางแนวของเรือในฐานะการปฐมนิเทศตามปริมาณที่กำหนด
ฉันเดาว่านี่เป็นจุดแรกที่ฉันเริ่มสับสนเพราะฉันไม่เห็นความแตกต่างอย่างมากระหว่างการหมุนและการหมุน ฉันยังไม่เข้าใจว่าทำไมการปฐมนิเทศจึงไม่สามารถแสดงเป็นชุดการหมุนได้ ...
นอกจากนี้:
ความคิดแรกเกี่ยวกับจุดประสงค์นี้คือเพื่อให้การปฐมนิเทศเป็นเมทริกซ์ เมื่อเวลานั้นมาถึงการปรับเปลี่ยนการปฐมนิเทศเราเพียงแค่นำการแปลงไปใช้กับเมทริกซ์นี้โดยจัดเก็บผลลัพธ์เป็นทิศทางปัจจุบันใหม่
ซึ่งหมายความว่าทุก ๆ yaw pitch และ roll ที่ใช้กับการวางแนวปัจจุบันจะสัมพันธ์กับการวางแนวปัจจุบันนั้น ซึ่งเป็นสิ่งที่เราต้องการอย่างแม่นยำ หากผู้ใช้ใช้การหันเหที่เป็นบวกคุณต้องการให้หันเหที่จะหมุนพวกเขาเมื่อเทียบกับที่พวกเขากำลังชี้ปัจจุบันไม่ได้เกี่ยวข้องกับระบบพิกัดคงที่บางส่วน
แนวคิดฉันเข้าใจ แต่ฉันไม่เข้าใจว่าการสะสมการแปลงเมทริกซ์เป็นวิธีแก้ปัญหานี้ได้อย่างไรรหัสที่ให้ในหน้าก่อนหน้านั้นไม่ใช่แค่นั้น
นี่คือรหัส:
void display()
{
glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
glClearDepth(1.0f);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glutil::MatrixStack currMatrix;
currMatrix.Translate(glm::vec3(0.0f, 0.0f, -200.0f));
currMatrix.RotateX(g_angles.fAngleX);
DrawGimbal(currMatrix, GIMBAL_X_AXIS, glm::vec4(0.4f, 0.4f, 1.0f, 1.0f));
currMatrix.RotateY(g_angles.fAngleY);
DrawGimbal(currMatrix, GIMBAL_Y_AXIS, glm::vec4(0.0f, 1.0f, 0.0f, 1.0f));
currMatrix.RotateZ(g_angles.fAngleZ);
DrawGimbal(currMatrix, GIMBAL_Z_AXIS, glm::vec4(1.0f, 0.3f, 0.3f, 1.0f));
glUseProgram(theProgram);
currMatrix.Scale(3.0, 3.0, 3.0);
currMatrix.RotateX(-90);
//Set the base color for this object.
glUniform4f(baseColorUnif, 1.0, 1.0, 1.0, 1.0);
glUniformMatrix4fv(modelToCameraMatrixUnif, 1, GL_FALSE, glm::value_ptr(currMatrix.Top()));
g_pObject->Render("tint");
glUseProgram(0);
glutSwapBuffers();
}
เพื่อความเข้าใจของฉันไม่ใช่สิ่งที่เขากำลังทำ (แก้ไขเมทริกซ์บนสแต็ก) ซึ่งถือเป็นเมทริกซ์สะสมเนื่องจากผู้เขียนรวมการแปลงการหมุนแต่ละตัวทั้งหมดเป็นเมทริกซ์เดียวซึ่งถูกเก็บไว้ที่ด้านบนสุดของสแต็ก
ความเข้าใจเกี่ยวกับเมทริกซ์ของฉันคือพวกมันคุ้นเคยกับจุดที่สัมพันธ์กับจุดกำเนิด (สมมติว่า ... แบบจำลอง) และทำให้สัมพันธ์กับจุดกำเนิดอื่น (กล้อง) ฉันค่อนข้างมั่นใจว่านี่เป็นคำจำกัดความที่ปลอดภัย แต่ฉันรู้สึกว่ามีบางสิ่งที่ขาดหายไปซึ่งขัดขวางไม่ให้ฉันเข้าใจปัญหาล็อก gimbal นี้
สิ่งหนึ่งที่ไม่สมเหตุสมผลสำหรับฉันคือ: หากเมทริกซ์กำหนดความแตกต่างที่สัมพันธ์กันระหว่าง "ช่องว่าง" สองอันทำไมการหมุนรอบแกน Y สำหรับมาสมมุติว่าม้วนไม่ทำให้ประเด็นอยู่ใน "พื้นที่ม้วน" "ซึ่งสามารถเปลี่ยนได้อีกครั้งในความสัมพันธ์กับม้วนนี้ ... ในคำอื่น ๆ ที่ไม่ควรมีการเปลี่ยนแปลงเพิ่มเติมไปยังจุดนี้จะเกี่ยวข้องกับ" พื้นที่ม้วน "ใหม่นี้และดังนั้นจึงไม่มีการหมุนจะสัมพันธ์กับก่อนหน้านี้" โมเดลพื้นที่ "ซึ่งเป็นสาเหตุของการล็อก gimbal
นั่นเป็นเหตุผลที่ล็อค gimbal เกิดขึ้นใช่มั้ย เป็นเพราะเราหมุนวัตถุรอบแกน X, Y และ Z แทนที่จะหมุนวัตถุรอบ ๆ มันเองแกนสัมพัทธ์ หรือฉันผิด
เนื่องจากรหัสนี้ฉันเชื่อมโยงในไม่ได้เป็นการสะสมของการแปลงเมทริกซ์คุณสามารถโปรดยกตัวอย่างของการแก้ปัญหาโดยใช้วิธีนี้
ดังนั้นโดยสรุป:
- ความแตกต่างระหว่างการหมุนและการวางแนวคืออะไร?
- ทำไมรหัสที่ถูกเชื่อมโยงไม่ใช่ตัวอย่างของการสะสมการแปลงเมทริกซ์?
- อะไรคือจุดประสงค์ที่แท้จริงและเฉพาะเจาะจงของเมทริกซ์ถ้าฉันคิดผิด?
- วิธีแก้ปัญหาของปัญหาล็อก gimbal สามารถทำได้โดยใช้การสะสมของการแปลงเมทริกซ์?
- นอกจากนี้ยังเป็นโบนัส: ทำไมการเปลี่ยนแปลงหลังจากการหมุนยังสัมพันธ์กับ "พื้นที่จำลอง"
- โบนัสอื่น: ฉันผิดในการสันนิษฐานว่าหลังจากการเปลี่ยนแปลงการเปลี่ยนแปลงเพิ่มเติมจะเกิดขึ้นเมื่อเทียบกับปัจจุบัน?
นอกจากนี้หากไม่ได้บอกเป็นนัยฉันกำลังใช้ OpenGL, GLSL, C ++ และ GLM ดังนั้นตัวอย่างและคำอธิบายในแง่ของสิ่งเหล่านี้จะได้รับการชื่นชมอย่างมากหากไม่จำเป็น
ยิ่งรายละเอียดมากเท่าไหร่ก็ยิ่งดีเท่านั้น!
ขอบคุณล่วงหน้า.