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);
答案 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
位置,朝eye
到center
的方向看。
eye
和center
一起定义相机的轴(方向),第三个矢量up
定义围绕此轴的旋转。
您不需要单独的phi和theta旋转,只需传入正确的up
向量即可获得所需的旋转。 (0,1,0)
表示相机是竖立的,(0,-1,0)
表示相机颠倒,其他矢量定义中间位置。