2012-07-29 12 views
8

PRoblem: estoy tratando de crear (solo por diversión) una simple tarjeta de póquer (con una tarjeta hacia atrás y un frente de tarjeta). Tengo dos imágenes diferentes, para la parte posterior y delantera. Creé fácilmente una geometría plana con una sola textura para ambos lados, pero realmente no sé cómo asignar una textura para un lado y la otra textura para el otro lado ... intenté esto (sin éxito :():¿Cómo puedo poner dos texturas diferentes en la parte frontal y posterior de un avión?

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()); 

cualquier ayuda, por favor :)

+0

Una solución un poco más delgada a continuación, tomó mucho tiempo, así que pensé que iba a compartir! – mattdlockyer

Respuesta

5

Es necesario colocar dos geometrías planas de back-to-back?.

Primero, cree una geometría para el frente.

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

Ahora cree otra geometría para la parte posterior.

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

Girar 180 grados.

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

Después de cargar los materiales, cree las mallas y añádalas como elementos secundarios de un objeto "tarjeta".

// 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); 

Tendrá un tiempo más fácil con esto si usa WebGLRenderer.

violín: http://jsfiddle.net/mdAb7/11/

Actualizado a Three.js R.69

+0

¡¡¡Oh !!! ¡¡¡¡Muchas gracias!!!! Lo intentaré :)) – user1561017

+0

Ok! ¡He probado la primera solución y funcionó! muchas muchas gracias :) un punto (tal vez puede evitar perder tiempo para alguien ...): la pieza del código "geometry1.applyMatrix (new THREE.Matrix4(). makeRotationX (Math.PI/2)); " no funciona, porque el nombre del método para hacer una rotación, aunque en la documentación es 'makeRotationX', es 'setRotationX': D Ahora voy a probar la segunda solución, también;) – user1561017

+0

Probé la segunda solución, y funciona, también ... pero veo que con la segunda solución todas las animaciones son lentas ... De todos modos, gracias de nuevo! problema resuelto: D – user1561017

5

estaba buscando una solución sin duplicar todo mi geometría.

Aquí tienes damas y caballeros ...

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 avión se enfrentó a dos para ti, el bucle también trabajará con geometrías con más caras, replicando cada cara y aplicar la textura del lado posterior a la misma.

¡Disfrútalo!

+0

¿Podrías por favor ayudarme a cambiar la textura? hay un efecto espejo –

+0

Tienes que pasar por los UV y voltearlos. Haga que su objeto de geometría sea una variable global temporalmente y luego ejecute su aplicación. En Chrome use la consola de JavaScript y escriba el nombre de la variable del objeto de geometría (ahora global) y recorra sus contenidos. Debería ver las coordenadas de texturas UV almacenadas allí, voltear su orden de la manera en que le gustaría ver aparecer su textura. – mattdlockyer

+0

Esto es bueno para un objeto de geometría dinámica (por ejemplo, un plano de aleteo) ya que solo tiene que actualizar 1 geometría. El problema de duplicación se puede evitar utilizando esta solución con un archivo de imagen reflejado como entrada para el lado posterior del avión. Pero para una simple bandera, p. Stars & Stripes simplemente usa "DoubleSide" funciona bien. – steveOw

Cuestiones relacionadas