5

三角形分割された多面体 (必ずしも凸面である必要はありません) と次の情報があります。

各頂点の位置のリスト。各面を定義する頂点トリプルのリスト。頂点法線のリスト (ここで、頂点法線は、各頂点の周りの面法線 (以下を参照) を平均することによって計算される各頂点からのベクトルです)。

顔の法線のリストを計算したいと思います(各面の平面に垂直で、外側を向いている正規化されたベクトル)。

4

2 に答える 2

5

交差した法線の方向は、頂点法線の 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;
}
于 2012-12-04T05:35:46.310 に答える
0

3 つの頂点aと でbこれを行うネイティブ three.js コードc:

abをジオメトリ頂点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クラスには、頂点と面の計算を行う便利なメソッドもあります:computeVertexNormalscomputeFaceNormals.

于 2016-02-04T16:00:18.067 に答える