2017-10-02 12 views
0

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:

Box Render

bin ich etwas fehlt?

+0

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

+0

Ja, ich sollte eine Bedingung vor dieser Zeile setzen. Aber es hängt nicht mit meinem aktuellen Problem zusammen. Danke trotzdem :) – user3160302

+0

'.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

Antwort

0

Die folgenden Zeilen verwenden nicht die korrekte Syntax.

face0.normal.set(normals[l]); 
... 
face1.normal.set(normals[l]); 

Face3.normal ist ein Vector3 und Vector3.set takes 3 parameters.

Wenn normals[l] hat x, y und z Eigenschaften:

face0.normal.set(normals[l].x, normals[l].y, normals[l].z); 

wird es richtig eingestellt ist.

Alternativ können Sie die normale als Vector3 in den Face3 Konstruktor übergeben. See the docs here for more info.

Auf der Grundlage neuer Informationen:

Seit normals[l] ist bereits ein Vector3, sollten Sie Vector3.copy statt set verwenden:

face0.normal.copy(normals[l]); 

Das sagte, da es ist ein Vector3 , Sie sollten es wirklich nur in den Konstruktor einfügen, wie ich oben erwähnt habe.

+0

Oder verwenden Sie '.copy()' Methode von 'THREE.Vector3()', um eine Normale zu setzen. – prisoner849

+1

@ häftling849 Das mag stimmen, wenn 'normales [l]' schon ein 'Vektor3' ist. Wir können leider nicht aus dem bereitgestellten Code ersehen. Das hat mich geometrie.vertices bemerken lassen.push (Koordinaten [g]); ', also hoffentlich' Koordinaten [g] 'ist auch ein' Vector3'. – TheJim01

+0

Ja beide sind bereits vector3. Ich habe sie nicht aufgenommen, solange es ein langes Skript ist. – user3160302

Verwandte Themen