尝试在java中旋转三维矢量



我试图在java中找到3D向量的组件/头。我已经得到了x,y,z变量的设置和相应的旋转变量。使用这些变量和矢量数学,我想找到旋转后的组件。你可以把x,y,z变量看作是一个被转换的向量。

使用这篇文章中的数学:在三维空间中旋转矢量

我写了一些代码,应该根据上一篇文章计算位置:

//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是以弧度为单位的旋转度。

使用此代码,如果您设置如下变量:

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);

它输出:6.12323399573766e-17 0.0 6.12323399736766e-17

我确信这不准确。

我用这个代码做错了什么?有没有一种更简单的方法可以找到三维矢量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;

最新更新