尝试在 java 中旋转 3D 矢量

Trying to rotate 3D vector in java

我正在尝试在 java 中找到 3D 矢量的 components/head。我已经设置了 x、y、z 变量和相应的旋转变量。使用这些变量和矢量数学,我想在旋转后找到组件。您可以将 x、y、z 变量视为正在翻译的矢量。

使用这个 post 中的数学: Rotating a Vector in 3D Space

我写了一些代码,应该根据最后一个 post:

来计算位置
//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.123233995736766E-17 0.0 6.123233995736766E-17

我很确定这不准确。 . .

这段代码我做错了什么?有没有更简单的方法来找到 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;