2013-05-29 13 views
5

Ich habe geklont und dann ein Objekt mit negativer Skalierung umgedreht, was dazu führt, dass meine einseitigen Flächen invertiert werden. Meine Frage ist, wie kann ich die Normalen auch umdrehen?Three.js: Wie Normale nach negativer Skala umgedreht werden

Ich möchte nicht materials.side = THREE.DoubleSide verwenden, aus Gründen: 1) hat nicht richtig funktioniert (einige Schattierungen sind von innen gezogen) und 2) wollen so viel Leistung wie möglich zu halten. DoubleSide ist also keine Option für mich.

Das ist wie mein Objekt wenn umgedreht.

mesh.scale.x = - scale_width; 

Vielen Dank im Voraus!

+0

Ich habe deine Antwort auch auf diese Frage gelesen und ich dachte, welche andere Wahl habe ich, meine Objekte "umzudrehen" als negative Skalierung? Vielleicht kannst du mir eine bessere Lösung empfehlen, als negativ zu skalieren? Meine Aufgabe besteht darin, ein symmetrisches Objekt zu erstellen: einen Rahmen für ein Bild für eine virtuelle Kunstgalerie. So habe ich die Geometrie einer Rahmenseite, sie kann sogar in ihrer Form variieren. Jede Rahmenseite hat zwei 45 Grad Ecken, rund oder scharf, was auch immer. Also erstelle ich eine Ecke und kloniere sie, als ich sie negativ skaliere, um einen vollen Flip zu bekommen. Irgendwelche Vorschläge, wie man das ohne negative Skalierung behandelt? –

Antwort

5

I gegen negativen Maßstab für eine ganze Reihe von Gründen raten würde, wie in diesem Link erklärt: Transforming vertex normals in three.js

Sie stattdessen eine Inversionsmatrix auf Ihre Geometrie wie so in

geometry.scale(- 1, 1, 1); 

Wie erklärt anwenden kann Die Verknüpfung, eine Konsequenz, dies zu tun, ist jedoch, dass die Geometrieflächen nicht mehr entgegen dem Uhrzeigersinn, sondern im Uhrzeigersinn haben.

Sie können Ihre Geometrie manuell durchlaufen und die Wicklungsreihenfolge jeder Fläche umkehren. Dies kann für Sie funktionieren - wenn Sie keine Textur angewendet haben und keine UVs verwenden. Wenn Ihre Geometrie texturiert werden soll, müssen auch die UVs korrigiert werden.

Eigentlich wäre ein Geometrie Inversion Utility eine schöne Ergänzung zu three.js. Momentan wird das, was Sie tun möchten, nicht von der Bibliothek unterstützt.

three.js r.72

+0

Danke für die Erklärung, so dass es ermutigend ist, darüber nachzudenken, dieses Feature zu implementieren :) –

3

Diese Frage ist zwei Jahre alt, aber falls jemand vorbeigeht. Hier ist eine nicht-destruktive Art und Weise, dies zu tun:

Sie können den „schmutzigen Ecken/Normale“ Modus gelangen, und die Normale Flip manuell:

mesh.geometry.dynamic = true 
mesh.geometry.__dirtyVertices = true; 
mesh.geometry.__dirtyNormals = true; 

mesh.flipSided = true; 

//flip every vertex normal in mesh by multiplying normal by -1 
for(var i = 0; i<mesh.geometry.faces.length; i++) { 
    mesh.geometry.faces[i].normal.x = -1*mesh.geometry.faces[i].normal.x; 
    mesh.geometry.faces[i].normal.y = -1*mesh.geometry.faces[i].normal.y; 
    mesh.geometry.faces[i].normal.z = -1*mesh.geometry.faces[i].normal.z; 
} 

mesh.geometry.computeVertexNormals(); 
mesh.geometry.computeFaceNormals(); 

+1 @WestLangley, schlage ich vor, die Sie nie benutzen negative Skala.

+0

Interessant. Beachten Sie jedoch, dass .flipSided nicht mehr Teil von THREE.js ist. Siehe u/WestLangley Antwort hier: http://stackoverflow.com/questions/19673913/three-js-flipsided-property. – steveOw

+0

Geometrie .__ dirtyVertices & Geometrie .__ dirtyNormals sind ebenfalls veraltet. Siehe https://github.com/mrdoob/three.js/wiki/Updates – Reimund