如何旋转,然后朝那个方向移动?
问题描述:
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);
答
这一点需要矢量数学的...
鉴于这些功能,操作非常简单,但:
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);
的d应该这样做。 保持编码:)
答
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
一起定义了相机的轴(方向),第三个矢量定义了关于该轴的旋转。
您不需要单独的phi和theta旋转,只需传入正确的up
矢量即可获得所需的旋转。 (0,1,0)
表示相机直立,(0,-1,0)
表示相机颠倒,其他矢量定义中间位置。
+0
他们在他的代码不一样,仔细看,他从`centerZ`减去10。 – ybungalobill 2010-11-26 21:21:34
您可能会发现这个网站更有帮助:http://gamedev.stackexchange.com/ – 2010-11-26 21:00:07