2016-07-19 9 views
0

Ich importiere ein Mesh und habe bereits die Eckennormalen dafür berechnet. Ich möchte meine Normalen verwenden, anstatt computeVertexNormals() für das Geometrieobjekt aufzurufen. Im Moment habe ichWie definiere ich Vertex-Normalen auf einem Mesh?

var geometry = THREE.Geometry(); 
// fill in vertex, face and texture 
// ... 
// compute normals 
geometry.computeFaceNormals(); 
geometry.computeVertexNormals(); // <-- Would like to replace this 

Es gibt einen Verweis in der Dokumentation zu einem Puffer-Attribut, aber keine Beispiele. http://threejs.org/docs/index.html?q=vertex#Reference/Core/BufferAttribute

Weiß jemand, wie man das macht?

Dank,

john

+1

Ich bemerkte, dass dies unbeantwortet geblieben ist. Ich schaute auf die Quelle, um zu verstehen, wie sie das Float32Array hinzufügt. Siehe die native Funktion hier: https://github.com/mrdoob/three.js/blob/302c693b27663d4d280b156b5ebe4ed38cd062e4/src/core/BufferGeometry.js#L637 Es erscheint "this.addAttribute" in Zeile 649 erstellt das Objekt, das Attribute erstellt. normal.array verfügbar in Zeile 665, wo es nach Belieben bevölkert ist. Ich würde mir vorstellen, dass Sie so Ihre eigenen hinzufügen würden, wobei "dies" die Instanz von Geometrie oder Puffergeometrie ist. – Radio

+0

Danke, das sehe ich im Code. Wenn dies der unterstützte Weg ist, werde ich das untersuchen. –

Antwort

0

Im Fall eines THREE.Geometry Objekt des Vertex-Normalen mit den Gesichtern gespeichert ist. Wenn NormalList die normalen Vektoren für die Scheitelpunkte enthält, wird diese Schleife es tun.

/* 
* Add the normals. They are added to the face array 
*/ 
for (f = 0, fl = geometry.faces.length; f < fl; f ++) { 


var face = geometry.faces[ f ]; 

var ndx = face.a;   
var normal = new THREE.Vector3(); 
normal.x = NormalList[ndx].x; 
normal.y = NormalList[ndx].y; 
normal.z = NormalList[ndx].z; 
face.vertexNormals[ 0 ] = normal; 

ndx = face.b; 
normal = new THREE.Vector3(); 
normal.x = NormalList[ndx].x; 
normal.y = NormalList[ndx].y; 
normal.z = NormalList[ndx].z; 
face.vertexNormals[ 1 ] = normal; 

ndx = face.c; 
normal = new THREE.Vector3(); 
normal.x = NormalList[ndx].x; 
normal.y = NormalList[ndx].y; 
normal.z = NormalList[ndx].z; 
face.vertexNormals[ 2 ] = normal; 


}