我有一个三角形多面体(不一定是凸的),并且有以下信息:
每个顶点的位置列表。 定义每个面的顶点三元组列表。 每个顶点法线的列表(这里的顶点法线是从每个顶点开始通过平均每个顶点周围的面法线(见下文)计算出的向量)。
我想要计算面法线列表(垂直于每个面的标准化向量,指向外部)。
每个顶点的位置列表。 定义每个面的顶点三元组列表。 每个顶点法线的列表(这里的顶点法线是从每个顶点开始通过平均每个顶点周围的面法线(见下文)计算出的向量)。
我想要计算面法线列表(垂直于每个面的标准化向量,指向外部)。
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
来实现:
您可以从THREE.Face3
和几何体顶点中获取a
、b
和c
:
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
。