2012-04-04 77 views
0

我目前有很多問題與我製作的攝像頭。我的矩陣轉我做的這個網站說,避免鎖萬向接頭出現該問題..Opengl攝像頭和乘法矩陣

一個你會注意到的第一個問題是,爲了您應用 這些旋轉關係。如前所述,旋轉矩陣是一個方向轉換。每個變換定義一個新的座標系, 並且下一個變換基於新空間中的一個對象。對於 示例,如果我們先應用滾動,現在我們已經更改了後續偏航的軸 。

而當我執行這個例如,如果我想圍繞當前x軸的X軸也改變我的軸旋轉方法,這顯然是錯誤的。我環顧四周,找不到任何解決方案。我已經嘗試了很多的differenet版本軸線角度旋轉矩陣的..

void FrustumCamera::xAxisRotation(float angle) 
{ 
    Vector3<float> x = m_orientation.getXAxis(); 
    Matrix4<float> matrix = m_orientation.axisAngleRotation(x,angle); 
    m_orientation = matrix*m_orientation; 
    normalise(m_orientation.getXAxis()); 
    normalise(m_orientation.getYAxis()); 
    normalise(m_orientation.getZAxis()); 
} 
void FrustumCamera::yAxisRotation(float angle) 
{ 
    Vector3<float> y = m_orientation.getYAxis(); 

    Matrix4<float> matrix = m_orientation.axisAngleRotation(y,angle); 
    m_orientation = matrix*m_orientation; 

    normalise(m_orientation.getXAxis()); 
    normalise(m_orientation.getYAxis()); 
    normalise(m_orientation.getZAxis()); 
} 

Matrix4<Type> Matrix4<Type>::operator*(Matrix4& matrix) 
{ 
    Matrix4<Type> temp(m_matrix); 
    for(int i=0;i<4;i++) 
    { 
     for(int j=0;j<4;j++) 
     { 
      Type total = 0; 
      for(int k=0;k<4;k++) 
      { 

       total += m_matrix[i][k]*matrix.getAt(k,j);; 

      } 
      temp.setAt(i,j,total); 
     } 
    } 
    return temp; 
} 
template <class Type> 
Matrix4<Type> Matrix4<Type>::axisAngleRotation(Vector3<Type> axis, const Type angle) 
{ 
    Type radians = angle * (double)degToRad; 
    Matrix4<Type> temp; 
    float c = cosf(radians); 
    float s = sinf(radians); 
    float t = 1.0f - c; 

    float x = axis.x; 
    float y = axis.y; 
    float z = axis.z; 

    temp.setAt(0,0, c+x*x*(t)); 
    temp.setAt(0,1, x*y*(t)-z*s); 
    temp.setAt(0,2, x*z*(t)+y*s); 
    temp.setAt(0,3, 0.0f); 

    temp.setAt(1,0, y*x*(t)+z*s); 
    temp.setAt(1,1, c+y*y*(t)); 
    temp.setAt(1,2, y*z*(t)-x*s); 
    temp.setAt(1,3, 0.0f); 

    temp.setAt(2,0, z*x*(t)-y*s); 
    temp.setAt(2,1, z*y*(1-c)+x*s); 
    temp.setAt(2,2, c+z*z*(t)); 
    temp.setAt(2,3, 0.0f); 

    temp.setAt(3,0, 0.0f); 
    temp.setAt(3,1, 0.0f); 
    temp.setAt(3,2, 0.0f); 
    temp.setAt(3,3, 1.0f); 

    return temp; 
} 
void OpenGLRenderer::startDraw(unsigned long mask) 
{ 
    //sortBuffer();          // sort draw queue 
    clearBuffers(mask);         // clear buffers 
    loadIdentity(); 
    glTranslatef(-1*m_frustumCamera->getViewMatrix().getTranslationAxis().x,-1*m_frustumCamera->getViewMatrix().getTranslationAxis().y,-1*m_frustumCamera->getViewMatrix().getTranslationAxis().z);// load identity 
    glMultMatrixf(m_frustumCamera->getViewMatrix().getMatrix()); 
    glTranslatef(m_frustumCamera->getViewMatrix().getTranslationAxis().x,m_frustumCamera->getViewMatrix().getTranslationAxis().y,m_frustumCamera->getViewMatrix().getTranslationAxis().z); 

    matrixStackPush();           
} 
+1

什麼樣的你想要做什麼? FPS風格的相機,或6DOF(飛船)? – Tim 2012-04-04 02:52:17

+0

6DOF(太空船)沒有Z軸旋轉(滾動) – 2012-04-04 02:56:20

回答

2

我想乘的順序可能會導致問題,而不是

m_orientation = matrix*m_orientation; 

嘗試

m_orientation = m_orientation * matrix; 
+0

我剛剛試過這個,它確實有一點幫助。相機仍然旋轉怪異我擔心我的翻譯相機是錯誤的。但我已經盡了各種可能的方式來放置翻譯仍然沒有運氣! – 2012-04-04 05:23:03