OpenGL:自分のカメラを作成します
質問
カメラを作成して3Dスペースを移動しようとしていますが、セットアップに問題があります。私はこれをやっていますが、私はJavaであり、どうやらGluperspectiveとGlulookatを一緒に使用すると、競合が生まれます(画面は狂ったようにちらつき始めます)。
Gluperspectionは次のように設定されています:
gl.glMatrixMode(GLMatrixFunc.GL_PROJECTION);
gl.glLoadIdentity();
glu.gluPerspective(50.0f, h, 1.0, 1000.0);
gl.glMatrixMode(GLMatrixFunc.GL_MODELVIEW);
次に、カメラマトリックスを作成し、目の座標を使用して、前後のベクトルを使用します(http://people.freedesktop.org/~idr/glu3/form_4.png)(カメラのコードが正しいと仮定します。
最後に、私が持っているものを描く前に:
gl.glMatrixMode(GLMatrixFunc.GL_MODELVIEW);
gl.glLoadIdentity();
gl.glMultMatrixf(camera.matrix);
そして、私は自分の図面ルーチンを呼び出します(GlrotateFとGltranslatefを呼び出すことにより、独自に翻訳/回転を行います)。
glmultmatrixfへの呼び出しがなければ、カメラは画面の中央に表示される必要があるアイテムが必要に応じて表示されます。 Glmulmatrixfを使用すると、私が得るのは黒い画面だけです。代わりにglloadmatrixfを使用してみましたが、動作しませんでした。私は何か間違ったことをしていますか?私は何かを場違いにしていますか?そうでない場合、これがどのように行われるべきか私に知らせてください、そして、私は競合を作成している可能性のあるカメラコードのいくつかを投稿します。
編集:カメラマトリックス作成コードは次のとおりです。
private void createMatrix()
{
float[] f = new float[3]; //forward (centre-eye)
float[] s = new float[3]; //side (f x up)
float[] u = new float[3]; //'new up' (s x f)
for(int i=0;i<3;i++){
f[i] = centre[i]-eye[i];
}
f = Maths.normalize(f);
s = Maths.crossProduct(f,upVec);
u = Maths.crossProduct(s,f);
float[][] mtx = new float[4][4];
float[][] mtx2 = new float[4][4];
//initializing matrices to all 0s
for (int i = 0; i < mtx.length; i++) {
for (int j = 0; j < mtx[0].length; j++) {
mtx[i][j] = 0;
mtx2[i][j] = 0;
}
}
//mtx = [ [s] 0,[u] 0,[-f] 0, 0 0 0 1]
//mtx2 = [1 0 0 -eye(x), 0 1 0 -eye(y), 0 0 1 -eye(z), 0 0 0 1]
for(int i=0;i<3;i++){
mtx[0][i] = s[i];
mtx[1][i] = u[i];
mtx[2][i] = -f[i];
mtx2[i][3]=-eye[i];
mtx2[i][3]=-eye[i];
mtx2[i][3]=-eye[i];
}
mtx[3][3] = 1;
mtx2[0][0]=1;mtx2[1][1] = 1;mtx2[2][2] = 1;mtx2[3][3] = 1;
mtx = Maths.matrixMultiply(mtx,mtx2);
for(int i=0;i<4;i++){
for(int j=0;j<4;j++){
// this.mtx is a float[16] for glMultMatrixf
this.mtx[i*4+j] = mtx[i][j];
}
}
}
エラーがこのコードのどこかにあるとホップしています。そうでない場合は、何が起こっているのかを確認するために数学関数を見てみましょう。
edit2:少なくとも最初のベクトル(目、中央、上に)が正しいことを言及する必要がありますが、カメラを置いてください(Glulookatで作業しているが、ちらつきの問題がありました)。
解決 2
それを修正しました。問題は、glmultmatrix(float [] matrix、int?of set?)を使用することでした...何らかの理由でglmultmatrix(floatbuffer matrix)を使用する場合は正常に動作します。
私が行っている変換にはいくつかの問題がありますが、私はそれらに対処できるはずです...あなたの意見をありがとう。
他のヒント
GlrotateF、GltranslateF、およびGlfrustumを使用してカメラを作成する方が簡単かもしれませんが、数学は私には問題ないようです(UPVECが実際に定義されている限り)。私が行った3Dグラフィックのほとんどでは、追跡したい定義済みのオブジェクトが実際にはありませんでした。最終的に解決する前に、Glulookatを使用して3Dカメラのさまざまな実装を行いました。
カメラを定義する傾向があります。
カメラを作成または初期化するとき、GLFRUSTUMで投影マトリックスを設定します。必要に応じてGlperSpeciveを使用できます。
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glFrustum(left, right, down, up, near, far);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
レンダリングパスの色と深度バッファーをクリアした後、電話します
glLoadIdentity();
glRotated(orientation.x, 1.0, 0.0, 0.0);
glRotated(orientation.y, 0.0, 1.0, 0.0);
glRotated(orientation.z, 0.0, 0.0, 1.0);
glTranslatef(position.x, position.y, position.z);
カメラを配置して向けます。最初に、位置と方向の両方を{0}に設定し、キーを押したときに位置から追加または減算し、方向.xと方向から追加または減算します。 tオリエンテーションを混乱させます。z)
乾杯。