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

Java 我的旋转矩阵有什么问题?,java,matrix,3d,rotation,Java,Matrix,3d,Rotation,谁能告诉我矩阵有什么问题吗?绕Z轴旋转工作正常,但X轴和Y轴旋转会导致扭曲。您的矩阵设置不正确。这是如何正确旋转的 创建旋转矩阵,使轴沿XZ平面旋转 创建一个旋转矩阵,使新轴沿Z轴旋转 使用Z轴旋转矩阵围绕Z轴旋转θ度 乘以2的倒数 乘以1的倒数 你得到 //--------------------------------------------------------------------------- // arbitraryRotate - rotates v theta degree

谁能告诉我矩阵有什么问题吗?绕Z轴旋转工作正常,但X轴和Y轴旋转会导致扭曲。

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

  • 创建旋转矩阵,使轴沿XZ平面旋转
  • 创建一个旋转矩阵,使新轴沿Z轴旋转
  • 使用Z轴旋转矩阵围绕Z轴旋转θ度
  • 乘以2的倒数
  • 乘以1的倒数
  • 你得到

    //---------------------------------------------------------------------------
    //  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);
    }
    
    这里有一个很好的解释。你不必将向量和矩阵扩展到4维——这只是为了在空间中围绕任意直线旋转时进行平移,而不是从原点出发的向量

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