Java 从matrix4d中提取旋转
我从一些软件中得到一个变换矩阵,我必须提取轴的旋转。我不确定确切的名称,但我希望使用与Matrix4d.rotX(a)相反的函数 假设我有以下代码: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 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:我已经尝试过,但无法使其正常工作。您尚未共享代码,因此我无法提供任何错误提示。我已编辑并添加了我尝试过的函数。“值错误”不是问题的说明。请给出您的输入,以及您的预期和实际输出。相关:我已经尝试过,但无法使其工作。您尚未共享代码,因此我无法提供任何关于错误位置的提示。我已编辑并添加了我尝试过的函数。“值错误”不是问题的描述。请给出您的输入,以及您的预期和实际输出。这与此示例类似:您先处理极点上的奇点,然后处理一般情况。这是一个非线性解决方案,可以解决著名的万向节锁问题。我希望你能理解这个源代码,它和这个例子很相似:你先处理极点上的奇点,然后是一般情况。这是一个非线性解决方案,可以解决著名的万向节锁问题。我希望你能理解这个源代码。