我的旋转矩阵有什么问题?

时间:2013-03-24 12:24:22

标签: java matrix 3d rotation

//---------------------------------------------------------------------------
//  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轴旋转会导致失真。

1 个答案:

答案 0 :(得分:0)

您的矩阵设置不正确。这是你如何正确旋转

  1. 创建一个旋转矩阵,使您的轴旋转以沿XZ平面放置
  2. 创建旋转矩阵,将新轴旋转到Z轴
  3. 使用Z轴旋转矩阵围绕Z轴旋转θ度。
  4. 乘以2的倒数
  5. 乘以1的倒数。
  6. 你得到了

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

    这是一个link,可以很好地解释它。您不必将矢量和矩阵扩展到4维 - 如果您在空间中围绕任意线旋转,而不是源于原点的矢量,则仅用于平移的目的。