0
//---------------------------------------------------------------------------
//  arbitraryRotate - rotates v theta degrees around n
//---------------------------------------------------------------------------
private static Vector3D arbitraryRotate(Vector3D v, Vector3D n, double theta)
{
    theta = Math.toRadians(theta);
    double cosTheta = Math.cos(theta);
    double sinTheta = Math.sin(theta);

    double M11 = n.x * n.x * (1 - cosTheta) + cosTheta;
    double M12 = n.x * n.y * (1 - cosTheta) + (n.z * sinTheta);
    double M13 = n.x * n.z * (1 - cosTheta) - (n.y * sinTheta);

    double M21 = n.x * n.y * (1 - cosTheta) - (n.z * sinTheta);
    double M22 = n.y * n.y * (1 - cosTheta) + cosTheta;
    double M23 = n.y * n.z * (1 - cosTheta) + (n.x * sinTheta);

    double M31 = n.x * n.z * (1 - cosTheta) + (n.y * sinTheta);
    double M32 = n.y * n.z * (1 - cosTheta) - (n.x * sinTheta);
    double M33 = n.z * n.z * (1 - cosTheta) + cosTheta;

    return new Vector3D(v.x * M11 + v.y * M21 + v.z * M31,
                        v.x * M12 + v.y * M22 + v.z * M32,
                        v.x * M13 + v.y * M23 + v.z * M33);
}

私のマトリックスの何が問題なのか誰か教えてください。Z 軸を中心とした回転は完全に機能しますが、X 軸と Y 軸の回転によって歪みが生じます。

4

1 に答える 1

0

マトリックスが正しく設定されていません。正しく回転させる方法は次のとおりです

  1. XZ平面に沿って軸を回転させる回転行列を作成します
  2. その新しい軸を回転させて Z 軸に沿うようにする回転行列を作成します。
  3. Z 軸回転行列を使用して、Z 軸を中心に theta 度回転します。
  4. 2 の逆数を掛ける
  5. 1 の逆数を掛けます。

あなたが得る

new vector = (Rx^-1)(Ry^-1)RzRyRx(original vector)

これがよくわかるリンクです。ベクトルと行列を 4 次元に拡張する必要はありません。これは、原点からのベクトルではなく、空間内の任意の線を中心に回転する場合の変換のみを目的としています。

于 2013-03-24T19:34:02.627 に答える