OpenGL 相机旋转不起作用
OpenGL Camera Rotation Not Working
我知道这是一个常见的问题(因为我在这里和其他论坛上阅读了许多关于它的帖子),但对于我的生活,我无法获得我想要的相机旋转。我希望相机能够"环顾四周",而不是让它围绕一个点"运行",这个点是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
在构建视图矩阵时,请确保按顺序进行乘法
旋转 * 平移
而不是
平移 * 轮换
这就是我解决这个问题的方式,发生在我身上的地方
- 我的神经网络不起作用 [XOR 问题]
- 在C++程序中输入的文本文件将不起作用,除非文本被复制和粘贴
- C++映射:具有自定义类的运算符[]不起作用(总是返回0)
- C++为什么尽管我调用了void函数,它却不起作用
- 为什么在保护模式下继承升级不起作用
- 循环在计数器中不起作用
- 在其他文件中创建类时在 c++ 项目中不起作用
- Visual studio代码重构似乎不起作用(例如,重命名符号-f2)
- 为什么二进制搜索在我的测试中不起作用
- 我的代码中有错误吗?使用BGI图形的C++代码对我不起作用
- 为什么 const std::p air<K,V>& 在 std::map 上基于范围的 for 循环不起作用?
- 带有指定长度字符* 参数的 std::regex_search 在 VS2017 中不起作用?
- Bjarne Stroustrup Book - std_lib_facilities.h - 不起作用(未知类型名称)
- Opengl 旋转不起作用
- 四元数旋转不起作用
- 旋转控制不起作用
- 旋转图像不起作用
- 旋转顶点阵列对象不起作用
- 四元数旋转不起作用
- OpenGL 相机旋转不起作用