0
我有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);
什么是错我的算法,什么是不同的解决方案?
你有没有试过旋转负角度? (acos不考虑旋转方向) – MBo
@Mbo只是试图消极的角度,它的工作!该死的 !那是什么解释? – ampawd
@MBo好像和负角度一起工作 – ampawd