Ich möchte mein eigenes Modellformat erstellen. Zu diesem Zweck versuche ich benutzerdefinierte Geometrie zu erstellen. Ich kann Geometrie richtig importieren. Bur face Normalen werden nicht gerendert, auch wenn ich sie der Geometrie hinzufüge.Three.js Gesicht Normalen nicht richtig gerendert
Hier Eingabedatei:
# 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
Hier ist die Art, wie ich es importieren.
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();
auf den Code I Quads Dreiecke in Fläche (Verbindungsliste) -Array während FACE4 durch thee.js. veraltet bin Umwandeln Und ich gebe beiden Dreiecken, die denselben Quadrupel teilen, denselben Normalzustand.
Hier ist, wie dieses Feld wiedergegeben wird:
bin ich etwas fehlt?
Habe ich es richtig verstanden, dass egal, wenn Sie eine Liste von Gesicht Normalen haben oder Sie nicht, dann berechnen Sie sowieso Gesicht Normalen? Ich frage wegen dieser Zeile am Ende des Code-Snippets 'geometry.computeFaceNormals();'. – prisoner849
Ja, ich sollte eine Bedingung vor dieser Zeile setzen. Aber es hängt nicht mit meinem aktuellen Problem zusammen. Danke trotzdem :) – user3160302
'.computeFaceNormals()' berechnet automatisch Normalen für Flächen in Ihrer Geometrie, wenn sie aufgerufen werden. Außerdem machen Sie in Ihrem Konditionsblock zweimal dasselbe - Erstellen von zwei Gesichtern. Der einzige Unterschied besteht darin, dass Sie Normalen hinzufügen, also wäre es vielleicht besser, die Erstellung von Gesichtern außerhalb des Bedingungsblocks zu setzen und die Addition von Normalen zuzulassen, wenn die Bedingung "wahr" ist. – prisoner849