2015-08-09 207 views
1

我试图访问场景中的子对象sole。我可以使用obj访问加载函数中的var sole,但我需要从加载函数外部访问它。Three.js - 访问场景中的子对象

Here's the working codehere'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

是的。我在第一行'var sole,obj'etc有一堆变量,但是如果我尝试从loader函数的外部访问'sole = obj.getObjectByName(“sole”,true);',我仍然得到错误'Uncaught TypeError:无法读取未定义的属性'getObjectByName'。似乎很奇怪,人们会认为这应该是完美的。 –

+0

@AgenZebra不,尝试**分配**'唯一'_嵌入加载函数,而不是外部。 – Passerby

回答

3

首先声明sole lambda函数的范围之外,这样的:

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直到后实际执行的lambda函数。如果你不熟悉的异步(或事件驱动)编程模型,那么你应该做一个小小的阅读一下:

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 –