我有一个三角多面体(不一定是凸的)和以下信息:
每个顶点的位置列表。定义每个面的顶点三元组列表。顶点法线列表(这里的顶点法线是来自每个顶点的向量,通过平均每个顶点周围的面法线(见下文)来计算)。
我想计算面法线列表(垂直于每个面的平面的标准化向量,指向外面)。
我有一个三角多面体(不一定是凸的)和以下信息:
每个顶点的位置列表。定义每个面的顶点三元组列表。顶点法线列表(这里的顶点法线是来自每个顶点的向量,通过平均每个顶点周围的面法线(见下文)来计算)。
我想计算面法线列表(垂直于每个面的平面的标准化向量,指向外面)。
您可以通过使用顶点法线之一或所有 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;
}
使用三个顶点执行此操作的本机 three.js 代码a
,b
并且c
:
您可以从您的和几何顶点获取a
,b
和:c
THREE.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
类中也有一些方便的方法可以为您进行顶点和面计算:computeVertexNormals
和computeFaceNormals
.