我有一个三角形多面体(不一定是凸面)和以下信息:
每个顶点的位置列表。 定义每个面的顶点三元组列表。 顶点法线列表(这里顶点法线是每个顶点的向量,通过平均每个顶点周围的面法线(见下文)计算得出)。
我想计算面法线列表(垂直于每个面的平面,向外指向的标准化矢量)。
答案 0 :(得分: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;
}
答案 1 :(得分:0)
使用三个顶点a
,b
和c
执行此操作的原生three.js代码:
您可以从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
。