3

我有一个THREE.PlaneGeometry, 与ComputeFaceNormals(). 我使用这个几何体创建了两个网格,并对其应用了不同的旋转。我想计算相机和两个网格中心面法线之间的两个角度。它应该是 :

vLocalCamera = vCamera.position - mesh1.position;

mesh1.normal() . vLocalCamera = cos(angle);

问题是我不知道如何使用three.js API在世界坐标(从几何和网格旋转)中获取网格法线

4

2 回答 2

13

如果您想将面或顶点法线 ,normal从局部空间转换为世界空间,您可以这样做:

var normalMatrix = new THREE.Matrix3(); // create once and reuse
var worldNormal = new THREE.Vector3(); // create once and reuse

...

normalMatrix.getNormalMatrix( object.matrixWorld );

worldNormal.copy( normal ).applyMatrix3( normalMatrix ).normalize();

三.js r.107

于 2013-04-29T13:38:01.637 回答
0

我终于找到了一篇旧帖子,说 THREE.js 不会为你计算正常的世界,所以我手动完成了,它工作正常。虽然,可能有更好的方法来做到这一点。如果其他人有兴趣:

    var rotationMatrix = new THREE.Matrix4().extractRotation( this.mesh.matrixWorld );
    this.normalWorld = this.geometry.faces[0].normal.clone().applyMatrix4(rotationMatrix);

    var vLocalCamera = new THREE.Vector3();
    vLocalCamera.subVectors(wbEngine.wb_getCamera().getPosition(), this.mesh.position);
    var cosTheta = Math.abs(this.normalWorld.dot(vLocalCamera.normalize()));
于 2013-04-29T09:19:02.773 回答