2012-04-04 75 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