1
我正在尝试使用Java3D来旋转矢量。我的目标是创建一个将使矢量与y轴平行的变换。为此,我计算了原始矢量与相同矢量之间的角度,除了它的z值为0(原始x,原始y,对于z值为0)。然后,我为y轴做了同样的事情(原始x,0代表y值,原始z)。然后,我使用每个角度创建两个Transform3D对象,将它们相乘并应用到该向量。我的代码如下:使用Java 3D旋转矢量
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,我显然缺少的东西..
谢谢。我的总体目标是旋转整个pointcloud,使得floor的值非常接近或等于0.我试图生成一个Transform3D,它将平行于y轴的矢量(垂直于地面)旋转,然后使用相同的Transform3D旋转点云中的每个点。轮转之后,我希望所有属于地板的点的值都非常接近零。这听起来像一个体面的方法吗? – RDL
每个点的位置取决于旋转轴。如果我没有记错,RotX/Y/Z函数使用每个对象的模型视图矩阵进行旋转,因此旋转已移动到(a,b,c)的点将导致该点仍位于(a,b, c),但是具有不同的法线方向。 [AxisAngle4f](http://download.oracle.com/docs/cd/E17802_01/j2se/javase/technologies/desktop/java3d/forDevelopers/J3D_1_3_API/j3dapi/javax/vecmath/AxisAngle4f.html)似乎是什么你要。 –