【问题标题】:Rotate plane to make it parallel to another plane旋转平面使其平行于另一个平面
【发布时间】:2017-01-14 00:11:53
【问题描述】:

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

插图:

我的算法如下:

  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);

但它给出了错误的结果,即:

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

【问题讨论】:

  • 您是否尝试过按负angle 旋转? (acos不考虑旋转方向)
  • @Mbo 刚刚尝试使用负角,它奏效了!该死 !对此有何解释?
  • @MBo 似乎在使用负角
  • @ampawd 试试 plane.lookAt( triangle_normal );

标签: three.js geometry


【解决方案1】:

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

您的轴是通过第一条和第二条法线计算的,因此 N1、N2 和 Ax 向量形成“右手”三元组。似乎在这种情况下,您总是必须否定角度符号才能将所需的法线转换为其他法线。

【讨论】:

    猜你喜欢
    • 2017-07-27
    • 2022-01-12
    • 1970-01-01
    • 2018-06-05
    • 2023-03-17
    • 2012-10-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多