前言
上节讲解了层级模型渲染的数据最终会形成树结构,越复杂的物体相对树的层级也会越深,如果我们想要单个模型节点的属性情况,就要知道如何去获取,本节就来介绍下模型节点。
模型节点
模型有一个name属性,对当前对象进行一个命名,这样我们依旧渲染一个桌子,把每个模型都添加一个name属性:
//设置box1 box2的name名称
box1.name = 'box1';
box2.name = 'box2';
//将box1 box2添加到组对象中
group.add(box1, box2);
//设置group
group.name = 'group';
//将组对象添加到场景中
scene.add(group);
此时每个模型就有对应的名称,有了名称我们就能通过name去查找某个模型对象。
方法
层级模型是树结构,首先我们了解下怎么遍历这树结构,一般我们会用循环,上节提到了模型对象继承于Object3D,Object3D有几种的遍历方法能够快速遍历:
- .traverse:接收一个以模型对象为参数的回调函数,在模型对象及其子对象执行该回调函数。
scene.traverse((obj) => {
console.log(obj.name);
});
- .traverseVisible:参数也是回调,但该方法只对可见的模型对象执行回调函数。
- .traverseAncestors: 对所有的祖先对象执行回调函数。 上面我们提到设置name可以用来查找,我们又学习了遍历方法,两者结合不就可以查找某个name的模型对象,这也是一种方法。Object3D有专门的查找方法,利用这些方法更加简便:
- .getObjectByName:利用name去查找物体中符合该属性的第一个子对象。name默认为空,所以要用name查找的话一定要设置name。
console.log(scene.getObjectByName('box1'));
- .getObjectById:利用id去查找,id一般就是唯一标识,查找起来会比name准确。
- .getObjectByProperty:利用name与value查找,name是属性名称,value就是属性值,返回第一个对象。
- .getObjectsByProperty:返回符合属性名称与属性值所有的子对象。 这些方法跟获取dom很相似,我们可以根据获取dom方法去记忆查找方法。
总结
以上就是模型节点命名、遍历与查找的方法,可以说物体就是由这些数据构成的。