我有一個通用的OpenGL 3D世界,以(0,0,0)爲中心開始。我實現了一個標準的軌跡球,基於this code。這實現了對當前模型視圖矩陣的小增量/轉換的旋轉,OpenGL鏈接翻譯/旋轉
// We need to apply the rotation as the last transformation.
// 1. Get the current matrix and save it.
// 2. Set the matrix to the identity matrix (clear it).
// 3. Apply the trackball rotation.
// 4. Pre-multiply it by the saved matrix.
glGetFloatv(GL_MODELVIEW_MATRIX, (GLfloat *)objectXform);
glLoadIdentity();
glRotatef(rot_angle, rotAxis.x, rotAxis.y, rotAxis.z);
glMultMatrixf((GLfloat *)objectXform);
這部分完美地工作。但後來我wantes實施譯本,我這樣做也是爲小增量的模型視圖矩陣,
glTranslatef(-dx, -dy, 0.f);
這也按預期工作(不管世界如何旋轉,平移以及用鼠標去,即模型落在鼠標後面
當我在翻譯後嘗試旋轉時出現問題:我希望旋轉是在世界中心附近,但這不會在用戶翻譯後發生。絕對的翻譯和補償,但顯然這是行不通的。我做了如下回憶:
// Translation part, store absolute translation
m_mouseInfo.m_fTotalTranslationX -= dx;
m_mouseInfo.m_fTotalTranslationY -= dy;
glTranslatef(-dx, -dy, 0.f);
...
// Rotation, try to apply the rotation around (0,0,0)
glGetFloatv(GL_MODELVIEW_MATRIX, (GLfloat *)objectXform);
glLoadIdentity();
// Try to compensate for the translation and do the rotation aroun (0,0,0) but won't work
glTranslatef(m_mouseInfo.m_fTotalTranslationX, m_mouseInfo.m_fTotalTranslationY, 0.f);
glRotatef(rot_angle, rotAxis.x, rotAxis.y, rotAxis.z);
glTranslatef(-m_mouseInfo.m_fTotalTranslationX, -m_mouseInfo.m_fTotalTranslationY, 0.f);
glMultMatrixf((GLfloat *)objectXform);
當我應用旋轉並因此圍繞原點旋轉場景時,如何存儲絕對平移以補償它?或者換句話說,當我有累積轉化時,我該如何在原點周圍旋轉世界?