0
我有2架飛機,第一架由世界空間座標中的3個點給出,並且它使用自定義Geometry()
和一個臉(換句話說:它只是一個三角形在3D空間中)。 第二個是從PlaneBufferGeometry()
構造的,它與xy
平面平行。 如何旋轉紅色使其平行於第一個?旋轉飛機使其平行於另一架飛機
我的算法如下:
- 通過平面的法向量
- 計算它們之間的角度
- 創建並應用到紅色平面旋轉獲取旋轉軸使用軸和角度的矩陣
在代碼:
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);
什麼是錯我的算法,什麼是不同的解決方案?
你有沒有試過旋轉負角度? (acos不考慮旋轉方向) – MBo
@Mbo只是試圖消極的角度,它的工作!該死的 !那是什麼解釋? – ampawd
@MBo好像和負角度一起工作 – ampawd