2010-11-26 170 views
4

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); 
+1

您可能会发现这个网站更有帮助:http://gamedev.stackexchange.com/ – 2010-11-26 21:00:07

回答

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); 

的d应该这样做。 保持编码:)

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一起定义了相机的轴(方向),第三个矢量定义了关于该轴的旋转。

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

+0

他们在他的代码不一样,仔细看,他从`centerZ`减去10。 – ybungalobill 2010-11-26 21:21:34

相关问题