Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/308.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 从matrix4d中提取旋转_Java_3d_Java 3d - Fatal编程技术网

Java 从matrix4d中提取旋转

Java 从matrix4d中提取旋转,java,3d,java-3d,Java,3d,Java 3d,我从一些软件中得到一个变换矩阵,我必须提取轴的旋转。我不确定确切的名称,但我希望使用与Matrix4d.rotX(a)相反的函数 假设我有以下代码: Matrix4d matrix = new Matrix4d(); matrix.setIdentity(); Matrix4d m = new Matrix4d(); m.rotX(a); matrix.mul(m); m.rotY(b); matrix.mul(m); m.rotZ(c); matrix.mul(m); 我希望能够从矩阵中得到

我从一些软件中得到一个变换矩阵,我必须提取轴的旋转。我不确定确切的名称,但我希望使用与Matrix4d.rotX(a)相反的函数

假设我有以下代码:

Matrix4d matrix = new Matrix4d();
matrix.setIdentity();
Matrix4d m = new Matrix4d();
m.rotX(a);
matrix.mul(m);
m.rotY(b);
matrix.mul(m);
m.rotZ(c);
matrix.mul(m);
我希望能够从矩阵中得到a,b和c的值。有人有主意吗?不幸的是,我几乎没有3D方面的经验,我查看了JavaVecmath软件包,但没有找到任何东西

我尝试了以下方法:

 public static float[] getRotation(Matrix4f matrix) {
        float Yaw;
        float Pitch;
        float Roll;
        if (Math.abs(matrix.m00 + 1.0f) < 0.01f )
        {
            Yaw = (float) Math.atan2(matrix.m02, matrix.m23);
            Pitch = 0;
            Roll = 0;

        }else if (Math.abs(matrix.m00 -1.0f) < 0.01f)
        {
            Yaw = (float) Math.atan2(matrix.m02, matrix.m23);
            Pitch = 0;
            Roll = 0;
        }else
        {

            Yaw = (float) Math.atan2(-matrix.m20,matrix.m00);
            Pitch = (float) Math.asin(matrix.m10);
            Roll = (float) Math.atan2(-matrix.m12,matrix.m11);
        }
        return new float[] { Yaw, Pitch, Roll};
    }

但是值是错误的

我找到了答案,下面是使其工作的代码:

    public static float[] getRotation(Matrix4f matrix) {
            float x,y,z;
            Matrix3f m = new Matrix3f();

            matrix.get(m);
            if(Math.abs(m.m02 - 1) < 0.0000001) {
                x = (float) Math.atan2(-m.m10,m.m11);
                y = (float) (-3.1415926535897931/2);
                z = 0.0f;
            } else if(Math.abs(m.m02 + 1)< 0.0000001) {
                x = (float) Math.atan2(m.m10,m.m11);
                y = (float) (3.1415926535897931/2);
                z = 0.0f;
            } else {
                x = (float) Math.atan2(m.m12,m.m22);
                y = (float) Math.atan2(-m.m02, Math.sqrt(m.m12 * m.m12 + m.m22 * m.m22));
                z = (float) Math.atan2(m.m01,m.m00);
            }

            return new float[] {x,y,z};
}
publicstaticfloat[]getRotation(Matrix4f矩阵){
浮动x,y,z;
Matrix3f m=新Matrix3f();
矩阵get(m);
如果(数学绝对值(m.m02-1)<0.0000001){
x=(浮点)数学表达式atan2(-m.m10,m.m11);
y=(浮动)(-3.1415926535897931/2);
z=0.0f;
}否则如果(数学绝对值(m.m02+1)<0.0000001){
x=(浮点)数学atan2(m.m10,m.m11);
y=(浮动)(3.1415926535897931/2);
z=0.0f;
}否则{
x=(浮点)数学表达式atan2(m.m12,m.m22);
y=(浮点)数学atan2(-m.m02,数学sqrt(m.m12*m.m12+m.m22*m.m22));
z=(浮点)数学atan2(m.m01,m.m00);
}
返回新的浮点[]{x,y,z};
}

我找到了答案,下面是让它工作的代码:

    public static float[] getRotation(Matrix4f matrix) {
            float x,y,z;
            Matrix3f m = new Matrix3f();

            matrix.get(m);
            if(Math.abs(m.m02 - 1) < 0.0000001) {
                x = (float) Math.atan2(-m.m10,m.m11);
                y = (float) (-3.1415926535897931/2);
                z = 0.0f;
            } else if(Math.abs(m.m02 + 1)< 0.0000001) {
                x = (float) Math.atan2(m.m10,m.m11);
                y = (float) (3.1415926535897931/2);
                z = 0.0f;
            } else {
                x = (float) Math.atan2(m.m12,m.m22);
                y = (float) Math.atan2(-m.m02, Math.sqrt(m.m12 * m.m12 + m.m22 * m.m22));
                z = (float) Math.atan2(m.m01,m.m00);
            }

            return new float[] {x,y,z};
}
publicstaticfloat[]getRotation(Matrix4f矩阵){
浮动x,y,z;
Matrix3f m=新Matrix3f();
矩阵get(m);
如果(数学绝对值(m.m02-1)<0.0000001){
x=(浮点)数学表达式atan2(-m.m10,m.m11);
y=(浮动)(-3.1415926535897931/2);
z=0.0f;
}否则如果(数学绝对值(m.m02+1)<0.0000001){
x=(浮点)数学atan2(m.m10,m.m11);
y=(浮动)(3.1415926535897931/2);
z=0.0f;
}否则{
x=(浮点)数学表达式atan2(m.m12,m.m22);
y=(浮点)数学atan2(-m.m02,数学sqrt(m.m12*m.m12+m.m22*m.m22));
z=(浮点)数学atan2(m.m01,m.m00);
}
返回新的浮点[]{x,y,z};
}

Related:我已经尝试过,但无法使其正常工作。您尚未共享代码,因此我无法提供任何错误提示。我已编辑并添加了我尝试过的函数。“值错误”不是问题的说明。请给出您的输入,以及您的预期和实际输出。相关:我已经尝试过,但无法使其工作。您尚未共享代码,因此我无法提供任何关于错误位置的提示。我已编辑并添加了我尝试过的函数。“值错误”不是问题的描述。请给出您的输入,以及您的预期和实际输出。这与此示例类似:您先处理极点上的奇点,然后处理一般情况。这是一个非线性解决方案,可以解决著名的万向节锁问题。我希望你能理解这个源代码,它和这个例子很相似:你先处理极点上的奇点,然后是一般情况。这是一个非线性解决方案,可以解决著名的万向节锁问题。我希望你能理解这个源代码。