2

一部のモデルでライトをレンダリングしようとしています。すべてのモデルには、いくつかの固有のオプション (スケール、位置、回転) があります。このすべてのオプションでマトリックスを作成し、このマトリックスからすべてのモデルの頂点を変更します。

モデルに負のスケールがあり、法線が反転していて、本来あるべきように見えない場合、大きな問題があります。

ここに画像の説明を入力

ここで私が使用するコード:

vec3.calcNormal = function( a, b, c, dest ) {
    var v1 = dest || vec3.create(), v2 = vec3.create();
    vec3.subtract( c, b, v1 );
    vec3.subtract( a, b, v2 );
    vec3.cross( v1, v2 );
    return vec3.normalize(v1);
};

// Apply matrix on vertices
size  = vertices.length;
vert  = new Array(size);
for( i=0; i<size; ++i ) {
    vert[i] = vec3.create();
    mat4.multiplyVec3(  matrix, vertices[i],  vert[i] );
}


// Generate face normals
face_normal    = new Array(faces.length);
for ( i=0, count=faces.length; i<count; ++i ) {
    face           = faces[i];
    face_normal[i] = vec3.create();

    vec3.calcNormal(
        vert[ face.vertidx[0] ],
        vert[ face.vertidx[1] ],
        vert[ face.vertidx[2] ],
        face_normal[i]
    );
}

誰かがこの問題を解決する方法を知っていますか? 法線を縮小するか、まったく拡大しないようにしましたが、うまくいきませんでした。

以下で修正:

// Get normal matrix
mat3.transpose( mat4.toInverseMat3(matrix), normalMat );

// Apply matrix on vertices
size  = vertices.length;
vert  = new Array(size);
for( i=0; i<size; ++i ) {
    vert[i] = vec3.create();
    mat4.multiplyVec3(  matrix, vertices[i],  vert[i] );
}


// Generate face normals
face_normal    = new Array(faces.length);
for ( i=0, count=faces.length; i<count; ++i ) {
    face           = faces[i];
    face_normal[i] = vec3.create();

    vec3.calcNormal(
        vertices[ face.vertidx[0] ],
        vertices[ face.vertidx[1] ],
        vertices[ face.vertidx[2] ],
        face_normal[i]
    );

    mat3.multiplyVec3( normalMat, face_normal[i] );
}
4

1 に答える 1

2

負のスケール値はジオメトリを反転します: demo From here . 縮小する必要がある場合は、小数値を使用する必要があります。

于 2012-11-09T07:40:06.243 に答える