2013-05-29 22 views
5

Ho clonato e poi capovolto un oggetto utilizzando la scala negativa, che causa l'inversione delle mie facce a faccia singola. La mia domanda è, come posso capovolgere anche le normali?Three.js: Come sfogliare le normali dopo la scala negativa

Non voglio usare material.side = THREE.DoubleSide, per ragioni: 1) non ha funzionato correttamente (alcune sfumature sono disegnate dall'interno) e 2) voglio mantenere più prestazioni possibili. Quindi DoubleSide non è un'opzione per me.

Ecco come il mio oggetto se capovolto.

mesh.scale.x = - scale_width; 

Grazie in anticipo!

+0

Ho letto anche la tua risposta a questa domanda e ho pensato a quale altra scelta devo "capovolgere" i miei oggetti rispetto al ridimensionamento negativo? Forse puoi consigliarmi una soluzione migliore rispetto al ridimensionamento negativo? Il mio compito è costruire un oggetto simmetrico: una cornice per un'immagine per una galleria d'arte virtuale. Quindi ho la geometria di un lato del telaio, possono anche variare nella loro forma. Ogni lato del telaio ha due angoli a 45 gradi, rotondi o appuntiti, qualunque sia. Quindi creo un angolo e lo clonò, poi lo ridimensiono negativamente, per ottenere un capovolgimento completo. Qualche suggerimento su come gestirlo senza scala negativa? –

risposta

5

Vorrei consigliare contro la scala negativa per tutta una serie di motivi, come spiegato in questo link: Transforming vertex normals in three.js

È possibile invece applicare un inversione di matrice per la geometria in questo modo

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

Come spiegato in il collegamento, una conseguenza di ciò, tuttavia, è che le facce geometriche non avranno più ordine di avvolgimento in senso antiorario, ma in senso orario.

È possibile attraversare manualmente la geometria e capovolgere l'ordine di avvolgimento di ciascuna faccia. Questo potrebbe funzionare per te, se non hai applicato una texture e non stai usando UV. Se la tua geometria deve essere strutturata, anche gli UV dovranno essere corretti.

In realtà, un'utilità di inversione della geometria sarebbe una bella aggiunta a three.js. Attualmente, ciò che vuoi fare non è supportato dalla libreria.

Three.js r.72

+0

Grazie per la spiegazione, quindi è incoraggiante pensare di implementare questa funzionalità :) –

3

Questa domanda è di due anni, ma nel caso qualcuno passa. Ecco un modo non distruttivo di fare questo:

È possibile accedere alla modalità "sporco vertici/normali", e capovolgere le normali manualmente:

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, vi consiglio di non usare mai scala negativa.

+0

Interessante. Ma nota che .flipSided non fa più parte di THREE.js. Vedi la risposta di WestLangley qui: http://stackoverflow.com/questions/19673913/three-js-flipsided-property. – steveOw

+0

geometry .__ dirtyVertices & geometry .__ dirtyNormals sono anche deprecati. Vedi https://github.com/mrdoob/three.js/wiki/Updates – Reimund