试图在java中旋转3D矢量

时间:2017-10-18 03:42:18

标签: java vector lwjgl

我试图在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方法有同样的问题。

1 个答案:

答案 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;