试图在Java中旋转3D矢量

问题描述:

我试图在java中查找3D矢量的组件/头。我已经获得了x,y,z变量设置和相应的旋转变量。使用这些变量和矢量数学,我想在旋转后找到组件。您可以将x,y,z变量视为一个正在翻译的向量。试图在Java中旋转3D矢量

从这篇文章使用数学: Rotating a Vector in 3D Space

我写了一些代码,应该基于对过去后计算出的位置是:

//Rotate Z 
x = ((x * Math.cos(radz)) - (y * Math.sin(radz))); 
y = ((x * Math.sin(radz)) + (y * Math.cos(radz))); 
//Ignore Z ############################################### 

//Rotate Y 
x = ((x * Math.cos(rady)) - (z * Math.sin(rady))); 
//Ignore Y ############################################### 
z = ((x * Math.sin(rady)) + (z * Math.cos(rady))); 

//Rotate X 
//Ignore X ############################################### 
y = ((y * Math.cos(radx)) - (z * Math.sin(radx))); 
z = ((y * Math.sin(radx)) + (z * Math.cos(radx))); 

其中,x,y和z是位置是需要改变,Radx,Rady和Radz是以弧度表示的旋转角度。

使用此代码,如果你设置像这样的变量有:即时通讯相当肯定是不准确的 6.123233995736766E-17 0.0 6.123233995736766E-17

double radx = Math.toRadians(0f); 
double rady = Math.toRadians(90f); 
double radz = Math.toRadians(0f); 

double x = 1; 
double y = 0; 
double z = 0; 

System.out.println(x + " " + y + " " + z); 

它输出。 。 。

我在做什么错这个代码?有没有更简单的方法来找到一个3D矢量java的头?

另外我也有joml库,但它似乎与vec.rotateX方法有同样的问题。

您正在尽早更新变量。尝试:

//Rotate Z 
double newX = ((x * Math.cos(radz)) - (y * Math.sin(radz))); 
y = ((x * Math.sin(radz)) + (y * Math.cos(radz))); 
//Ignore Z ############################################### 

x = newX; 

//Rotate Y 
newX = ((x * Math.cos(rady)) + (z * Math.sin(rady))); 
//Ignore Y ############################################### 
z = ((x * -Math.sin(rady)) + (z * Math.cos(rady))); 

x = newX; 

//Rotate X 
//Ignore X ############################################### 
double newY = ((y * Math.cos(radx)) - (z * Math.sin(radx))); 
z = ((y * Math.sin(radx)) + (z * Math.cos(radx))); 

y = newY; 
+0

单独适用于x,y和z。 也适用于x + y,x + z但出于某种原因不适用于y + z。我现在正在研究这个。如果可能的话,你能想出那个吗?也欢呼 – codedcosmos

+0

不清楚如果总和不起作用。请提供您正在查找的输入和期望输出的示例。 – Doleron

+0

Radx很好,不用担心它,rady + radz也不错。然而,当rady + radz一起改变时,它会因为某种原因而中断。 注意这些输入是以度为单位,在代码中进行转换。 当具有radx为0,雷迪135和radz为135 结果应该是关于: 0.5 -0.70710677 0.5 当它实际上是: 0.5 -0.70710677 -0.5 – codedcosmos