如何旋转并沿该方向移动?

4

嗨,我目前正在尝试制作第一人称游戏。我已经成功使用函数gluLookAt()使相机移动并使用glRotatef()旋转相机。现在,我想旋转相机,然后沿着旋转方向向前移动,但是轴保持不变,虽然我已经旋转了,但相机仍向侧面移动而不是向前移动。有人可以帮帮我吗?这是我的代码:

glMatrixMode(GL_MODELVIEW);   
glLoadIdentity();   
glRotatef(cameraPhi,1,0,0);   
glRotatef(cameraTheta,0,1,0);
gluLookAt(move_camera.x,move_camera.y,move_camera.z,move_camera.x,move_camera.y,move_camera.z-10,0,1,0);
drawSkybox2d(treeTexture);

1
您可能会发现这个网站更有帮助:http://gamedev.stackexchange.com/ - Joe Phillips
2个回答

5
这需要一些向量数学知识...
有了这些函数,操作就非常简单了:
vec rotx(vec v, double a)
{
    return vec(v.x, v.y*cos(a) - v.z*sin(a), v.y*sin(a) + v.z*cos(a));
}

vec roty(vec v, double a)
{
    return vec(v.x*cos(a) + v.z*sin(a), v.y, -v.x*sin(a) + v.z*cos(a));
}

vec rotz(vec v, double a)
{
    return vec(v.x*cos(a) - v.y*sin(a), v.x*sin(a) + v.y*cos(a), v.z);
}

假设您已定义方向向量为{CameraPhi,CameraTheta,0.0},如果您想相对于相机轴移动相机到矢量v的方向,您需要将该向量加到相机位置p中:

p += v.x*roty(rotx(vec(1.0, 0.0, 0.0), CameraPhi), CameraTheta) +
     v.y*roty(rotx(vec(0.0, 1.0, 0.0), CameraPhi), CameraTheta) +
     v.z*roty(rotx(vec(0.0, 0.0, 1.0), CameraPhi), CameraTheta);

这样就可以了。 继续编码 :)


1

gluLookAt 的定义如下:

void gluLookAt(GLdouble eyeX, GLdouble eyeY, GLdouble eyeZ,
               GLdouble centerX, GLdouble centerY, GLdouble centerZ,
               GLdouble upX, GLdouble upY, GLdouble upZ
              );

摄像机位于eye位置,并朝向从eyecenter的方向。

eyecenter一起定义了摄像机的轴(方向),第三个向量up定义了该轴周围的旋转。

您不需要单独的phi和theta旋转,只需传入正确的up向量即可获得所需的旋转。(0,1,0)表示相机正立,(0,-1,0)表示相机倒置,其他向量定义中间位置。


他的代码中它们不一样,请仔细查看,他从centerZ中减去了10。 - Yakov Galka
@ybungalobill:谢谢,我已经删除了那部分。 - casablanca

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接