【发布时间】:2017-01-14 00:11:53
【问题描述】:
我有 2 个平面,第一个由世界空间坐标中的 3 个点给出,它是使用自定义 Geometry() 和一个面构造的(换句话说:它只是 3D 空间中的一个三角形)。
第二个是由与xy 平面平行的PlaneBufferGeometry() 构造的。
如何旋转红色的使其与第一个平行???
我的算法如下:
- 通过平面的法向量获取旋转轴
- 计算它们之间的角度
- 使用轴和角度创建并应用于红色平面旋转矩阵
在代码中:
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 );