2011-06-23 127 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)似乎是什麼你要。 –