Three.js——七、Group层级模型

news2024/11/24 9:41:15

关于Group

Group 层级模型

通过 THREE.Group 类创建一个组对象 group,然后通过 add 方法把网格模型 mesh1、mesh2 作为设置为组对象 group 的子对象,然后在通过执行 scene.add(group)把组对象 group 作为场景对象的 scene 的子对象。也就是说场景对象是 scene 是 group 的父对象,group 是 mesh1、mesh2 的父对象。

其实就是在场景上面追加了一层画布,可以将模型放在这个画布中,所以形成了三级结构 scene=>group=>mesh1+mesh2

const geometry = new THREE.BoxGeometry(100, 100, 100);
// 材质
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(105);
group.add(mesh1);
group.add(mesh2);
scene.add(group);

效果:请添加图片描述

group.children

可以查看 group 中存在的对象
请添加图片描述

scene.children

查看场景对象的结构
请添加图片描述

场景对象 Scene 的子对象,除了组对象 Group 之外,还可以看到环境光 AmbientLight、平行光 DirectionalLight、辅助坐标对象 AxesHelper。

.add()方法

添加多个场景时,可以简写成

group.add(mesh1, mesh2);

父级 group 旋转平移

如果我们这里让 group 这个父级平移旋转缩放等操作,那么所有的子对象也会同样的跟着改变。

group.translateY(100);

请添加图片描述

Object3D模型对象节点

其实它从某种程度上是和 group 一样的,Object3D 是表示模型节点的意思

const geometry = new THREE.BoxGeometry(100, 100, 100);
// 材质
material = new THREE.MeshLambertMaterial({ color: 0x00ffff });
const mesh1 = new THREE.Mesh(geometry, material); // 创建两个相大小和材质的正方体
const mesh2 = new THREE.Mesh(geometry, material);
mesh2.translateX(105);

// mesh = new THREE.Mesh(geometry, material);
const obj = new THREE.Object3D(); //作为mesh1和mesh2的父对象
obj.add(mesh1, mesh2);
obj.translateY(100);
console.log(obj);
scene.add(obj);

请添加图片描述

模型嵌套模型(mesh 中添加mesh2子对象)

const geometry = new THREE.BoxGeometry(100, 100, 100);
// 材质
material = new THREE.MeshLambertMaterial({ color: 0x00ffff });
const mesh1 = new THREE.Mesh(geometry, material); // 创建两个相大小和材质的正方体
const mesh2 = new THREE.Mesh(geometry, material);
mesh2.translateX(105);
mesh1.add(mesh2);
scene.add(mesh1);

请添加图片描述

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

比如我们可以对层级模型对象起个名字来标记这个模型是做什么的

.name属性

const geometry = new THREE.BoxGeometry(100, 100, 100);
// 材质
material = new THREE.MeshLambertMaterial({ color: 0x00ffff });
group = new THREE.Group();
group.name = "积木房";
const mesh1 = new THREE.Mesh(geometry, material);
mesh1.name = "积木房1层";
const mesh2 = new THREE.Mesh(geometry, material);
mesh2.name = "积木房2层";
mesh2.translateY(101);
group.add(mesh1, mesh2);
scene.add(group);
console.log(group);

请添加图片描述

结构模型设置.name属性

我们在开发的时候,会优先加载外部的模型,之后要对模型上添加标签锕,标点啊等等,就需要批量给子对象设置节点名称
请添加图片描述

看个例子

const group1 = new THREE.Group();
group1.name = "一号楼";
for (let i = 0; i < 5; i++) {
  const geometry = new THREE.BoxGeometry(20, 60, 10);
  const material = new THREE.MeshBasicMaterial({ color: 0x00ffff });
  const mesh = new THREE.Mesh(geometry, material);
  mesh.position.x = i * 30;
  group1.add(mesh);
  mesh.name = i + 1 + "号楼";
}
group1.position.y = 30;

const group2 = new THREE.Group();
group2.name = "二号楼";
for (let i = 0; i < 5; i++) {
  const geometry = new THREE.BoxGeometry(20, 30, 10);
  const material = new THREE.MeshLambertMaterial({
    color: 0x00ff90,
  });
  const mesh = new THREE.Mesh(geometry, material);
  mesh.position.x = i * 30;
  group2.add(mesh);
  mesh.name = i + 6 + "号楼";
}
group2.position.z = 50;
group2.position.y = 15;

const model = new THREE.Group();
model.name = "小区房子";
model.add(group1, group2);
model.position.set(-50, 0, -25);

console.log(model);
scene.add(model);

效果:
请添加图片描述

查看结构:
请添加图片描述

请添加图片描述

traverse方法

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

请添加图片描述

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

.getObjectByName()方法可以通过name获取dom元素

    const nameNode = scene.getObjectByName('6号楼');
    console.log(nameNode);
    nameNode.material.color.set(0xfc2000)

请添加图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/588340.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

计算机底层的密码读书笔记

线程池的理解协程的理解高并发服务器的考量内存管理函数调用与栈影响多线程性能的缓存问题 线程池的理解 重复创建和销毁线程会存在开销&#xff0c;线程过多会消耗大量内存&#xff0c;较多线程之间的切换也存在开销 线程池用来复用线程&#xff0c;控制线程数量 线程池中…

(二)K8S常见集群架构搭建

1.基于KubeAdm搭建多节点K8S集群 安装docker&#xff08;主节点工作节点&#xff09; # 1.安装 Docker CE 的依赖软件包&#xff1a; yum install -y yum-utils device-mapper-persistent-data lvm2# 2.设置阿里云镜像 sudo yum-config-manager --add-repo http://mirrors.al…

【C语言】【典例详解】【刷题】猜名次猜凶手【循环练习】

目录 猜名次问题 典例题目 题目分析&#xff1a; 代码实现&#xff1a; 运行结果&#xff1a; 猜凶手问题 典例题目 题目分析 代码实现&#xff1a; 运行结果&#xff1a; 猜名次问题 典例题目 猜名次&#xff1a; 5位运动员参加了10米台跳水比赛&#xff0c;有人让…

VM虚拟机配置

1、安装环境 1&#xff09;需要安装的软件 2&#xff09;安装vm 3&#xff09;安装centos系统 2、VM虚拟机NAT模式上网设置 1&#xff09;vm虚拟机设置 启动虚拟机选择【虚拟网络编辑器】 选择NAT模式&#xff0c;更改下面的子网IP&#xff0c;改成你需要的任何一个子网…

大数据:诞生大数据,概述、大数据软件生态,Apache Hadoop概述

大数据&#xff1a; 2022找工作是学历、能力和运气的超强结合体&#xff0c;遇到寒冬&#xff0c;大厂不招人&#xff0c;可能很多算法学生都得去找开发&#xff0c;测开 测开的话&#xff0c;你就得学数据库&#xff0c;sql&#xff0c;oracle&#xff0c;尤其sql要学&#x…

专业的 Code 128 条码标签如何创建?

Aspose.Words是一种高级Word文档处理API&#xff0c;用于执行各种文档管理和操作任务。API支持生成&#xff0c;修改&#xff0c;转换&#xff0c;呈现和打印文档&#xff0c;而无需在跨平台应用程序中直接使用Microsoft Word。 Aspose API支持流行文件格式处理&#xff0c;并…

Linux 系统的中断子系统基本框架(一)

中断是大家用的最多的功能&#xff0c;不管是单片机还是 Linux 系统&#xff0c;都需要用到中断&#xff0c;对它的深入理解是非常必要的。 为什么需要中断&#xff1f; 答案&#xff1a;处理器的速度比外设快很多&#xff0c;内核必须要处理其他任务&#xff0c;只有当外设准…

在centos上安装splint

lint lint是最著名的C语言工具之一&#xff0c;是由贝尔实验室SteveJohnson于1979在PCC(PortableC Compiler)基础上开发的静态代码分析&#xff0c;一般由UNIX系统提供。 工具介绍 与大多数C语言编译器相比&#xff0c;lint可以对程序进行更加广泛的错误分析&#xff0c;是一…

Day56【动态规划】583.两个字符串的删除操作、72.编辑距离

583.两个字符串的删除操作 力扣题目链接/文章讲解 视频讲解 1、确定 dp 数组下标及值含义 dp[i][j]&#xff1a;以下标 i 为结尾的字符串 word1&#xff0c;和以下标 j 为结尾的字符串 word2&#xff0c;想要达到相等&#xff0c;所需要删除元素的最少次数为 dp[i][j] 2、…

【1110. 删点成林】

来源&#xff1a;力扣&#xff08;LeetCode&#xff09; 描述&#xff1a; 给出二叉树的根节点 root&#xff0c;树上每个节点都有一个不同的值。 如果节点值在 to_delete 中出现&#xff0c;我们就把该节点从树上删去&#xff0c;最后得到一个森林&#xff08;一些不相交的…

LeetCode——可被三整除的偶数的平均值

#全国科技者工作日—为创新和未来而努力# 目录 1、题目 2、题目解读 3、代码 1、题目 2455. 可被三整除的偶数的平均值 - 力扣&#xff08;Leetcode&#xff09; 给你一个由正整数组成的整数数组 nums &#xff0c;返回其中可被 3 整除的所有偶数的平均值。 注意&#xff…

论文阅读:Directed Greybox Fuzzing

一、论文相关信息 二、现有研究的不足 现有的Greybox模糊器&#xff08;GF&#xff09;无法有效地定向到有问题的更改或补丁、关键系统调用或危险位置、或定向到我们希望重现的已报告漏洞的堆栈跟踪中的函数。 三、知识点 &#xff08;1&#xff09;introduction 定向模糊测试…

第二章(一):Django框架的模型(Model)

系列文章目录 备注&#xff1a;这里是Django系列文章的所有文章的目录 第一章(一) : Django框架如何创建项目、创建应用、创建templates&#xff1b;如何启动django项目&#xff1b; 第一章(二)&#xff1a;Django框架的模式、路由、视图&#xff1b; 第一章(三)&#xff1a;Dj…

learn C++ NO.7——C/C++内存管理

引言 现在是5月30日的正午&#xff0c;图书馆里空空的&#xff0c;也许是大家都在午休&#xff0c;也许是现在37摄氏度的气温。穿着球衣的我已经汗流浃背&#xff0c;今天热火战胜了凯尔特人&#xff0c;闯入决赛。以下克上的勇气也激励着我&#xff0c;在省内垫底的大学中&am…

JS的异或运算XOR

概念 异或&#xff08;xor&#xff09;是一个数学运算符。它应用于逻辑运算。异或的数学符号为“⊕”&#xff0c;计算机符号为“xor”。 两个值相同时&#xff0c;返回false&#xff0c;否则返回true。也就是说&#xff0c;XOR可以用来判断两个值是否不同。 JavaScript 语言…

企业级信息系统开发——Spring Boot加载自定义配置文件

文章目录 一、使用PropertySource加载自定义配置文件&#xff08;一&#xff09;创建Spring Boot Web项目ConfigDemo01&#xff08;二&#xff09;创建自定义配置文件&#xff08;三&#xff09;创建自定义配置类&#xff08;四&#xff09;编写测试方法&#xff08;五&#xf…

一键部署属于自己的ChatGPT-Next-Web

完整功能刚需&#xff1a; OpenAI 注册登录之后给的 api Key GitHub账号 Netlify账号 Tip&#xff1a; 注册 OepenAI账号 需要用国外手机号 这里建议去一些渠道购买账号 十块钱不到如果访问 OpenAI 的话 一定要挂欧美节点 否则禁止IP访问 概率会被封号为什么用 Netlify 托…

测试替身Test Doubles的5类型(Mockito)

测试替身Test Doubles的5类型(Mockito) 我们有一个名为 BankAccount 的类。 数据库用于存储和检索银行帐户信息。 我们想测试 BankAccount 中的逻辑&#xff0c;而不必担心它使用的底层数据库.由此类实现——它将 SQL 查询发送到数据库并返回其中包含的值。 测试替身Test Dou…

SuperMap iDesktopX扩展开发之GPA算子扩展

作者&#xff1a;dongyx SuperMap iDesktopX是超图研究院推出的一款跨平台的桌面GIS软件&#xff0c;兼容Windows和Linux&#xff0c;同时iDesktopX也采用的是插件式扩展开发框架&#xff0c;支持定制开发。 使用iDesktopX定制开发有以下优势&#xff1a; ⚫ 采用 Swing 图形界…

VM虚拟机仿真网络问题

在电子数据取证中&#xff0c;拿到一个镜像需要仿真的时候&#xff0c;经常会遇到网络问题。尤其是Linux服务器镜像&#xff0c;例如centos操作系统的镜像&#xff0c;一般镜像会有固定IP设置&#xff0c;仿真起来后&#xff0c;系统与本机不能建立连接&#xff0c;不能连接互联…