如何旋转然后朝那个方向移动?

时间:2010-11-26 20:29:12

标签: c++ opengl

Hy,我目前正在尝试制作第一人称游戏。我能够做的是使用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);

2 个答案:

答案 0 :(得分: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 :(得分: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)表示相机颠倒,其他矢量定义中间位置。