2015-09-23 221 views
1

我有一個通用的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); 

當我應用旋轉並因此圍繞原點旋轉場景時,如何存儲絕對平移以補償它?或者換句話說,當我有累積轉化時,我該如何在原點周圍旋轉世界?

回答

1

要翻譯點(x,y),首先翻譯(x,y),然後旋轉,然後翻譯-(x,y)。現在

,如果你的世界已經被M(一些矩陣)轉化,然後前世界的起源是改造位於M^-1 (0,0)

假設從原來的你的世界轉變爲M,並且要執行一些旋轉R,但轉動應圍繞出身,但旋轉矩陣R中來表示圍繞點(0,0)旋轉(正如風格)。

然後R' = M R M^-1將生成包括由R圍繞原始(0,0)旋轉的一個新的矩陣R'。然後M' = R' M是表示從無到始的矩陣,然後做M,然後在原點周圍做R

如果您正在對某個模型進行累積轉換,只需跟蹤所述轉換的乘積,並修改場景的一側。

或者,存儲原始場景,而不是對其執行累積轉換,總是應用M來獲取當前場景。