我知道这是一个常见问题(因为我在这里和其他论坛上读过很多关于它的帖子),但对于我来说,我无法获得相机的旋转。我希望相机能够“环顾四周”,而不是围绕某个点“绕行”,这一点就是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();
}
}
而如果它是任何后果,我治疗相机矩阵作为视图矩阵(与单独的模型矩阵[视图*模型=模型视图]和透视投影矩阵)。
最后一个典型的框架是这样的:检查输入(适当地移动/旋转相机),渲染天空盒(忽略视图/相机矩阵的原点/位置列),绘制其他所有内容(考虑到整个查看矩阵)。
对于问这样一个常见问题,我表示歉意,但两天的搜索和尝试各种不同的解决方案并没有产生任何积极的结果。
谢谢。
你能描述你_want_什么发生,什么_is_发生了什么? – JCooper 2011-05-19 02:57:31
理想的影响是标准的第一人称自由飞行相机的影响。旋转应模拟相机“环顾四周”。正在发生的事情是相机简单地围绕原点旋转(当位于原点时,它按照原理工作)。希望清除它,如果不让我知道。 – ssell 2011-05-19 03:34:20
如果您仍围绕原点而不是相机的中心旋转,那么您还没有真正移除翻译组件。也许行和列混在一起? – JCooper 2011-05-19 04:17:39