2011-01-07 15 views
2

位置ベクトルと3つの方向ベクトルを使ってJavaでカメラを実装しましたので、「ゴーストモード」で動き回るgluLookAt();を十分に動作させることができますが、衝突検出を追加します。 OpenGLがオブジェクトを描画する座標に位置ベクトルを変換する方法を理解できないようです。カメラからオブジェクト座標を取得する

私の描画ループのラフスケッチはこれです:私は続行する方法の喪失によ

glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); 
glLoadIdentity(); 
camera.setView(); 
drawer.drawTheScene(); 

。コールと私の位置ベクトルの間のModelView行列を見ると、私はどんな種類の相関も見いだせませんでした。

答えて

2

最後にもう一度http://fly.cc.fer.hr/~unreal/theredbook/chapter03.htmlを確認してみました。目の空間(カメラ)からオブジェクト空間に移動するには、そのベクトルにModelView行列の逆数、またはコードを掛けなければなりません。

Vector4f vpos = new Vector4f(0, 0, 0, 1); 
// (0,0,0,1) because it's relative to the cam 
float mv[]=new float[16]; 
ByteBuffer temp = ByteBuffer.allocateDirect(64); 
temp.order(ByteOrder.nativeOrder()); 
GL11.glGetFloat(GL11.GL_MODELVIEW_MATRIX, (FloatBuffer)temp.asFloatBuffer()); 
temp.asFloatBuffer().get(mv); 
Matrix4f m4 = new Matrix4f(); 
m4.load((FloatBuffer)temp.asFloatBuffer()); 
m4.invert(); 
vpos = Matrix4f.transform(m4, vpos, vpos); 
+0

数学ライブラリとしてOpenGLを乱用しないでください。 FYI:これらの行列関数はすべてOpenGL-3から削除されています。行列の内容は自分で行うか、数学ライブラリを使用する必要があります。ほとんどの物理ライブラリでもその行列演算が行われるため、数学と衝突検出の両方が得られます。 – datenwolf

関連する問題