我试图在java中找到3D矢量的组件/头部。我已经有了x,y,z变量设置和相应的旋转变量。使用这些变量和矢量数学,我想在旋转后找到它们。您可以将x,y,z变量视为正在翻译的向量。
使用这篇文章中的数学: 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是以弧度表示的旋转度。
使用此代码,如果您设置如下变量:
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方法有同样的问题。
答案 0 :(得分:0)
您正在尽早更新变量。尝试:
//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;