2011-05-19 230 views
0

我知道这是一个常见问题(因为我在这里和其他论坛上读过很多关于它的帖子),但对于我来说,我无法获得相机的旋转。我希望相机能够“环顾四周”,而不是围绕某个点“绕行”,这一点就是OpenGL的起源。OpenGL相机旋转不起作用

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

不幸的是我很固执,想写我的代码没有弃用的功能,所以这消除了99%的类似情况,我已阅读有关,因为大多数解决方案与gluLook和类似的功能。

我使用的矩阵类与OpenGL SuperBible第5版(source,GLFrame.h是感兴趣的主要文件)使用的矩阵类相似,但已将其调整为使用OpenGL Mathematics Library

对这个问题的典型回答是翻译为原点,旋转,然后翻译回来,但是这对我没有任何帮助。

某些代码:

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

而如果它是任何后果,我治疗相机矩阵作为视图矩阵(与单独的模型矩阵[视图*模型=模型视图]和透视投影矩阵)。

最后一个典型的框架是这样的:检查输入(适当地移动/旋转相机),渲染天空盒(忽略视图/相机矩阵的原点/位置列),绘制其他所有内容(考虑到整个查看矩阵)。

对于问这样一个常见问题,我表示歉意,但两天的搜索和尝试各种不同的解决方案并没有产生任何积极的结果。

谢谢。

+0

你能描述你_want_什么发生,什么_is_发生了什么? – JCooper 2011-05-19 02:57:31

+0

理想的影响是标准的第一人称自由飞行相机的影响。旋转应模拟相机“环顾四周”。正在发生的事情是相机简单地围绕原点旋转(当位于原点时,它按照原理工作)。希望清除它,如果不让我知道。 – ssell 2011-05-19 03:34:20

+0

如果您仍围绕原点而不是相机的中心旋转,那么您还没有真正移除翻译组件。也许行和列混在一起? – JCooper 2011-05-19 04:17:39

回答

1

移动“摄影机”相当于对模型应用逆变换。

比方说,你在点在你的世界X中心的一个对象,旋转矩阵[R导向。您还可以在您的世界中使用处的相机,并使用旋转矩阵S。要得到什么,我相信是你想要的结果渲染对象时,你需要一个转换矩阵,它看起来像这样:

小号^ -1 * T(-y)* T(X)* R

也就是说,您将对象定位在对象坐标中的原点周围,然后将其转换为世界坐标中的位置。然后翻译它以便相机位于原点,最后旋转物体以便相机正在俯视轴。幸运的是,反转旋转矩阵与转置一样。

如果你想在摄像机为中心的坐标Ç到相机翻译,那么你得到X” = X +钪。翻译由前摄像头旋转旋​​转。如果你想旋转Q相机坐标,那么你后乘:S'= S * Q

如果然后ÇQ是在世界坐标X '= X + CS'= Q * S


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


编辑2:

也许你不把它应用到变换矩阵前倒相m_Matrix?我认为这会产生你所描述的效果。要创建逆矩阵,您将采用旋转分量的转置,取消平移分量,并通过旋转分量旋转平移分量。

+0

行/列应该是正确的。 GLM使用OpenGL专业专业实践,我以这些结果作为示例:**在任何转换之前**:-18.0,0.0,-13.0 | **转换为原点后**:0.0,0.0,0.0 | **旋转后**:0.0,0.0,0.0(其余列已更改)| **恢复后**:-18.0,0.0,-13.0。此外,我想到一个更好的方式来描述我想要/得到的:**想要**:世界围绕'相机'旋转| ** ** **:相机在世界各地旋转(原点) – ssell 2011-05-19 04:51:44

+0

@ssell您是否在应用相机之前倒置相机的矩阵? – JCooper 2011-05-19 19:54:45

+0

不,我不知道。我会尝试一下。如果这不起作用,我会尝试Gaby提到的glm :: lookAt。 – ssell 2011-05-20 00:20:04

1

除了相机的位置之外,您应该在代码中的某个位置放置方向矢量。

这就是你需要旋转的东西。

你可能想看看matrix transform extensions,特别是lookAt