2012-08-17 23 views
5

En Three.js, si tengo varias llamadas a la JSONLoader para cargar varios objetos de este tipo (ejemplo simplificado):Three.js JSONLoader

function init() {  
    var loader = new THREE.JSONLoader();  
    loader.load("mesh1.js", createScene);  
    loader.load("mesh2.js", createScene); 
}  

function createScene(geometry) {  
    if (geometry.filename == "mesh1.js") {  
    mesh1 = new THREE.Mesh(geometry, material); 
    scene.add(mesh1);  
    } else if (geometry.filename == "mesh2.js") {  
    mesh2 = new THREE.Mesh(geometry, material); 
    scene.add(mesh2); 
    } 
} 

¿Cómo puedo determinar qué malla ha sido devuelta a la devolución de llamada , especialmente cuando con frecuencia llegan fuera de servicio?

Estoy tratando de manejar múltiples mallas devueltas con una sola función de devolución de llamada genérica. ¿Hay alguna propiedad en la geometría devuelta que indique el nombre del archivo original con el que puedo probar?

¿O tal vez hay una manera más elegante? Quizás la creación de un nuevo objeto THREE.JSONLoader para cada llamada ayudaría a la función de devolución de llamada a determinar qué malla ha llegado.

Agradezco cualquier ayuda/ideas! ¡Gracias!

Respuesta

7

bien, hay una manera más genérica de lo que WestLangley propone.

loader.load("mesh1.js", meshloader("mesh1.js")); 
loader.load("mesh2.js", meshloader("mesh2.js")); 

continuación

function meshloader(fileName){ 
    return function(geometry){ 
     ... 
    } 
} 

De esta manera, se puede añadir un identificador para cada archivo cargado.

+0

fantástico ... Pude hacer que esto funcionara. Nunca pensé devolver una función dentro de una función. Tengo mucha curiosidad sobre qué es exactamente lo que está pasando aquí ... ¿Podrían explicarme un poco cómo/por qué funciona esto o señalarme una documentación? – Dev

+4

@Dev Esto es lo que se llama un [cierre] (https://developer.mozilla.org/en-US/docs/JavaScript/Guide/Closures). Cuando 'meshloader (" mesh1.js ")' se pasa como un argumento, se ejecuta directamente (debido a la presencia de paréntesis). Cuando se ejecuta, devuelve otra función. Por lo tanto, es exactamente como si pasara la función anónima 'función (geometría) {...}' como argumento, con la excepción de que esta función anónima se ejecutará como una devolución de llamada en un contexto donde la variable 'nombredearchivo' está definida y tiene el value '" mesh1.js "'. – Pioul

0

¿Qué tal algo así?

loader.load("mesh1.js", function(geometry) { createScene(geometry, 1) }); 
loader.load("mesh2.js", function(geometry) { createScene(geometry, 2) }); 

Entonces,

function createScene(geometry, id) { 
... 
} 

El id puede ser el nombre de malla si prefiere que.

+0

Ah, he estado en este camino ... seguro que funciona con una constante, como "1" o "2" pero el problema parece ser que cuando "1" y "2" son reemplazados por una variable, diga "x", la variable se evalúa solo * después * devuelve la devolución de llamada. Parece que no puedo encontrar una forma de pasar una variable a createScene con un valor determinado antes de que loader.load se llame ... ¿tiene sentido? problema de alcance? problema temporal? – Dev

+0

Esta es una respuesta a tu pregunta. Ahora estás haciendo una pregunta diferente. Quizás puedas publicar un nuevo problema. – WestLangley