5

我有一个三角多面体(不一定是凸的)和以下信息:

每个顶点的位置列表。定义每个面的顶点三元组列表。顶点法线列表(这里的顶点法线是来自每个顶点的向量,通过平均每个顶点周围的面法线(见下文)来计算)。

我想计算面法线列表(垂直于每个面的平面的标准化向量,指向外面)。

4

2 回答 2

5

您可以通过使用顶点法线之一或所有 3 个顶点的平均值来简单地确定交叉法线的方向。

这是伪代码:

Vec3 CalcNormalOfFace( Vec3 pPositions[3], Vec3 pNormals[3] )
{
    Vec3 p0 = pPositions[1] - pPositions[0];
    Vec3 p1 = pPositions[2] - pPositions[0];
    Vec3 faceNormal = crossProduct( p0, p1 );

    Vec3 vertexNormal = pNormals[0]; // or you can average 3 normals.
    float dot = dotProduct( faceNormal, vertexNormal );

    return ( dot < 0.0f ) ? -faceNormal : faceNormal;
}
于 2012-12-04T05:35:46.310 回答
0

使用三个顶点执行此操作的本机 three.js 代码ab并且c

您可以从您的和几何顶点获取a,b和:cTHREE.Face3

var a = geometry.vertices[ face.a ];
var b = geometry.vertices[ face.b ];
var c = geometry.vertices[ face.c ];

然后你做:

var normal = new THREE.Vector3().crossVectors( 
    new THREE.Vector3().subVectors( b, a ), 
    new THREE.Vector3().subVectors( c, a ) 
).normalize();

但是THREE.Geometry类中也有一些方便的方法可以为您进行顶点和面计算:computeVertexNormalscomputeFaceNormals.

于 2016-02-04T16:00:18.067 回答