#javascript #debugging #three.js #rendering
#javascript #отладка #three.js #рендеринг
Вопрос:
Я столкнулся с проблемой, когда я задавал имя своих объектов light light.name = 'globalLight'
и создавал переменную, которая является lightGlobal = scene.getObjectByName('globalLight');
но когда я попытался скрыть использование lightGlobal.visible = false;
, это было просто позволить другому свету не скрываться, зеленый — это light0
, а синий — это light1
пример рендеринга, пример рендеринга изображения, проблема скриншот
Как вы можете видеть, синий индикатор исчез, но зеленый не будет скрываться
Мой код :
ambient = new THREE.AmbientLight( 0x404040 );
scene.add( ambient );
lightCam = new THREE.DirectionalLight( 0xffffff, 1.0 );
light0 = new THREE.PointLight( 0x0000ff, 1.0 );
light0.position.set( 4.0, 4.0, 4.0 );
light0.castShadow = true;
light0.name = "globalLight";
light1 = new THREE.PointLight( 0x00ff00, 1.0 );
light1.position.set( 4.0, 4.0, -4.0 );
light1.castShadow = true;
light1.name = "globalLight";
scene.add( light0, light1 );
globalLight = scene.getObjectByName( "globalLight", true );
globalLight.visible = false;
Ответ №1:
Object3D.name
должно быть уникальным. Следовательно, присвоение имен двум источникам света одинаковым образом не поддерживается. Object3D.getObjectByName()
вернет первый объект, который соответствует заданному имени.
Одним из решений этой проблемы является использование Object3D.userData
и определение пользовательского свойства, такого как:
light0.userData.tag = 'globalLight';
Затем вы можете рассмотреть возможность улучшения Object3D
с помощью следующего метода:
THREE.Object3D.prototype.getObjectsByTag = function( tag, result ) {
// check the current object
if ( this.userData.tag === tag ) result.push( this );
// check children
for ( let i = 0, l = this.children.length; i < l; i ) {
const child = this.children[ i ];
child.getObjectsByTag( tag, result );
}
return resu<
};