2015-08-09 9 views
1

Я пытаюсь получить доступ к дочернему объекту sole в сцене. Я могу получить доступ к var sole внутри функции загрузчика, используя obj, но мне нужно получить доступ к нему из-за пределов функции загрузчика.Three.js - доступ к дочернему объекту в сцене

Here's the working code и here's the json model file.

я могу получить доступ к нему внутри погрузчика, например:

var loader = new THREE.ObjectLoader(); 
loader.load("models/shoe4.json", function (obj) { 
    scene.add (obj); 
    scene.rotation.y = Math.PI/1; 
    scene.position.y = -5; 
    scene.position.z = -24; 

    var sole = obj.getObjectByName("sole", true); 
    sole.position.y = -5; 

}); 

Но мне нужно сделать что-то вроде этого:

var loader = new THREE.ObjectLoader(); 
loader.load("models/shoe4.json", function (obj) { 
    scene.add (obj); 
    scene.rotation.y = Math.PI/1; 
    scene.position.y = -5; 
    scene.position.z = -24;  
}); 

var sole = obj.getObjectByName("sole", true); 
sole.position.y = -5; 

В принципе мне нужно поставить его свою собственную функцию для последующего использования использовать.

Я также попытался

var sole = scene.getObjectByName("sole", true); 
sole.position.y = -5; 

Который дал мне ошибку:

Uncaught TypeError: Cannot read property ' getObjectByName ' of undefined

Как получить доступ к объекту sole из любой точки мира? Просто объявление var obj, не работает.

+0

Вы пытались _define_ 'sole' вне функция загрузчика, но _assign_ внутри функции загрузчика? – Passerby

+0

Да. У меня есть куча vars в первой строке 'var sole, obj'etc, но если я попытаюсь получить доступ к' sole = obj.getObjectByName ("sole", true); 'из-за пределов функции загрузчика я все еще получаю ошибку 'Uncaught TypeError: Невозможно прочитать свойство 'getObjectByName' неопределенного'. Кажется странным, можно подумать, что это должно работать отлично. –

+0

@AgenZebra Нет, попробуйте ** назначить ** 'sole' _inside_ функцию загрузчика, а не снаружи. – Passerby

ответ

3

Сначала вы объявляете sole вне сферы действия лямбда-функции, например:

var sole = null; 
var loader = new THREE.ObjectLoader(); 
loader.load("models/shoe4.json", function (obj) { 
    scene.add (obj); 
    scene.rotation.y = Math.PI/1; 
    scene.position.y = -5; 
    scene.position.z = -24; 

    sole = obj.getObjectByName("sole", true); 
    sole.position.y = -5; 

}); 

// this will FAIL because sole is undefined when this line of code executes 
sole.position.x = 5; 

Во-вторых, программа не должна получить доступ к sole до после функция лямбда фактически выполняется. Если вы не знакомы с асинхронным (или событийного) модель программирования, то вы должны сделать немного читать об этом:

http://code.tutsplus.com/tutorials/event-based-programming-what-async-has-over-sync--net-30027

https://msdn.microsoft.com/en-us/library/windows/apps/Hh700330.aspx

+0

Do'h, получилось, огромное спасибо: D –