场景描述
场景中有十几个车,每个车上(都有一个相同的name属性)都有一个共同的指示牌,指示牌的属性name都一样。现在想让每辆车的指示牌的颜色都不一样。
解决思路
getElementsByClassName()/getElementsByTagName()/getElementsByName()
接触多了就想threejs是否也提供了一个类似的方法来获取一个集合。
在Object3D中查找方法发现getObjectById()/getObjectByName()/getObjectByProperty()
都是返回的第一个匹配的对象。因此看来需要自己动手来写这个方法了。
解决方法
THREE.Object3D.prototype.getObjectsByTag = function( tag, result ) {
// 检查当前对象
if ( this.userData.tag === tag ) result.push( this );
// 检查子对象
for ( var i = 0, l = this.children.length; i < l; i ++ ) {
var child = this.children[ i ];
child.getObjectsByTag( tag, result );
}
return result;
};
var objects = [];
scene.getObjectsByTag( 'car', objects ); // userData.tag = car的对象