2010-12-05 3 views
1

私はそれが回転マトリックスローテーションで何が問題になりますか?

(float) Math.atan2(-camX.getXf() * padX, -camDir.getZf() * padY) 

Y

-MathUtils.HALF_PI 

Z

しかし

model.setRotation(new Matrix3(1,0,0, 
           0,(float) Math.atan2(-camX.getXf() * padX, -camDir.getZf() * padY),0, 
           0,0,-MathUtils.HALF_PI)); 

でモデルを回転しようとしています(それはmd2モデルなので、横向きですが)Z軸を回転させても、それは右上がりにはなりません。どんな考え?

それぞれの変数は、マトリックスのそれぞれの領域にあります。

EDIT:大丈夫、今私はこのコードを使用しています:

float x = 0; 
      float y = (float) Math.atan2(-camX.getXf() * padX, -camDir.getZf() * padY); 
      float z = (float) -MathUtils.HALF_PI; 

      float a = (float) Math.sin(x); 
      float A = (float) Math.cos(x); 
      float b = (float) Math.sin(y); 
      float B = (float) Math.cos(y); 
      float c = (float) Math.sin(z); 
      float C = (float) Math.cos(z); 

      Matrix3 m = new Matrix3(A*b, -(B*a),b, 
            (C*a)+(A*b*c), (A*C)-(a*b*c), -(B*c), 
            (a*c)-(A*C*b), (A*c)+(C*a*b), B*C); 

しかし、今の軸のどれが正しく回転されていません。

xx, xy, xz, 
yx, yy, yz, 
zx, zy, zz 

答えて

3

回転行列は、このように動作しません:

これは行列が設定されている方法です。角度は行列には入りません!代わりに、私はJavaがデカルト座標系の他の変換行列と同様に回転行列を扱うと仮定します。手作業で回転行列を入力したくないと思うので、新しいMatrix3から始めて(おそらく、それが恒等行列で自動的に初期化されることを望みます)、rotateX(float x) 、rotateY(浮動小数点数y)、rotateZ(浮動小数点数z)です。ここでx、y、zは回転させたい角度です。 (com.threed.jpct.Matrixを使用している場合は少なくとも。)結果は3つのローテーションの連続に依存します。

+0

私はcom.threed.jpct.Matrixを使用していません:( x軸とy軸を使用して2つのデカルト座標をどのように使用すればよいですか?IEではx軸とy軸を使用しています。それ以外の軸を0にリセットします。 – William

+0

あなたは何を使っていますか?無理矢理行くことができます:a = sin x、A = cos x、b = sin y、B = cos y、c = sin z、C = cos zとすると、行列{(AB、-Ba、b)、(Ca + Abc、AC-abc、-Bc)、(ac-ACb、Ac + Cab、BC)}を試す。私の計算は正しいです。回転Xとxに対応し、次に回転Yをy、回転Zをzとします。 –

+0

ああ、matMultを使って行列を乗算することもできます。それを回転させて、恒等行列をとり、rotateZして、それらを整列させてください。 –

関連する問題