2016-09-06 71 views
0

我有2架飛機,第一架由世界空間座標中的3個點給出,並且它使用自定義Geometry()和一個臉(換句話說:它只是一個三角形在3D空間中)。 第二個是從PlaneBufferGeometry()構造的,它與xy平面平行。 如何旋轉紅色使其平行於第一個?旋轉飛機使其平行於另一架飛機

插圖: enter image description here

我的算法如下:

  1. 通過平面的法向量
  2. 計算它們之間的角度
  3. 創建並應用到紅色平面旋轉獲取旋轉軸使用軸和角度的矩陣

在代碼:

var v1, v2, v3, geom, mat, plane3mesh, redPlaneMesh;    
geom = new THREE.Geometry(); 
geom.vertices.push(v1, v2, v3); 
var face = new THREE.Face3(0, 1, 2); 
geom.faces.push(face);    
geom.computeFaceNormals(); 
geom.computeVertexNormals(); 
plane3mesh = //...create mesh 

geom = new THREE.PlaneBufferGeometry(700, 700); 
redPlaneMesh = //...create red plane mesh 
var redPlaneNormal = new THREE.Vector3(0, 0, 1);    
var axis = face.normal.clone().cross(redPlaneNormal); 
var angle = Math.acos(face.normal.dot(redPlaneNormal)); // lengths are unit so no need for division 

var rotationWorldMatrix = new THREE.Matrix4(); 
rotationWorldMatrix.makeRotationAxis(axis.normalize(), angle); 
redPlaneMesh.matrix.multiply(rotationWorldMatrix); 
redPlaneMesh.rotation.setFromRotationMatrix(redPlaneMesh.matrix); 

但是它給出了一個錯誤的結果,這是這樣的: enter image description here

什麼是錯我的算法,什麼是不同的解決方案?

+0

你有沒有試過旋轉負角度? (acos不考慮旋轉方向) – MBo

+0

@Mbo只是試圖消極的角度,它的工作!該死的 !那是什麼解釋? – ampawd

+0

@MBo好像和負角度一起工作 – ampawd

回答

0

acos函數給出絕對角度作爲結果。因此,例如,結果Pi/4可能意味着「通過Pi/4旋轉A」和「通過Pi/4旋轉B」。

你的座標軸是通過第一個和第二個法線計算出來的,所以N1,N2和Ax向量形成「右手」三重態。看來在這種情況下,你總是必須否定角度符號才能將所需的法線變換爲另一個。