【Three.js】知识梳理九:Three.js层级模型

2024-06-12 12:04

本文主要是介绍【Three.js】知识梳理九:Three.js层级模型,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

1. Object3D和Group

1.1 Object3D

Object3D是Three.js中所有3D对象的基类。它为我们提供了一个通用的结构,包括位置、旋转、缩放等变换属性,以及子对象的组织和管理功能。无论是网格(Mesh)、光源(Light)还是其他类型的对象,它们都继承自Object3D

1.11 创建Object3D实例

创建一个Object3D实例非常简单:

import * as THREE from 'three';
​
const obj = new THREE.Object3D();

1.2 Group

Group类继承自Object3D,并添加了对子对象的分组功能。通过使用Group,我们可以更轻松地管理场景中的对象,例如对一组对象进行批量操作,或对对象进行层级组织。

1.21 创建Group实例

创建一个Group实例同样非常简单:

import * as THREE from 'three';
​
const group = new THREE.Group();

1.22 .add()向Group添加对象

由于Group继承自Object3D,因此您可以像处理普通Object3D对象一样添加和移除子对象。以下是一个向Group中添加立方体和球体的示例:

import * as THREE from 'three';
​
const scene = new THREE.Scene();
const group = new THREE.Group();
​
// 创建并添加一个立方体到Group中
const cubeGeometry = new THREE.BoxGeometry(1, 1, 1);
const cubeMaterial = new THREE.MeshBasicMaterial({color: 0x00ff00});
const cube = new THREE.Mesh(cubeGeometry, cubeMaterial);
group.add(cube);
​
// 创建并添加一个球体到Group中
const sphereGeometry = new THREE.SphereGeometry(1, 32, 32);
const sphereMaterial = new THREE.MeshBasicMaterial({color: 0xff0000});
const sphere = new THREE.Mesh(sphereGeometry, sphereMaterial);
group.add(sphere);
​
// 将Group添加到场景中
scene.add(group);

1.23 .remove()移除Group中对象

.remove()方法和.add()方法是相反的,是把子对象从父对象的.children()属性中删除。

// 删除父对象group的子对象网格模型mesh1
group.remove(mesh1);
// 通过浏览器控制台查看.children()属性的变化。
console.log('查看group的子对象',group.children);
​
// 一次移除多个子对象
group.remove(mesh1,mesh2);

1.24 对Group中的对象进行批量操作

由于Group是一个Object3D对象,因此对其应用的任何变换(位置、旋转、缩放等)都会应用到其子对象上。例如,我们可以一次性旋转Group中的所有对象:

group.rotation.x += 0.01;
group.rotation.y += 0.01;

2. 模型命名,查询和遍历

2.1 .name命名属性

在Three.js中,每个对象都有一个.name属性,可以用于为对象分配一个唯一的名称。这个名称可以用来在后续操作中轻松地查找和识别对象。

import * as THREE from 'three';
​
const geometry = new THREE.BoxGeometry(1, 1, 1);
const material = new THREE.MeshBasicMaterial({color: 0x00ff00});
const cube = new THREE.Mesh(geometry, material);
​
// 为立方体对象分配一个名称
cube.name = 'myCube';

2.2 .getObjectByName()查询方法

.getObjectByName()方法允许您根据对象的名称快速查找场景中的对象。这在场景中有许多对象时非常有用。以下是一个如何使用getObjectByName()查找对象的示例:

// 假设我们已经创建了一个名为 'myCube' 的立方体对象并将其添加到场景中
​
// 使用 getObjectByName 查找名为 'myCube' 的对象
const myCube = scene.getObjectByName('myCube');
​
if (myCube) {console.log('找到名为 myCube 的对象:', myCube);
} else {console.log('没有找到名为 myCube 的对象');
}

2.3 .traverse()遍历方法

.traverse()方法是一个递归函数,可以用于遍历给定对象及其子对象。这对于在场景中查找特定类型或名称的对象非常有用。以下是一个使用traverse()方法遍历场景中对象的示例:

scene.traverse((object) => {// 对所有类型为 Mesh 的对象执行操作if (object instanceof THREE.Mesh) {console.log('找到一个 Mesh 对象:', object);}
});

结合使用 .name 属性、.traverse() 方法和 .getObjectByName() 方法,您可以轻松地在 Three.js 场景中查找、遍历和管理对象。这些方法在处理复杂场景时非常有用,可以让您的代码更具可读性和可维护性。

3. 显示,隐藏对象

3.1 visible属性

模型对象的父类Object3D封装了一个属性.visible,通过该属性可以隐藏或显示一个模型。

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

附送250套精选项目源码

源码截图

 源码获取:关注公众号「码农园区」,回复 【源码】,即可获取全套源码下载链接

这篇关于【Three.js】知识梳理九:Three.js层级模型的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1054161

相关文章

JS常用组件收集

收集了一些平时遇到的前端比较优秀的组件,方便以后开发的时候查找!!! 函数工具: Lodash 页面固定: stickUp、jQuery.Pin 轮播: unslider、swiper 开关: switch 复选框: icheck 气泡: grumble 隐藏元素: Headroom

Java架构师知识体认识

源码分析 常用设计模式 Proxy代理模式Factory工厂模式Singleton单例模式Delegate委派模式Strategy策略模式Prototype原型模式Template模板模式 Spring5 beans 接口实例化代理Bean操作 Context Ioc容器设计原理及高级特性Aop设计原理Factorybean与Beanfactory Transaction 声明式事物

大模型研发全揭秘:客服工单数据标注的完整攻略

在人工智能(AI)领域,数据标注是模型训练过程中至关重要的一步。无论你是新手还是有经验的从业者,掌握数据标注的技术细节和常见问题的解决方案都能为你的AI项目增添不少价值。在电信运营商的客服系统中,工单数据是客户问题和解决方案的重要记录。通过对这些工单数据进行有效标注,不仅能够帮助提升客服自动化系统的智能化水平,还能优化客户服务流程,提高客户满意度。本文将详细介绍如何在电信运营商客服工单的背景下进行

Andrej Karpathy最新采访:认知核心模型10亿参数就够了,AI会打破教育不公的僵局

夕小瑶科技说 原创  作者 | 海野 AI圈子的红人,AI大神Andrej Karpathy,曾是OpenAI联合创始人之一,特斯拉AI总监。上一次的动态是官宣创办一家名为 Eureka Labs 的人工智能+教育公司 ,宣布将长期致力于AI原生教育。 近日,Andrej Karpathy接受了No Priors(投资博客)的采访,与硅谷知名投资人 Sara Guo 和 Elad G

sqlite3 相关知识

WAL 模式 VS 回滚模式 特性WAL 模式回滚模式(Rollback Journal)定义使用写前日志来记录变更。使用回滚日志来记录事务的所有修改。特点更高的并发性和性能;支持多读者和单写者。支持安全的事务回滚,但并发性较低。性能写入性能更好,尤其是读多写少的场景。写操作会造成较大的性能开销,尤其是在事务开始时。写入流程数据首先写入 WAL 文件,然后才从 WAL 刷新到主数据库。数据在开始

在JS中的设计模式的单例模式、策略模式、代理模式、原型模式浅讲

1. 单例模式(Singleton Pattern) 确保一个类只有一个实例,并提供一个全局访问点。 示例代码: class Singleton {constructor() {if (Singleton.instance) {return Singleton.instance;}Singleton.instance = this;this.data = [];}addData(value)

Retrieval-based-Voice-Conversion-WebUI模型构建指南

一、模型介绍 Retrieval-based-Voice-Conversion-WebUI(简称 RVC)模型是一个基于 VITS(Variational Inference with adversarial learning for end-to-end Text-to-Speech)的简单易用的语音转换框架。 具有以下特点 简单易用:RVC 模型通过简单易用的网页界面,使得用户无需深入了

透彻!驯服大型语言模型(LLMs)的五种方法,及具体方法选择思路

引言 随着时间的发展,大型语言模型不再停留在演示阶段而是逐步面向生产系统的应用,随着人们期望的不断增加,目标也发生了巨大的变化。在短短的几个月的时间里,人们对大模型的认识已经从对其zero-shot能力感到惊讶,转变为考虑改进模型质量、提高模型可用性。 「大语言模型(LLMs)其实就是利用高容量的模型架构(例如Transformer)对海量的、多种多样的数据分布进行建模得到,它包含了大量的先验

图神经网络模型介绍(1)

我们将图神经网络分为基于谱域的模型和基于空域的模型,并按照发展顺序详解每个类别中的重要模型。 1.1基于谱域的图神经网络         谱域上的图卷积在图学习迈向深度学习的发展历程中起到了关键的作用。本节主要介绍三个具有代表性的谱域图神经网络:谱图卷积网络、切比雪夫网络和图卷积网络。 (1)谱图卷积网络 卷积定理:函数卷积的傅里叶变换是函数傅里叶变换的乘积,即F{f*g}

秋招最新大模型算法面试,熬夜都要肝完它

💥大家在面试大模型LLM这个板块的时候,不知道面试完会不会复盘、总结,做笔记的习惯,这份大模型算法岗面试八股笔记也帮助不少人拿到过offer ✨对于面试大模型算法工程师会有一定的帮助,都附有完整答案,熬夜也要看完,祝大家一臂之力 这份《大模型算法工程师面试题》已经上传CSDN,还有完整版的大模型 AI 学习资料,朋友们如果需要可以微信扫描下方CSDN官方认证二维码免费领取【保证100%免费