Je crée un cube et j'applique 6 textures différentes à chacune de ses faces. Chaque texture est un fichier .png et contient des parties transparentes. J'applique également une couleur au cube - je veux voir cette couleur à travers la transparence png.
Problème: la transparence est rendue en blanc, je ne peux donc pas voir la couleur de base du cube (ce qui est correct si je supprime la texture png)
Comment puis-je faire fonctionner la transparence png? J'ai essayé de jouer avec certains paramètres matériels mais aucun ne le rend transparent.
Code pour créer le cube et les matériaux:
var geometry = new THREE.CubeGeometry(150, 200, 150, 2, 2, 2);
var materials = [];
// create textures array for all cube sides
for (var i = 1; i < 7; i++) {
var img = new Image();
img.src = 'img/s' + i + '.png';
var tex = new THREE.Texture(img);
img.tex = tex;
img.onload = function () {
this.tex.needsUpdate = true;
};
var mat = new THREE.MeshBasicMaterial({color: 0x00ff00, map: tex, transparent: true, overdraw: true });
materials.Push(mat);
}
cube = new THREE.Mesh(geometry, new THREE.MeshFaceMaterial(materials));
cube.position.y = 150;
scene.add(cube);
MODIFIER:
L'image ci-dessous montre le problème - avec la solution Senthanal, la texture de gauche est maintenant correcte - c'est une image png sans transparence - J'ai défini la transparence dans le code avec
materialArray.Push(new THREE.MeshBasicMaterial({ map: THREE.ImageUtils.loadTexture('img/s2.png'), transparent: true, opacity: 0.9, color: 0xFF0000 }));
La bonne texture est également une image png - seulement qu'elle a une zone transparente (tout ce qui rend le blanc doit être rouge pur car il est transparent et doit prendre la couleur du cube?). Comment puis-je rendre cette partie blanche transparente?
l'attribut d'opacité du matériau fait l'affaire pour vous. Suit, exemple d'extrait de code:
var materialArray = [];
materialArray.Push(new THREE.MeshBasicMaterial( { map: THREE.ImageUtils.loadTexture( 'images/xpos.png' ), transparent: true, opacity: 0.5, color: 0xFF0000 }));
materialArray.Push(new THREE.MeshBasicMaterial( { map: THREE.ImageUtils.loadTexture( 'images/xneg.png' ), transparent: true, opacity: 0.5, color: 0xFF0000 }));
materialArray.Push(new THREE.MeshBasicMaterial( { map: THREE.ImageUtils.loadTexture( 'images/ypos.png' ), transparent: true, opacity: 0.5, color: 0xFF0000 }));
materialArray.Push(new THREE.MeshBasicMaterial( { map: THREE.ImageUtils.loadTexture( 'images/yneg.png' ), transparent: true, opacity: 0.5, color: 0xFF0000 }));
materialArray.Push(new THREE.MeshBasicMaterial( { map: THREE.ImageUtils.loadTexture( 'images/zpos.png' ), transparent: true, opacity: 0.5, color: 0xFF0000 }));
materialArray.Push(new THREE.MeshBasicMaterial( { map: THREE.ImageUtils.loadTexture( 'images/zneg.png' ), transparent: true, opacity: 0.5, color: 0xFF0000 }));
var MovingCubeMat = new THREE.MeshFaceMaterial(materialArray);
var MovingCubeGeom = new THREE.CubeGeometry( 50, 50, 50, 1, 1, 1, materialArray );
MovingCube = new THREE.Mesh( MovingCubeGeom, MovingCubeMat );
MovingCube.position.set(0, 25.1, 0);
scene.add( MovingCube );
http://threejs.org/docs/#Reference/Materials/Material La clé est de définir l'attribut transparent true et de définir l'opacité à 0,5 (par exemple). Ajoutez le second cube qui s'intègre exactement sans transparence, idée de @WestLangley ( rendu de toile Three.js et transparence )
backCube = new THREE.Mesh( MovingCubeGeom, new THREE.MeshBasicMaterial( { color: 0xFF0000 }) );
backCube.position.set(0, 25.1, 0);
backCube.scale.set( 0.99, 0.99, 0.99 );
scene.add( backCube );