OpenGL 相机旋转不起作用

OpenGL Camera Rotation Not Working

本文关键字:不起作用 旋转 相机 OpenGL      更新时间:2023-10-16

我知道这是一个常见的问题(因为我在这里和其他论坛上阅读了许多关于它的帖子),但对于我的生活,我无法获得我想要的相机旋转。我希望相机能够"环顾四周",而不是让它围绕一个点"运行",这个点是OpenGL的原点。

我知道"OpenGL中没有摄像头",地形移动而不是视点等,以及所有这些类似的概念,但它并没有帮助我解决这个问题。

不幸的是,我很固执,想在没有弃用功能的情况下编写我的代码,因此这消除了我读过的 99% 的类似情况,因为大多数这些解决方案都带有 gluLook 和类似的函数。

我使用的矩阵类类似于OpenGL SuperBible 5th Edition使用的矩阵类(来源,GLFrame.h是感兴趣的主文件),但已将其调整为使用OpenGL数学库。

对这个问题的典型回答是翻译到原点,旋转,然后平移回来,但这对我来说没有任何作用。

一些代码:

void rotateLocalX( GLfloat p_Angle )
{
    if( ( m_Roll < m_RollLimit ) && ( m_Roll > ( -m_RollLimit ) ) )
    {
        //store away the current location so I can translate back to it
        glm::vec3 tempOrigin = getOrigin( );
        m_Roll += p_Angle;
        // Go to the Origin
        //you can also subtract the current location to get to 0.f
        //also doing glm::translate( m_Matrix, -( tempOrigin ) ); -> rotate -> 
        //glm::translate( m_Matrix, tempOrigin ) has the same result
        m_Matrix[ 3 ][ 0 ] = 0.f;
        m_Matrix[ 3 ][ 1 ] = 0.f;
        m_Matrix[ 3 ][ 2 ] = 0.f;
        m_Matrix[ 3 ][ 3 ] = 1.f;
        // Rotate the matrix
        m_Matrix = glm::rotate( m_Matrix, p_Angle, glm::vec3( 1.f, 0.f, 0.f ) );
        // Go back to the original location
        m_Matrix[ 3 ][ 0 ] = tempOrigin.x;
        m_Matrix[ 3 ][ 1 ] = tempOrigin.y;
        m_Matrix[ 3 ][ 2 ] = tempOrigin.z;
        m_Matrix[ 3 ][ 3 ] = 1.f;
        normalize( );
    }
}

如果有任何后果,我将相机矩阵视为视图矩阵(具有单独的模型矩阵 [view*model=modelview] 和透视投影矩阵)。

最后,一个典型的帧是这样的:检查输入(根据需要移动/旋转摄像机),渲染天空盒(忽略视图/摄像机矩阵的原点/位置列),绘制其他所有内容(考虑整个视图矩阵)。

我很抱歉问这样一个常见的问题,但两天的搜索和尝试各种不同的解决方案都没有产生积极的结果。

谢谢。

移动"相机"等效于对模型应用逆变换。

假设您有一个以世界中的点 x 为中心的对象,以旋转矩阵 R 为方向。 在你的世界中,你还有一个位于点 y 的相机,以旋转矩阵 S 为方向。 要在渲染对象时获得我认为是您想要的结果,您需要一个如下所示的转换矩阵:

S^-1*T(-y)*T(x)*R

也就是说,在对象坐标中围绕

原点定向对象,将其平移到世界坐标中的位置。 然后,平移它,使相机位于原点,最后旋转对象,使相机向下看 -z 轴。 幸运的是,反转旋转矩阵与转置是一回事。

如果要在以相机为中心的坐标中将相机平移 c,则得到 x' = x + Sc。 平移通过前向相机旋转进行旋转。 如果要在相机坐标中按 Q 旋转,则进行后乘法:S' = S*Q

如果 c 和 Q

在世界坐标中,则 x' = x + c 和 S' = Q*S


通过您对我评论的回答,听起来您可能只是在操纵矩阵中的错误数字。 是否有可能交换您的行和列;所以你总是得到[0,0,0]作为原点? 然后将这些值设置零(尽管它们保持不变)。


编辑 2:

也许您在将m_Matrix应用于转换矩阵之前没有反转? 我认为这将产生你所描述的效果。 要创建逆矩阵,您将采用旋转组件的转置,否定平移组件,并通过旋转组件旋转平移组件。

除了相机的位置之外,您还应该在代码中的某个地方有一个方向向量。

这就是你需要旋转的。

您可能需要查看矩阵转换扩展,特别是lookAt

在构建视图矩阵时,请确保按顺序进行乘法

旋转 * 平移

而不是

平移 * 轮换

这就是我解决这个问题的方式,发生在我身上的地方