最近、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 としてカメラ軸を中心に回転するにはどうすればよいですか? ありがとう。