2011-11-19 16 views
0

もう一度問題が発生しました。数日からジンバルロックなしでJavaでカメラを作成しようとしています。これを解決するために、OpenGLからQuaternionsとglMultMatrixを使用しようとします。また、ライブラリ「LWJGL」、特にクラスMatrix4f,Vector4f、クォータニオンを使用します。glMultMatrix(OpenGL)によるクォータニオンと描画

 int DX = Mouse.getDX(); //delta-mouse-movement 
     int DY = Mouse.getDY(); 

     Vector4f axisY = new Vector4f(); 
      axisY.set(0, 1, 0,DY); 
     Vector4f axisX = new Vector4f(); 
      axisX.set(1, 0, 0, DX); 

     Quaternion q1 = new Quaternion(); 
      q1.setFromAxisAngle(axisX); 
     Quaternion q2 = new Quaternion(); 
      q2.setFromAxisAngle(axisY); 

     Quaternion.mul(q1, q2, q1); 
     Quaternion.mul(camera,q1,camera); 

そして、私は行列にクォータニオンを変換し、これを聖霊降臨祭:ここ は、四元数を計算コードである

public Matrix4f quatToMatrix(Quaternion q){ 
    double sqw = q.w*q.w; 
    double sqx = q.x*q.x; 
    double sqy = q.y*q.y; 
    double sqz = q.z*q.z; 

    Matrix4f m = new Matrix4f(); 
    // invs (inverse square length) is only required if quaternion is not already normalised 
    double invs = 1/(sqx + sqy + sqz + sqw); 
    m.m00 = (float)((sqx - sqy - sqz + sqw)*invs) ; // since sqw + sqx + sqy + sqz =1/invs*invs 
    m.m11 = (float)((-sqx + sqy - sqz + sqw)*invs); 
    m.m22 =(float) ((-sqx - sqy + sqz + sqw)*invs); 

    double tmp1 = q.x*q.y; 
    double tmp2 = q.z*q.w; 
    m.m10 = (float) (2.0 * (tmp1 + tmp2)*invs); 
    m.m01 = (float) (2.0 * (tmp1 - tmp2)*invs) ; 

    tmp1 = q.x*q.z; 
    tmp2 = q.y*q.w; 
    m.m20 = (float)(2.0 * (tmp1 - tmp2)*invs) ; 
    m.m02 = (float)(2.0 * (tmp1 + tmp2)*invs) ; 
    tmp1 = q.y*q.z; 
    tmp2 = q.x*q.w; 
    m.m21 = (float)(2.0 * (tmp1 + tmp2)*invs) ; 
    m.m12 = (float)(2.0 * (tmp1 - tmp2)*invs) ;  

    return m; 
} 

Aはクォータニオンは次のように例を探し変換:

-0.5191307 0.027321965 -0.85425806 0.0 
0.048408303 -0.9969446 -0.061303165 0.0 
-0.8533229 -0.07317754 0.51622194 0.0 
0.0 0.0 0.0 1.0 

その後、私はこのコードでシーンを描きます:

java.nio.FloatBuffer fb = BufferUtils.createFloatBuffer(32); 
    quatToMatrix(camera).store(fb); 
    GL11.glMultMatrix(fb); 

    drawPlayer(); 

私の問題は今、カメラの動きがない、または十分に動かないということです。私は自分のプレーヤーのモデルだけを見ているだけなので、何もありません(プレーヤーのモデルの後ろに描くシーンのキューブもあります) 。

私は正確に何が間違っているのか分かりません。それは描くか、回転するか、または変換していますか? 私を助けてください。

EDIT:

私のOpenGLの初期化です:

GL11.glMatrixMode(GL11.GL_PROJECTION); 
GL11.glLoadIdentity(); 
GLU.gluPerspective(45.0f, ((float) setting.displayW()/(float) setting.displayH()), 0.1f,10000.0f); 
GL11.glMatrixMode(GL11.GL_MODELVIEW); 
GL11.glLoadIdentity(); 
GL11.glShadeModel(GL11.GL_SMOOTH); 
GL11.glEnable(GL11.GL_DEPTH_TEST); 
GL11.glDepthFunc(GL11.GL_LEQUAL); 
GL11.glHint(GL11.GL_PERSPECTIVE_CORRECTION_HINT, GL11.GL_NICEST); 

何が間違っている任意のアイデア?

答えて

0

クォータニオン関数へのマウスの動きにいくつかのエラーがあります(X移動の四元数はどこですか?)。それ以外にも、残りの図面設定コード(投影行列、モデルビューの初期化)も見なければなりません。

+0

ありがとうございました!それは私のOpenGLの初期化です:\t \t GL11.glMatrixMode(GL11.GL_PROJECTION); \t \t GL11.glLoadIdentity(); \t \t GLU.gluPerspective(45.0f、(float)setting.displayW()/(float)setting.displayH())、0.1f、10000.0f); \t \t GL11.glMatrixMode(GL11.GL_MODELVIEW); \t \t GL11.glLoadIdentity(); \t \t GL11.glShadeModel(GL11.GL_SMOOTH); \t \t GL11.glEnable(GL11.GL_DEPTH_TEST); \t \t GL11.glDepthFunc(GL11.GL_LEQUAL); \t \t GL11.glHint(GL11.GL_PERSPECTIVE_CORRECTION_HINT、GL11.GL_NICEST); - X運動の四元数はどういう意味ですか?あなたはこれを意味しますか?axisX.set(1、0、0、DY); ? – mick

+0

@mick Nice comment;) –

+0

mmh ...私は知っている^^私はそれをより読みやすく投稿する方法を知りません。どのように私の問題を解決するための任意のアイデア? – mick