0

最近、C++ で openGL を使い始めました。C++ の経験はあまりありませんが、他の言語の経験は豊富です。

私は現在、カメラ FPS スタイルを制御して、小さなゲームを開始し、学習しながら物事を 1 つずつ追加することに取り組んでいます。この質問が頻繁に寄せられていることは知っており、多くのチュートリアル/フォーラムを読んでいます。

私は gluLookAt(); でうまくいきました。しかし、FPS カメラを制御する最良の方法ではないことがわかりました。私は最近マトリックススタックを使用して作業しており、少し迷っています。

コードは機能していますが、私の回転は中心軸などの周りにあるようです。また、ジンバル ロックに関連している可能性のある奇妙なコントロールも得られます。私はそれらを使用した経験があり、十分なものがあればすぐに使用します.

  • カメラ軸ではなく中心軸を中心に回転するのはなぜですか?
  • 私のコードのコンテキストで glPopMatrix() と glPushMatrix() を使用する方法についての洞察はありますか? 機能は理解できるが、カメラを制御する際の使い方が分からない。

最も重要なコードを残して、残りのレンダリングとメインを残すようにしました。マウスとキーボードのコントロールは意図したとおりに機能しています:

void renderScene(void) {

if(init==1){
    glTranslatef(0.0f,-1.0f,-5.0f);
    init = 0;
}
// Clear Color and Depth BuffersWDW
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

// Reset transformations
    //glLoadIdentity();

// Set the camera

glTranslatef(-deltaStrafe,0,-deltaMove);
glRotatef(Pitch,1.0f,0.0f,0.0f);
glRotatef(Yaw,0.0f,1.0f,0.0f);

// Draw ground

glColor3f(0.9f, 0.9f, 0.9f);
glBegin(GL_QUADS);
    glVertex3f(-50.0f, 0.0f, -50.0f);
    glVertex3f(-50.0f, 0.0f,  50.0f);
    glVertex3f( 50.0f, 0.0f,  50.0f); 
    glVertex3f( 50.0f, 0.0f, -50.0f);
glEnd();

// Draw 36 SnowMan
for(int i = -3; i < 3; i++)
    for(int j=-3; j < 3; j++) {
                 glPushMatrix();
                 glTranslatef(i*10.0,0,j * 10.0);
                 if(i==j){
                     drawSnowMan();
                 }
                 else{
                     drawTree();
                 }
                 glPopMatrix();
           }

glutSwapBuffers();
printConsole();
} 

そして主な機能:

int main(int argc, char **argv) {

// init GLUT and create window
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_DEPTH | GLUT_DOUBLE | GLUT_RGBA);
glutInitWindowPosition(780,0);
glutInitWindowSize(800,800);
glutCreateWindow("Physic Engine");

// register callbacks
glutDisplayFunc(renderScene);
glutReshapeFunc(changeSize);
glutIdleFunc(renderScene);


// OpenGL init
glEnable(GL_DEPTH_TEST);

// enter GLUT event processing cycle
glutMainLoop();

return 1;
}

ありがとう!

編集:提案されたように回転/平行移動の順序を変更しました:

glRotatef(Yaw,0.0f,1.0f,0.0f);
glRotatef(Pitch,1.0f,0.0f,0.0f);
glTranslatef(-deltaStrafe,0,-deltaMove);

しかし、私のカメラは自分の軸を中心に回転していません。それらは中心軸を中心に回転しているようで、動かなければ (0,0,0) に向かっています。標準の FPS としてカメラ軸を中心に回転するにはどうすればよいですか? ありがとう。

4

1 に答える 1

0

あなたがしたことは、翻訳してから回転することです。

カメラを回転させ、カメラを移動してから、シーンを描画します。回転は常に原点を中心に適用されるため、回転してから平行移動する場合は、回転を適用してから、回転した参照フレームを平行移動します。

同様の理由で、ピッチとヨーの順序も逆にする必要があります。

また、上向きまたは下向きに 90 度以上回転しないようにピッチを制限する必要があります。

また、任意の軸に回転を適用しない限り、クォータニオンは必要ありません。

于 2013-01-26T23:39:27.193 に答える