2010-11-26 7 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/ –

答えて

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

gluLookAtが定義されている:

void gluLookAt(GLdouble eyeX, GLdouble eyeY, GLdouble eyeZ, 
       GLdouble centerX, GLdouble centerY, GLdouble centerZ, 
       GLdouble upX, GLdouble upY, GLdouble upZ 
      ); 

カメラがeye位置に配置され、centerからeyeからの方向に見ている、これは私のコードです。

eyecenterが一緒にカメラの軸(方向)を定義し、第3のベクトルupがこの軸の周りの回転を定義します。

別々のΦとΘの回転は必要ありません。正しい回転を得るには、正しいupベクトルを渡すだけです。 (0,1,0)は、カメラが直立していることを意味し、(0,-1,0)は、カメラが上下が逆で、他のベクトルが中間位置を定義していることを意味します。

+0

彼はコード内で同じではなく、慎重に見て、「centerZ」から10を引いています。 – ybungalobill

+0

@ybungalobill:ありがとう、私はその部分を削除しました。 – casablanca

関連する問題