尝试在 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;
我正在尝试在 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;