Три js, скрывающие несколько объектов, просто скрывают один объект

#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<

};