c++ - Opengl 相机和乘法矩阵

标签 c++ opengl matrix camera

我目前在制作相机时遇到了很多问题。问题出在我的矩阵旋转上,我正在按照本网站所说的那样避免万向节锁定..

One of the first problems you will note is that the order you apply these rotations matter. As previously stated, a rotation matrix is an orientation transform. Each transform defines a new coordinate system, and the next transform is based on an object in the new space. For example, if we apply the roll first, we have now changed what the axis for the subsequent yaw is.

当我执行此操作时,例如,如果我想围绕当前 x 轴倾斜,x 轴也会改变我的轴旋转方法,这显然是错误的。我环顾四周,找不到任何解决方案。我已经尝试了很多不同版本的轴角旋转矩阵..

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();                                          
}

最佳答案

我认为乘法顺序会导致问题,而不是

m_orientation = matrix*m_orientation;

尝试

m_orientation = m_orientation * matrix;

关于c++ - Opengl 相机和乘法矩阵,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10004253/

相关文章:

c++ - 没有一个新的内存泄漏 1mb/s

matlab - 如何将矩阵分成相等的部分?

c++ - FORTRAN 中函数的基本结构是什么?

c++ - 用一个空格替换字符串中的多个空格

c++ - 如何处理堆内存垃圾?

opengl - 循环是在 GPU 上按顺序执行还是并行执行?

c++ - 如何移动相机并将其粘贴到播放器上?

推荐系统中的矩阵分解方法

r - 我应该使用 data.frame 还是矩阵?

c++ - 默认初始化抛出异常