2017-02-22 6 views
1

Как я могу использовать свойство * .name в родительском/дочернем случае при функции перемещения? oLoader.load() является асинхронным. К тому времени, когда я делаю object.traverse(), объект еще не загружен. Как я могу это исправить?getObjectByName в traverse THREE.JS

Это работает:

var geometry = new THREE.SphereGeometry(0.5, 32, 32); 
var material = new THREE.MeshBasicMaterial({color: 0xffff00}); 
var sphere = new THREE.Mesh(geometry, material); 
sphere.name = 'gomb'; 
scene.add(sphere); 

var obj = scene.getObjectByName('gomb'); 
function remove(obj) { 
    scene.remove(obj); 
} 
remove(obj); 

Но это не работает:

var oLoader = new THREE.OBJLoader(); 
oLoader.load('model/0004_02_00_FF_00_xxxxxx_0_00.obj', function (object, materials) { 
    var material_this = new THREE.MeshPhongMaterial({color: 0x00FF00}); 
    object.traverse(function (child) { 
     if (child instanceof THREE.Mesh) { 
      child.material = material_this; 
      child.castShadow = true; 
      child.receiveShadow = true; 
     } 
    }); 

    object.position.x = 0; 
    object.position.y = 0; 
    object.position.z = 0; 
    object.name = '0004_02_00_FF_00_xxxxxx_0_00'; 
    scene.add(object); 
}); 

var obj = scene.getObjectByName('0004_02_00_FF_00_xxxxxx_0_00', true); 
function remove(obj) { 
    scene.remove(obj); 
} 
remove(obj); 
+0

Когда вы вызываете 'remove()', объект может еще не загрузиться. Когда вы вызываете 'traverse()' в обратном вызове загрузчика, объект загружается. – WestLangley

ответ

1

Один Хитрость заключается в том, чтобы немедленно добавить имени родителя к месту, когда вы начнете загрузку вашего объекта и проверить, что родитель все еще существует, когда загрузка заканчивается.

function loadObj(name, url, scene) { 
    var parent = new THREE.Object3D(); 
    parent.name = name; 
    scene.add(parent); 

    var objLoader = new THREE.OBJLoader(); 
    objLoader.load(url, function (object) { 
     var parent = scene.getObjectByName(name); 
     if (parent) { 
      parent.add(object); 
     } 
    }); 
} 

Вы знаете, что можете удалить это событие, если объект загружается.

loadObj('my_object', 'model/0004_02_00_FF_00_xxxxxx_0_00.obj', scene); 
var obj = scene.getObjectByName('my_object'); 
scene.remove(obj); 

Обратите внимание, что для этого требуется знать имя вашего объекта к моменту его загрузки.

+0

этот скрипт работает очень хорошо! большое спасибо – alaprajz