Group层级模型
const geometry = new THREE.BoxGeometry(20, 20, 20);
const material = new THREE.MeshLambertMaterial({color: 0x00ffff});
const group = new THREE.Group();
const mesh1 = new THREE.Mesh(geometry, material);
const mesh2 = new THREE.Mesh(geometry, material);
mesh2.translateX(25);
group.add(mesh1);
group.add(mesh2);
scene.add(group);
### 查看子对象`.children`
console.log('查看group的子对象',group.children);
### 父对象旋转缩放平移变换,子对象跟着变化
### 受threejs历史影响,你会在很多别的代码中看到`Object3D`作为`Group`来使用,如果看到不用奇怪。某种程度上,你可把两者画等号,只是`Group`更加语义化,Object3D本身就是表示模型节点的意思。
const mesh1 = new THREE.Mesh(geometry, material);
const mesh2 = new THREE.Mesh(geometry, material);
const obj = new THREE.Object3D();
obj.add(mesh1,mesh2);
便利模型树结构,查询模型树节点
### 模型命名(`.name`属性)
const group = new THREE.Group();
group.name='小区房子';
const mesh = new THREE.Mesh(geometry, material);
mesh.name='一号楼';
### 递归遍历方法`.traverse()`
model.traverse(function(obj) {
console.log('所有模型节点的名称',obj.name);
if (obj.isMesh) {
obj.material.color.set(0xffff00);
}
});
### 查找某个具体的模型`.getObjectByName()`
const nameNode = scene.getObjectByName ("4号楼");
nameNode.material.color.set(0xff0000);
本地坐标和世界坐标
const mesh = new THREE.Mesh(geometry, material);
mesh.position.set(50, 0, 0);
const group = new THREE.Group();
group.add(mesh);
group.position.set(50, 0, 0);
任何一个模型的**本地坐标**(**局部坐标**)就是模型的`.position`属性。
一个模型的**世界坐标**,说的是,模型自身`.position`和所有父对象`.position`累加的坐标。
.getWorldPosition()获取世界坐标
const worldPosition = new THREE.Vector3();
mesh.getWorldPosition(worldPosition);
console.log('世界坐标',worldPosition);
console.log('本地坐标',mesh.position);
给子对象添加一个局部坐标系
const meshAxesHelper = new THREE.AxesHelper(50);
mesh.add(meshAxesHelper);
改变模型相对局部坐标原点位置
const geometry = new THREE.BoxGeometry(50, 50, 50);
geometry.translate(50/2,0,0,);;
局部坐标相对模型发生改变,旋转轴自然也会发生变化。
mesh.rotateY(Math.PI/3);
group.remove(mesh1);
模型隐藏或显示
### 模型属性`.visible`
mesh.visible =false;
group.visible =false;
### 材质属性`.visible`
mesh.material.visible =false;