我有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);
我的算法有什么问题,有哪些不同的解决方案?
答案 0 :(得分:0)
acos
函数给出绝对角度作为结果。因此,例如,结果Pi/4
可能意味着“通过Pi / 4旋转A”和“通过Pi / 4旋转B”。
您的轴是通过第一和第二法线计算的,因此N1,N2和Ax矢量形成“右手”三联体。在这种情况下,你似乎总是要否定角度符号以将所需的法线转换为其他法线。