2015-08-15 117 views
1

我在OpenGL 2.0(固定管道)中构建了一个lookAt相机。 我的相机跟踪它的位置,看点和向上矢量。 直到现在我用下面的代码通过一定量的偏航相机:以角度旋转lookAt相机

void Camera::yaw(float amount) 
{ 
    Vector3 rightVec = getRight(); 
    lookAt.z += rightVec.z * amount; 
    lookAt.x += rightVec.x * amount; 
} 

这种方法似乎很好地工作时,我不在乎我到底有多少想偏航我的相机,但现在我想要将相机绑定到机器人的头部,以便当机器人旋转头部时,相机会相应地偏斜。 我改变机器人的头部角度的方法是保持其旋转角度为度,然后添加到该数字并使用glRotatef更改其旋转角度。 所以现在为了对齐我的相机和机器人,我需要我的相机yaw()函数来接受我想要添加的度数,并从中计算出新的lookAt值。 我试图找出我自己的数学,但我找不到一个正确的解决方案。 我该如何改变我目前的偏航功能,以使用度数增量而不是随机数量。

回答

0

你在这里面临的是以一个特定角度围绕另一个点(位置)旋转一个点(lookAt)的一般问题。这可以通过第一平移问题原点,围绕原点旋转,然后回翻译来完成:

lookAt = translate(center) * rotate_y(angle) * translate(-center) * lookAt 

(假设转换和rotate_y给予相应的平移/旋转矩阵)。

当乘以寄托都在一起,一会得到这样的:

  center.x + (lookAt.x - center.x) * cos(angle) + (lookAt.z - center.z) * sin(angle) 
lookAt = [ lookAt.y                   ] 
      center.z + (lookAt.z - center.z) * cos(angle) + (center.x - lookAt.x) * sin(angle) 

注意,所有的计算假设(如您的previouse也一样),即向上向量= [0,1,0]。

+0

请你详细说明如何在没有平移和旋转矩阵的情况下使用矢量数学做到这一点?位置和lookat由它们的三维坐标给出。 –

+0

更新了答案,但如果您使用的是3D图形,则应该真正学习如何使用矩阵。 – BDL

+0

我知道如何使用矩阵,它只是为了图形课程的最终项目,我不能包含任何数学库,所以我自己实现了Vector类,而且我也不想实现矩阵。因为它使用固定管道,所以我不需要所有渲染操作的矩阵类。 –