2015-08-10 1 views
1

Je suis nouveau sur THREE.js en provenance d'un arrière-plan AS3/Away3D. J'essaye de créer une classe d'objet personnalisée qui étend THREE.Object3D pour l'ajouter à ma scène. CustomObject encapsulera beaucoup de propriétés et de méthodes comportementales. Idéalement, je voudrais passer chaque objet de données propre à CustomObject, ce qui va déterminer son aspect, son déplacement et son comportement. Encapsuler ce code gardera mon main.js beaucoup plus propre.Création d'une classe Object3D personnalisée

Mon problème est que je n'arrive pas à ajouter une instance de la classe directement à ma scène. Je ne peux ajouter le maillage que via la méthode CustomObject.getMesh(). Est-il possible d'ajouter une instance de la classe directement à ma scène pour rendre? Voici une très basique tentative, je l'ai mis en place de ce que je suis en mesure de trouver en ligne et dans le répertoire/src:

function CustomObject(){ 

    THREE.Object3D.call(this); 
    this.type = 'CustomObject'; 
    this.geometry = new THREE.BoxGeometry(540, 540, 14); 
    this.mesh = new THREE.Mesh(this.geometry, new THREE.MeshLambertMaterial({ color: 0xff0000 })); 
} 

CustomObject.prototype = Object.create(THREE.Object3D.prototype); 
CustomObject.prototype.constructor = THREE.Object3D; 

CustomObject.prototype.getMesh = function(){ 

    return this.mesh; 

} 

Je voudrais pouvoir ajouter la classe CustomObject directement sur la scène pour rendre la gestion des objets beaucoup plus propre. Quelqu'un peut-il me dire comment cela est réalisable s'il vous plaît?

Merci beaucoup d'avance!

David

Répondre

5

Si vous souhaitez ajouter votre objet personnalisé sur la scène directement, vous pouvez utiliser un modèle comme celui-ci:

function CustomObject() { 

    this.type = 'CustomObject'; 

    this.geometry = new THREE.BoxGeometry(540, 540, 14); 
    this.material = new THREE.MeshLambertMaterial({ color: 0xff0000 }); 

    THREE.Mesh.call(this, this.geometry, this.material); 

} 

CustomObject.prototype = Object.create(THREE.Mesh.prototype); 
CustomObject.prototype.constructor = CustomObject; 

CustomObject.prototype.getMesh = function() { 

    return this.mesh; 

} 

var foo = new CustomObject(); 
scene.add(foo); 

Three.js R.71

+0

Merci WestLangley! Fonctionne parfaitement et prend tout son sens. J'étais proche de l'approche alternative, mais ça fonctionne très bien maintenant. À votre santé! –

+0

Quelle solution avez-vous choisi? – WestLangley

+0

Ah ok, j'ai accepté maintenant, désolé pour ça. J'ai utilisé la première approche car la deuxième approche m'a lancé cette erreur 'Uncaught TypeError: Impossible de lire la propriété' length 'de undefined', que je n'ai pas pu résoudre. C'était la façon dont j'essayais de le faire avant. Mais la première approche que vous avez proposée fonctionne bien, donc je m'en tiendrai là pour l'instant. Merci encore pour votre aide! –