Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/372.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 Can';t将3D点A正确旋转到B(在X、Y、Z轴上)_Java_Matrix_3d_Rotation_Quaternions - Fatal编程技术网

Java Can';t将3D点A正确旋转到B(在X、Y、Z轴上)

Java Can';t将3D点A正确旋转到B(在X、Y、Z轴上),java,matrix,3d,rotation,quaternions,Java,Matrix,3d,Rotation,Quaternions,我已经不知疲倦地研究了三个星期了,每一个将3D点“a”旋转到3D点“B”的步骤,以下是我尝试的但没有成功的技术: 旋转矩阵 旋转矩阵的欧拉角 轴与旋转矩阵的夹角 四元数坐标旋转 三角多轴旋转 我想在java中同时执行3d 3轴旋转(因此,X,Y,Z)(请知道,我并不特别理解其背后的数学原理,我更希望答案是java代码,以及我展示的示例) 例如。 点F a=新点F(0f,2f,0f); 点F b=新点F(2f,0f,2f); //~~~旋转矩阵的开始~~~ //方位角(Z轴) 浮动方位=(浮动

我已经不知疲倦地研究了三个星期了,每一个将3D点“a”旋转到3D点“B”的步骤,以下是我尝试的但没有成功的技术:

  • 旋转矩阵
  • 旋转矩阵的欧拉角
  • 轴与旋转矩阵的夹角
  • 四元数坐标旋转
  • 三角多轴旋转
我想在java中同时执行3d 3轴旋转(因此,X,Y,Z)(请知道,我并不特别理解其背后的数学原理,我更希望答案是java代码,以及我展示的示例)

例如。
点F a=新点F(0f,2f,0f);
点F b=新点F(2f,0f,2f);
//~~~旋转矩阵的开始~~~
//方位角(Z轴)
浮动方位=(浮动)数学托拉迪安(90f);
//标高(Y轴)
浮标高程=(浮标)数学半径(0f);
//倾斜(X轴)
浮动倾斜=(浮动)数学托拉迪安(90f);
/*
公共静态矩阵X4X4F createRotationMatrix(双方位角、双仰角、双倾斜){
//假设角度以弧度为单位。
//预计算欧拉角的正弦和余弦
双su=sin(倾斜);
双cu=cos(倾斜);
双sv=sin(高程);
双cv=cos(标高);
双sw=sin(方位角);
双cw=cos(方位角);
//创建并填充旋转矩阵
matrix4f A=matrix4f.create();
A.值[0]=(浮动)(cv*cw);
A.值[1]=(浮点)((su*sv*cw)-(cu*sw));
A.值[2]=(浮点数)((su*sw)+(cu*sv*cw));
A.值[4]=(浮动)(cv*sw);
A.值[5]=(浮动)((cu*cw)+(su*sv*sw));
A.值[6]=(浮动)((cu*sv*sw)-(su*cw));
A.数值[8]=(浮动)-sv;
A.值[9]=(浮动)(su*cv);
A.数值[10]=(浮动)(cu*cv);
返回A;
}
*/
//将Z*Y*X旋转矩阵相乘,形成“矩阵x4x4f m”
Matrix4x4f m=Matrix4x4.createRotationMatrix(方位角、仰角、倾角);
//多个点“a”和矩阵x4f“m”以获得点“b”
m、 变换(a);//应该返回{2,0,2}相同的'b',但返回{2,0,0}
//~~~旋转矩阵的结束~~~
仅供参考。我的主要信息来源如下:


谢谢大家

我可以解释一种求旋转矩阵的算法,尽管我没有代码

每次旋转都围绕一个轴。我假设你想要一个穿过原点O的轴。在这种情况下,旋转发生在由三个点O、A和B定义的平面上。作为旋转轴,你可以使用两个向量OA和OB的叉积向量。这是公式

为了简单起见,我们将这个方向向量的三个分量称为轴(u,v,w)(我们假设它是归一化的)。接下来求出OA和OB之间的角度θ,这是由两个向量之间的角度θ求出的

最后,在为您完成了最难的部分,它将围绕原点旋转到以下3D矩阵,该矩阵将从A旋转到B。该矩阵的Java代码可在此网站下载


您可以以交互方式查看一些旋转。

什么是
Pointf
Matrix4x4f
?您使用的是什么库?此外,您不能将点a旋转为点b,因为它们与原点的距离不同(点a的距离为
2
,而点b的距离为
sqrt(2^2+2^2)=2.83
)。谢谢,我没有意识到这一点(另外,
Pointf
Matrix4x4f
分别是三维点对象和4×4矩阵对象的任意表示)