Skip to content

层级模型

group 对象&层级模型

创建 group 层级模型

js
const group = new THREE.Group();
const mesh1 = new THREE.Mesh(geometry, material);
const mesh2 = new THREE.Mesh(geometry, material);
// 插入网格模型
group.add(mesh1, mesh2);
// 将 group 插入到场景中
scene.add(group);

查看子对象

js
// 查看 group 子对象: mesh1, mesh2
group.children;
// 查看场景子对象: group, 辅助坐标, 光源等
scene.children;

父对象旋转平移缩放操作, 子对象跟着变化

遍历模型结构

模型命名

js
const mesh = new THREE.Mesh(geometry, material);
const group = new THREE.Group();
group.name = "组";
mesh.name = "网格模型";

递归遍历方法 .traverse()

js
const group1 = new THREE.Group();
const group2 = new THREE.Group();
// ... for循环往 group1, group2中添加 mesh模型并命名
const model = new THREE.Group();
model.add(grouop1, group2);
// 递归遍历 model 包含所有的模型节点
model.traverse((obj) => {
  console.log("所有模型节点的名称", obj.name);
  // obj.isMesh:if判断模型对象 obj 是不是网格模型'Mesh'
  if (obj.isMesh) {
    //判断条件也可以是obj.type === 'Mesh'
    obj.material.color.set(0xffff00);
  }
});

查找某个具体的模型 .getObjectByName()

js
// 返回名.name为"4号楼"对应的对象
const nameNode = scene.getObjectByName("4号楼");
nameNode.material.color.set(0xff0000);

本地坐标和世界坐标

js
// mesh的世界坐标就是 mesh.position 与 group.position的累加
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);
  • 本地坐标: 一个模型的局部坐标
  • 世界坐标: 模型自身的坐标和父对象坐标的累加

1.获取世界坐标 .getWorldPosition()

js
// 声明一个三维向量用来表示某个坐标
const worldPosition = new THREE.Vector3();
// 获取mesh的世界坐标, 并把读取结果存储到参数Vector3中
mesh.getWorldPosition(worldPosition);
console.log("世界坐标", worldPosition);
console.log("本地坐标", mesh.position);

2.给子对象添加局部坐标系

js
//可视化mesh的局部坐标系
const meshAxesHelper = new THREE.AxesHelper(50);
mesh.add(meshAxesHelper);

模型相对局部坐标

移除&隐藏对象

1.移除对象 .remove()

  • 使用

    js
    // 删除父对象的子网格模型
    group.remove(mesh1);
    scene.remove(ambient); //移除场景中的环境光
    scene.remove(model); // 移除场景中模型对象
  • 一次移除多个对象 group.remove(mesh1,mesh2)

2.隐藏对象

  • 模型属性

    js
    mesh.visible = false; // 隐藏一个网格模型,visible的默认值是true
    group.visible = false; // 隐藏一个包含多个模型的组对象group
  • 材质属性

    js
    mesh.material.visible = false;
    // 如果 mesh2和 mesh的.material 指向同一个材质,mesh2也会一起隐藏