首页 > 其他分享 >three.js教程4-层级模型

three.js教程4-层级模型

时间:2023-02-08 21:14:15浏览次数:64  
标签:层级 group 对象 模型 three js add mesh const

1、组对象Group、层级模型-形成树状结构

//创建两个网格模型mesh1、mesh2
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);
//把mesh1型插入到组group中,mesh1作为group的子对象
group.add(mesh1);
//把mesh2型插入到组group中,mesh2作为group的子对象
group.add(mesh2);
//把group插入到场景中作为场景子对象
scene.add(group);

分组group对象作用:方便将大量模型按业务逻辑进行分组和结构化,方便统一对模型进行修改和操作。

(1) 添加对象-add()方法

通过add方法把多个模型设置为组对象group的子对象children中。

 

物体对象Object3D和组对象Group,通常都用来当父节点使用,可把两者画等号。

场景对象Scene、组对象Group的.add()方法都是继承自它们共同的基类Object3D。

父对象旋转缩放平移变换,子对象跟着变化。mesh也能添加mesh子对象。

(2)访问子对象-children属性

console.log('查看group的子对象',group.children);

(3)移除对象.remove()

// 删除父对象group的子对象网格模型mesh1
group.remove(mesh1,mesh2);

scene.remove(ambient);//移除场景中环境光
scene.remove(model);//移除场景中模型对象

 (4) 隐藏或显示-visible属性

mesh.visible =false;// 隐藏一个网格模型,visible的默认值是true
group.visible =false;// 隐藏一个包含多个模型的组对象group
mesh.visible =true;// 使网格模型mesh处于显示状态

注意,这4个属性或方法,都是从object3D继承过来的。

2、递归遍历模型树结构、查询模型节点

(1)name属性

层级模型中可以给一些模型对象通过.name属性命名进行标记。

下面是通过代码创建了一个层级模型,一般实际开发的时候,会加载外部的模型,然后从模型对象通过节点的名称.name查找某个子对象。

(2)递归遍历方法.traverse()

Threejs层级模型就是一个树结构,可以通过递归遍历的算法去遍历Threejs一个模型对象包含的所有后代。

// 递归遍历model包含所有的模型节点
model.traverse(function(obj) {
    console.log('所有模型节点的名称',obj.name);
    // obj.isMesh:if判断模型对象obj是不是网格模型'Mesh'
    if (obj.isMesh) {//判断条件也可以是obj.type === 'Mesh'
        obj.material.color.set(0xffff00);
    }
});

(3)查找某个模型.getObjectByName()

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

3、本地(局部)坐标和世界坐标

模型的本地坐标(局部坐标),就是模型的.position属性。

模型的世界坐标,是模型自身.position和所有父对象.position累加的坐标。

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

// 声明一个三维向量用来表示某个坐标
const worldPosition = new THREE.Vector3();
// 获取mesh的世界坐标,你会发现mesh的世界坐标受到父对象group的.position影响
mesh.getWorldPosition(worldPosition);
console.log('世界坐标',worldPosition);
console.log('本地坐标',mesh.position);

(2)给子对象添加一个局部坐标系

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

 

 文章中部分素材选取自Threejs中文网:http://www.webgl3d.cn/

标签:层级,group,对象,模型,three,js,add,mesh,const
From: https://www.cnblogs.com/tiandi/p/17073026.html

相关文章

  • 结构体与json
    json是js中的数据表示方法,后面为了标准,同时json也很方便就前后端都在使用把结构体转换为json格式字符串序列化packagemainimport("encoding/json""fmt")t......
  • three.js教程3-模型对象、材质
    1、Object3D的position和scale是三维向量Vector3因此模型的位置和缩放等变化,也是使用Vector3的属性和方法实现,查询文档Vector3。三维向量Vector3有xyz三个分量,查看three.......
  • C# Newtonsoft.Json null 转空值{} 把对象null转换{}为JSON字符串
    ///<summary>///把对象null转换{}为JSON字符串///</summary>///<paramname="o">对象</param>///<returns>JSON字符串</return......
  • js实现简单倒计时
    <!DOCTYPEhtml><html><head><metacharset="utf-8"><metaname="viewport"content="width=device-width,initial-scale=1"><title></title></head>......
  • 前端面试题(1) js
    keywords:JS深拷贝深拷贝:针对【引用】类型,传递的是地址,多变量同时指向同一块内存地址(比如某个对象)letobj1={ //1.不需要处理 //基本数据类型可以不做处理,typeof!==......
  • 前端页面分页算法 js+php
    实现效果: 实现思路:通过当前选中页码数值和总页码数量,计算返回结果,以数组的形式返回。遍历数组内容,完成页面渲染。 php算法:/***getNavigatePage**@......
  • 数组的常用方法 js 230208
    判断是否是数组头部操作头部添加头部删除尾部操作未位添加push未位删除pop排序sort方法,接收一个参数,完成排序reverse方法,反转查找indexOflastIndexOf转字符串数组拼字符串字......
  • js实现页面窗口录制
    一、在线demo1、在线demo地址:http://www.lb0125.com/videoRecord.html 注:目前测试发现只有在chrome浏览器里可以使用二、直接上代码<!DOCTYPEhtml><html><head>......
  • JSP概念 原理 脚本
    JSP概念JavaServerPages:java服务端页面可以理解为:一个特殊页面,其中既可以指定定义html标签 有可以定义java代码用于简化书写原理......
  • js中不存在块级作用域 js 230208
    ......