OpenGL で適切なカメラ変換を構築したいのですが、質問があります。
OpenGL を使用せずに単純な 3D エンジンを作成しました。世界を単純に画面に投影することがいかに難しいかを確認するためです。
このエンジンでは、視力を (1,0,0) に設定して、wiwer を (0,0,0) に設定しました。ASDW はオブジェクトの翻訳を行います。マウスは (1,0,0),(0,1,0),(0,0,1) を中心に回転します。
独自の 3D エンジンのプログラミングで多くのことを学びました。その知識をもとに、OpenGL に基づく適切な 3D エンジンの構築を開始しました。
OpenGL でのカメラ変換のために、このコードを作成しました...
カメラの軸は、上、右、前方の移動先を定義します。回転はグローバル軸を中心に行われます(カメラの軸を中心にオブジェクトを回転させたい):(
glRotatef(camera_rot[0],1,0,0)
glRotatef(camera_rot[1],0,1,0)
glRotatef(camera_rot[2],0,0,1)
camera_rot[0]=0
camera_rot[1]=0
camera_rot[2]=0
glGetFloatv(GL_MODELVIEW_MATRIX, matrix)
glTranslatef(
matrix[0]*camera_tra[0],
matrix[4]*camera_tra[0],
matrix[8]*camera_tra[0])
glTranslatef(
matrix[1]*camera_tra[1],
matrix[5]*camera_tra[1],
matrix[9]*camera_tra[1])
glTranslatef(
matrix[2]*camera_tra[2],
matrix[6]*camera_tra[2],
matrix[10]*camera_tra[2])
camera_tra[0]=0
camera_tra[1]=0
camera_tra[2]=0
OpenGL の設計者がカメラを (0,0,0) に配置せず、カメラではなくオブジェクトで平行移動と回転を行わなかった理由はちょっとややこしいです。
glTranslate または glRotation を使用せずに手動で変換を適用し、(作成した) 3D エンジンからの変換ロジックを glVertexe 座標の変更に適用することを考えています。したがって、描画関数で毎回 glVertexes 座標を変更します。しかし、それを行うと、変換後に同一の行列 (ModelView 行列) で頂点が乗算され、プログラムで無意味な計算をしたくありません。
では、この問題を解決するにはどうすればよいですか? カメラの軸を中心とした回転に最適なソリューションを作成するにはどうすればよいですか?