我正在尝试使用Java3D来旋转矢量。我的目标是创建一个变换,使矢量与y轴平行。为此,我计算了原始矢量和相同矢量之间的角度,除了它的z值为0(原始x,原始y,0表示z值)。然后我为y轴做了同样的事情(原始x,0表示y值,原始z)。然后我使用每个角度创建两个Transform3D对象,将它们相乘并应用于向量。我的代码如下:
Transform3D yRotation = new Transform3D();
Transform3D zRotation = new Transform3D();
//create new normal vector
Vector3f normPoint = new Vector3f (normal.getX(), normal.getY(), normal.getZ());
//****Z rotation methods*****
Vector3f newNormPointZ = new Vector3f(normal.getX(), normal.getY(),0.0F);
float zAngle = normPoint.angle(newNormPointZ);
zRotation.rotZ(zAngle);
//****Y rotation methods*****
Vector3f newNormPointY = new Vector3f(normal.getX(),0.0F, normal.getZ());
float yAngle = normPoint.angle(newNormPointY);
yRotation.rotY(yAngle);
//combine the two rotations
yRotation.mul(zRotation);
System.out.println("before trans normal = " +normPoint.x + ", "+normPoint.y+", "+normPoint.z);
//PRINT STATEMENT RETURNS: before trans normal = 0.069842085, 0.99316376, 0.09353002
//perform transform
yRotation.transform(normPoint);
System.out.println("normal trans = " +normPoint.x + ", "+normPoint.y+", "+normPoint.z);
//PRINT STATEMENT RETURNS: normal trans = 0.09016449, 0.99534255, 0.03411238
我希望变换会产生x和z值或非常接近0.虽然逻辑对我有意义,但我显然错过了一些东西..
答案 0 :(得分:1)
如果您的目标是旋转平行于y轴的矢量,为什么不能仅使用矢量的大小手动设置它并将矢量设置为< 0,MAGNITUDE,0>?
此外,您应该知道将矢量旋转为直接指向+ Y或-Y会导致某些旋转实现中断,因为它们根据“向上”向量运行,或者< 0,1,0> ;。您可以通过构建自己的旋转系统并使用“world out”向量< 0,0,1>来解决这个问题。直接向上旋转时。
如果您有其他目的,fastgraph帮助我构建旋转矩阵。
最好了解正在发生的事情的数学运算,以便您知道将来该做什么。