2012-07-29 9 views
8

PRoblem: staram się stworzyć (tylko dla zabawy) prostą kartę pokerową (z kartą i frontem karty). Mam dwa różne obrazy, z tyłu iz przodu. Z łatwością utworzyłem geometrię Płaszczyzny z pojedynczą teksturą dla obu stron, ale naprawdę nie wiem, jak przypisać teksturę dla boku, a inną teksturę dla drugiej strony ... Próbowałem tego (bez powodzenia :():Jak umieścić dwie różne tekstury z przodu iz tyłu samolotu?

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

jakiejkolwiek pomocy, proszę :)

+0

Nieco szczuplejsze rozwiązanie poniżej, zajęło dużo czasu, więc pomyślałem, że się podzielę! – mattdlockyer

Odpowiedz

5

trzeba umieścić dwie geometrie samolot z powrotem do tyłu?.

Najpierw utwórz geometrię z przodu.

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

Teraz utwórz kolejną geometrię z tyłu.

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

Obróć o 180 stopni.

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

Po załadowaniu materiałów utwórz siatki i dodaj je jako elementy potomne obiektu "karty".

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

Będziesz mieć łatwiejszy czas z tym jeśli użyjesz WebGLRenderer.

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

Aktualizacja do Three.js r.69

+0

Oh !!! Dziękuję bardzo!!!! Spróbuję tego :)) – user1561017

+0

OK! próbowałem pierwszego rozwiązania i działało !!!! wiele podziękowań :) jeden punkt (być może uda się uniknąć marnowania czasu dla kogoś ...): fragment kodu "geometry1.applyMatrix (nowe TRZY. Matrix4(). makeRotationX (Math.PI/2)); " nie działają, ponieważ nazwa metody do wykonania obrotu, chociaż w dokumentacji jest "makeRotationX", jest "setRotationX": D Teraz spróbuję drugiego rozwiązania;) – user1561017

+0

Próbowałem drugi rozwiązanie, i to też działa ... ale widzę, że przy drugim rozwiązaniu wszystkie animacje są powolne ... W każdym razie, dziękuję jeszcze raz! problem rozwiązany: D – user1561017

5

szukał rozwiązania nie powielając całe geometrię.

Proszę bardzo panie i panowie ...

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 Two Faced samolot dla ciebie, pętla będzie również współpracować z geometrii z większej powierzchni, replikacji każdą twarz i stosowania teksturę Backside do niego.

Ciesz się!

+0

czy możesz mi pomóc odwrócić teksturę? jest efekt lustra –

+0

Musisz przejść przez UV i odwrócić je. Ustaw tymczasowo obiekt geometrii jako zmienną globalną, a następnie uruchom aplikację. W Chrome użyj konsoli javascript i wpisz nazwę zmiennej obiektu geometrii (obecnie globalnej) i przechodź przez jej zawartość. Powinieneś zobaczyć zapisane tam współrzędne UV tekstury, odwrócić ich kolejność w taki sposób, w jaki chcesz zobaczyć twoją teksturę. – mattdlockyer

+0

Jest to dobre dla obiektu dynamicznej geometrii (na przykład płaszczyzny trzepnięcia), ponieważ wystarczy zaktualizować tylko 1 geometrię. Problem dublowania można uniknąć, używając tego rozwiązania z plikiem obrazu lustrzanego jako danych wejściowych dla tylnej strony płaszczyzny. Ale dla prostej flagi, np. Stars & Stripes używające "DoubleSide" działają dobrze. – steveOw

Powiązane problemy