三角形分割された多面体 (必ずしも凸面である必要はありません) と次の情報があります。
各頂点の位置のリスト。各面を定義する頂点トリプルのリスト。頂点法線のリスト (ここで、頂点法線は、各頂点の周りの面法線 (以下を参照) を平均することによって計算される各頂点からのベクトルです)。
顔の法線のリストを計算したいと思います(各面の平面に垂直で、外側を向いている正規化されたベクトル)。
三角形分割された多面体 (必ずしも凸面である必要はありません) と次の情報があります。
各頂点の位置のリスト。各面を定義する頂点トリプルのリスト。頂点法線のリスト (ここで、頂点法線は、各頂点の周りの面法線 (以下を参照) を平均することによって計算される各頂点からのベクトルです)。
顔の法線のリストを計算したいと思います(各面の平面に垂直で、外側を向いている正規化されたベクトル)。
交差した法線の方向は、頂点法線の 1 つまたは 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;
}
3 つの頂点a
と でb
これを行うネイティブ three.js コード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
.