2010-11-26 169 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

相關問題