2013-09-04 1 views
0

J'ai importé mon Object3D comme ceci:Comment définir une texture sur un enfant Object3D Mesh

var globalObject; // this is a global object 

var loader = new THREE.ObjectLoader(); 
loader.load('path/to/object3d.json', function(object) { 
    globalObject = object; 
    scene.add(globalObject); 
}); 

Ce que je veux réaliser est que lorsqu'un utilisateur clique sur un bouton, que certains éléments de maillage de l'objet entier obtenir une texture. Je le fais comme ceci:

// on button click { 
    for(var i in globalObject.children) { 
     // apply to Mesh of interest { 
      var texture = THREE.ImageUtils.loadTexture('path/to/image.jpg'); 
      globalObject.children[i].material = new THREE.MeshLambertMaterial({map: texture, needsUpdate: true}); 
     } // end apply to Mesh of interest 
    } 
} // end on button click 

Le code ci-dessus semble fonctionner jusqu'à définir la texture. Le problème ici est que la texture semble un peu déformée. Il ressemble à ceci http://db.tt/S5VEsByd

Comment corriger ceci, de sorte que la pleine texture s'applique aux deux surfaces?

+0

Il ressemble à votre coordonnées de l'objet de texture ne sont pas correctement définies. Où avez-vous trouvé les objets? Si vous le pouvez, vérifiez les coordonnées de texture de l'objet dans Blender ou le logiciel que vous avez utilisé pour les créer. – GuyGood

+0

ouais, je pensais que quelque chose comme ça est possible. En fait, je ne suis pas un concepteur 3D et j'ai obtenu mon objet d'un designer. Existe-t-il un moyen de réinitialiser les coordonnées de texture à partir de three.js à certaines valeurs par défaut ou ces coeurs peuvent-ils uniquement être vérifiés dans un logiciel qui a été utilisé pour créer l'objet? – STFUn00b

+0

Eh bien, il n'y a pas un moyen dont je suis actuellement au courant. Vous devrez le faire vous-même. Cochez cette réponse ici: https://github.com/mrdoob/three.js/issues/2065#issuecomment-6352320 Il génère un mappage planaire pour toutes les faces du plan X/Y. Vous auriez à faire ceci basé sur faceDirection pour obtenir un déballage automatique. D'où avez-vous obtenu l'obj, n'avez-vous besoin que de 1 obj pour être correct? Vous pouvez également essayer de reconstruire l'obj avec la géométrie standard de three.js qui a des coordonnées de texture correctes. – GuyGood

Répondre

2

Cela devrait faire l'affaire:

// on button click { 
    for(var i in globalObject.children) { 
     // apply to Mesh of interest { 
      var texture = THREE.ImageUtils.loadTexture('path/to/image.jpg'); 
      texture.wrapS = THREE.RepeatWrapping; 
      texture.wrapT = THREE.RepeatWrapping; 
      globalObject.children[i].material = new THREE.MeshLambertMaterial({map: texture, needsUpdate: true}); 
     } // end apply to Mesh of interest 
    } 
} // end on button click 
+0

Ne fonctionne toujours pas. Qu'est-ce qui a un effet sur la façon dont la texture est appliquée à un mesh? Est-il possible qu'un paramètre de mon fichier objet interfère ici? Une photo de plus sur l'apparence de la texture (le cube à l'arrière) et sur l'aspect de mes objets (structure semblable à une table à l'avant): http://db.tt/j3M5Tghe – STFUn00b

+0

Assurez-vous que la texture est [puissance de 2] (http://en.wikipedia.org/wiki/Power_of_two). – mrdoob

Questions connexes