Je veux créer mon propre format de modèle. Pour ce faire, j'essaie de créer une géométrie personnalisée. Je peux importer la géométrie correctement. Les normales de face de Bur ne sont pas rendues même si je les ajoute à la géométrie.Les normales des faces de trois.js ne sont pas rendues correctement
fichier d'entrée est ici:
# Coordinates
0e+0 0e+0 0e+0
1e+0 0e+0 0e+0
1e+0 0e+0 1e+0
0e+0 0e+0 1e+0
0e+0 1e+0 0e+0
1e+0 1e+0 0e+0
1e+0 1e+0 1e+0
0e+0 1e+0 1e+0
# Normals
0e+0 0e+0 -1e+0
0e+0 -1e+0 0e+0
0e+0 0e+0 1e+0
0e+0 1e+0 0e+0
1e+0 0e+0 0e+0
-1e+0 0e+0 0e+0
# Connectivity List
1 2 6 5
1 2 3 4
3 4 8 7
6 5 8 7
2 6 7 3
1 5 8 4
Voici la façon dont je l'importer.
var geometry = new THREE.Geometry();
//Add all positions to geometry
for (var g=0;g<coordinates.length;g++){
geometry.vertices.push(coordinates[g]);
}
for(var l=0;l<connectivity.length;l++){
//sml file have rectangular faces but three js uses triangular faces (THREE.Face4 is deprecated) so converting 4 vertex faces to 3 verex faces
var index0= connectivity[l][3]-1;
var index1= connectivity[l][4]-1;
var index2= connectivity[l][5]-1;
var index3= connectivity[l][6]-1;
//If normals is exist thenaddthem to face array too
if(normals.length==connectivity.length){
console.log("Normals are exist");
var face0= new THREE.Face3(index0,index1,index2);
face0.normal.set(normals[l]);
geometry.faces.push(face0);
var face1= new THREE.Face3(index2,index3,index0);
face1.normal.set(normals[l]);
geometry.faces.push(face1);
} else{
console.log("Normals are not exist");
var face0= new THREE.Face3(index0,index1,index2);
geometry.faces.push(face0);
var face1= new THREE.Face3(index2,index3,index0);
geometry.faces.push(face1);
}
}
geometry.computeBoundingBox();
// geometry.compteVertexNormals();
geometry.computeFaceNormals();
le code Je convertis quads de triangles dans le réseau face (liste de connectivité), tandis que FACE4 est obsolète par thee.js. Et j'affecte la même normale aux deux triangles qui partagent le même quad.
Voici comment cette case est rendu:
Suis-je manque quelque chose?
Est-ce que je l'ai compris correctement, que peu importe, si vous avez une liste de normales de visage ou pas, alors vous calculez des normales de visage de toute façon? Je demande à cause de cette ligne à la fin de l'extrait de code 'geometry.computeFaceNormals();'. – prisoner849
oui, je devrais mettre une condition avant cette ligne. Mais ce n'est pas lié à mon problème actuel. Merci quand même :) – user3160302
'.computeFaceNormals()' calcule automatiquement des normales pour les faces de votre géométrie, lorsqu'elles sont appelées. En outre, dans votre bloc de condition, vous faites deux fois la même chose - la création de deux visages. La seule différence est que vous ajoutez des normales, alors peut-être qu'il vaudrait mieux mettre la création de faces hors du bloc de condition et y laisser l'addition de normales, quand la condition est 'true'. – prisoner849