2011-06-23 82 views
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,我显然缺少的东西..

回答

1

如果您的目标是旋转一个平行于y轴的矢量,为什么不能用矢量的幅度手动设置它并将矢量设置为< 0,MAGNITUDE,0>?另外,您应该知道,将矢量旋转为直接指向+ Y或-Y会导致一些旋转实现中断,因为它们按照“世界向上”矢量操作,或者,< 0,1,0 >。您可以通过构建自己的旋转系统并在直接向上旋转时使用“世界外”矢量来解决此问题。

如果你有其他一些目的,fastgraph帮助我建立旋转矩阵。

最好了解正在发生的事情的数学方法,以便您知道将来要做什么。

+0

谢谢。我的总体目标是旋转整个pointcloud,使得floor的值非常接近或等于0.我试图生成一个Transform3D,它将平行于y轴的矢量(垂直于地面)旋转,然后使用相同的Transform3D旋转点云中的每个点。轮转之后,我希望所有属于地板的点的值都非常接近零。这听起来像一个体面的方法吗? – RDL

+0

每个点的位置取决于旋转轴。如果我没有记错,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)似乎是什么你要。 –