2017-03-04 17 views
-1

現在、物理エンジンとレンダリングエンジンの中間の作業を進めています。私の物理エンジンは、一連の力と位置を取ってクォータニオンを返します。回転行列の問題

私は現在、この四元数を回転行列に変換していますが、これは以前の質問に対する答えです(これは問題ありません)。私の座標系はzでスクリーン、y - up、x - rightに入ります。

今、その展覧会の後、私は一度に1つの軸を回転させてテストしています。私はy軸とz軸の周りを何も問題なく回転させることができます。しかし、私がz軸の周りを回転しようとすると、システムは奇妙な結果を生み出しています。回転はうまくいきますが、オブジェクトが回転するにつれて、オブジェクトはz方向に平らになります(つまり、負のスケールでスケールされます)。それは枢機卿の方向に45度のオフセットで90度ごとにそうする。

これは、回転行列に私の四元数を変換するために私のコードです:オブジェクトが回転するよう

Matrix4f output = new Matrix4f(); 
    output.setIdentity(); 

    if(input.length()!=0){ 
    input.normalise(); 
    } 

    float xx = input.x * input.x; 
    float xy = input.x * input.y; 
    float xz = input.x * input.z; 
    float xw = input.x * input.w; 

    float yy = input.y * input.y ; 
    float yz = input.y * input.z; 
    float yw = input.y * input.w; 

    float zz = input.z * input.z; 
    float zw = input.z * input.w; 


    output.m00 = 1 -2*((yy+zz)); 
    output.m01 = 2*(xy+zw); 
    output.m02 = 2*(xz-yw); 

    output.m10 = 2*(xy-zw); 
    output.m11 = 1 - (2*(xx+zz)); 
    output.m12 = 2*(yz+xw); 

    output.m20 = 2*(xz+yw); 
    output.m21 = 2*(yz+xw); 
    output.m22 = 1-(2*(xx+yy)); 

は今、私はリアルタイムでこれを見ている、と私はすべきではない何も見えません。また、これはこの方程式からそのままopenglに渡されるので、なぜ私がこの問題を起こすべきかは私の外にあります。何か案は?

答えて

1

output.m21 = 2*(yz+xw);はそんなにありがとう、output.m21 = 2*(yz-xw);

+0

それくぎ付けにする必要があります。 – Peter