4

さて、私は 2 つのクォータニオンの角度を取得しようとしています。ほぼ完全に機能しますが、

evec angle: 237.44999653311922
evec angle: 119.60001380112993

そして、私は私の人生の理由を理解できません。(注:evec印刷物に残った古い変数名でした)

とにかく、ここに私のコードがあります:

FloatBuffer fb = BufferUtils.createFloatBuffer(16);

// get the current modelview matrix
GL11.glGetFloat(GL11.GL_MODELVIEW_MATRIX, fb);
Matrix4f mvm = new Matrix4f();
mvm.load(fb);

Quaternion qmv2 = new Quaternion();
Matrix4f imvm = new Matrix4f();
Matrix4f.invert(mvm, imvm);
qmv2.setFromMatrix(imvm);
qmv2.normalise();

Matrix3f nil = new Matrix3f();
nil.setIdentity();
Quaternion qnil = new Quaternion();
qnil.setFromMatrix(nil);
qnil.normalise();

float radAngle = (float)(2.0 * Math.acos(Quaternion.dot(qmv2, qnil)));

System.out.println("evec angle: " + Math.toDegrees(radAngle));

237 から 119 へのジャンプを停止し、360 まで上昇し続けるにはどうすればよいですか?

4

1 に答える 1

1

まず、2 つの4 次元ベクトル(=クォータニオン)の間の角度は幾何学的に何を意味しますか? 計算はできますが、結果が意味をなさない場合があります。2 つのクォータニオンが表す回転軸間の角度を探しているのではないでしょうか?

次に、ここにエラーがあります。

float radAngle = (float)(2.0 * Math.acos(Quaternion.dot(qmv2, qnil)));
                         ^^^^^

からの結果acos 角度です。2倍しないでください。

第 3 に、3D または 4D 空間の 2 つのベクトル間の角度は 180° を超えることはできません。平面上では、平面が向きを課すため、それが可能です。3D 空間では、180° を超える角度を取得するには、任意の方向を「上」として定義する必要があります。

于 2012-02-08T08:06:17.303 に答える