2016-09-06 44 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向量形成“右手”三重态。看来在这种情况下,你总是必须否定角度符号才能将所需的法线变换为另一个。