2012-07-29 13 views
8

PRoblem: sto cercando di creare (solo per divertimento) una semplice carta da poker (con una carta posteriore e una carta frontale). Ho due immagini diverse, per il fronte e il retro. Ho facilmente creato una geometria piana con una singola trama per entrambi i lati, ma non so davvero come assegnare una trama per un lato e l'altra trama per l'altro lato ... ho provato questo (senza successo :():Come posso inserire due trame diverse sulla parte anteriore e posteriore di un aereo?

var textureBack = new THREE.ImageUtils.loadTexture('images/cardBack.png'); 
var textureFront = new THREE.ImageUtils.loadTexture('images/cardFront.png');  

var material1 = new THREE.MeshBasicMaterial({ map: textureBack }); 
var material2 = new THREE.MeshBasicMaterial({ map: textureFront }); 

var geometry = new THREE.PlaneGeometry(90, 110, 1, 1);    
geometry.faces[ 0 ].materials.push(material1); 
geometry.faces[ 1 ].materials.push(material2); 

var card = new THREE.Mesh(geometry, new THREE.MeshFaceMaterial()); 

alcun aiuto, si prega :)

+0

Una soluzione un po 'più snella sotto, ha richiesto molto tempo quindi ho pensato di condividere! – mattdlockyer

risposta

5

È necessario inserire due geometrie piane back-to-back?.

Innanzitutto, creare una geometria per il fronte.

var geometry1 = new THREE.PlaneGeometry(90, 110, 1, 1); 

Ora creare un'altra geometria per la parte posteriore.

var geometry2 = new THREE.PlaneGeometry(90, 110, 1, 1); 

Spin it 180 gradi.

geometry2.applyMatrix(new THREE.Matrix4().makeRotationY(Math.PI)); 

Dopo aver caricato i materiali, creare le maglie, e aggiungerli come figli di un oggetto "carta".

// textures 
var textureFront = new THREE.ImageUtils.loadTexture('images/cardFront.png');  
var textureBack = new THREE.ImageUtils.loadTexture('images/cardBack.png'); 

// material 
var material1 = new THREE.MeshBasicMaterial({ color: 0xffffff, map: textureFront }); 
var material2 = new THREE.MeshBasicMaterial({ color: 0xffffff, map: textureBack }); 

// card 
card = new THREE.Object3D(); 
scene.add(card); 

// mesh 
mesh1 = new THREE.Mesh(geometry1, material1); 
card.add(mesh1); 
mesh2 = new THREE.Mesh(geometry2, material2); 
card.add(mesh2); 

Ti divertirai con questo se usi WebGLRenderer.

Fiddle: http://jsfiddle.net/mdAb7/11/

Aggiornato per Three.js r.69

+0

Oh !!! Grazie mille!!!! ci proverò :)) – user1561017

+0

Ok! ho provato la prima soluzione, e ha funzionato !!!! molte molte grazie :) un punto (forse può evitare di perdere tempo per qualcuno ...): il pezzo di codice "geometry1.applyMatrix (new THREE.Matrix4(). makeRotationX (Math.PI/2)); " non funzionano, perché il nome del metodo per effettuare una rotazione, sebbene nella documentazione sia 'makeRotationX', è 'setRotationX': D Ora proverò anche la seconda soluzione;) – user1561017

+0

Ho provato il secondo soluzione, e funziona, anche ... ma vedo che con la seconda soluzione tutte le animazioni sono lente ... Comunque, grazie ancora! problema risolto: D – user1561017

5

era alla ricerca di una soluzione senza duplicare tutta la mia geometria.

Qui si va signore e signori ...

var materials = [new THREE.MeshBasicMaterial({map: texture, side: THREE.FrontSide}), 
       new THREE.MeshBasicMaterial({map: textureBack, side: THREE.BackSide})]; 

var geometry = new THREE.PlaneGeometry(width, height); 

for (var i = 0, len = geometry.faces.length; i < len; i++) { 
    var face = geometry.faces[i].clone(); 
    face.materialIndex = 1; 
    geometry.faces.push(face); 
    geometry.faceVertexUvs[0].push(geometry.faceVertexUvs[0][i].slice(0)); 
} 

scene.add(new THREE.Mesh(geometry, new THREE.MeshFaceMaterial(materials))); 

BOOM un fronte aereo Due per ya, il ciclo funziona anche con geometrie con più facce, replicando ogni faccia e applicando la texture Backside ad esso.

Divertiti!

+0

potresti aiutarmi a capovolgere la trama? c'è un effetto specchio –

+0

Devi attraversare gli UV e girarli. Trasforma temporaneamente la tua oggetto geometrico in una variabile globale e poi esegui la tua app. In Chrome, usa la console javascript e digita il nome della variabile dell'oggetto geometry (ora globale) e attraversa il suo contenuto. Dovresti vedere le coordinate UV della texture memorizzate lì, capovolgere il loro ordine nel modo in cui vorresti vedere apparire la tua texture. – mattdlockyer

+0

Questo va bene per un oggetto geometrico dinamico (ad esempio un piano a sbalzo) poiché è necessario aggiornare solo 1 geometria. Il problema del mirroring può essere evitato usando questa soluzione con un file di immagine speculare come input per il retro del piano. Ma per una semplice bandiera, ad es. Le stelle e le strisce che usano semplicemente "DoubleSide" funzionano bene. – steveOw

Problemi correlati