旋转平面使其平行于另一个平面

时间:2016-09-06 13:46:59

标签: three.js geometry

我有2个平面,第一个是由世界空间坐标中的3个点给出的,它是使用自定义Geometry()和一个面构建的(换句话说:它只是3D空间中的三角形)。 第二个是由PlaneBufferGeometry()构造的,它与xy平面平行。 如何旋转红色以使其与第一个平行?

插图: enter image description here

我的算法如下:

  1. 通过平面的法线向量获取旋转轴
  2. 计算它们之间的角度
  3. 使用轴和角度
  4. 创建并应用于红色平面旋转矩阵

    在代码中:

    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

    我的算法有什么问题,有哪些不同的解决方案?

1 个答案:

答案 0 :(得分:0)

acos函数给出绝对角度作为结果。因此,例如,结果Pi/4可能意味着“通过Pi / 4旋转A”和“通过Pi / 4旋转B”。

您的轴是通过第一和第二法线计算的,因此N1,N2和Ax矢量形成“右手”三联体。在这种情况下,你似乎总是要否定角度符号以将所需的法线转换为其他法线。