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 回答