如何解决三个js隐藏多个对象只是隐藏单个对象
设置光源对象名称light.name = 'globalLight'
并创建lightGlobal = scene.getObjectByName('globalLight');
变量时遇到了问题,但是当我尝试使用lightGlobal.visible = false;
隐藏时,只是让另一盏灯没有隐藏绿色的light0
和蓝色的light1
渲染示例The rendered image example
问题screenshot
您可以看到蓝灯消失了,而绿灯不会隐藏
我的代码:
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 );
light1.castShadow = true;
light1.name = "globalLight";
scene.add( light0,light1 );
globalLight = scene.getObjectByName( "globalLight",true );
globalLight.visible = false;
解决方法
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 result;
};
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。