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