【Three.js】八、three.js几何体的组合与合并

2023-10-31 21:50
文章标签 组合 js 合并 three 几何体

本文主要是介绍【Three.js】八、three.js几何体的组合与合并,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

【Three.js】八、three.js几何体的组合与合并

  • 一、几何体的组合
  • 二、几何体的合并

一、几何体的组合

THREE.Group()可用来创建一个组,每一组中可包含多个对象,可对这些对象进行整体的调整,也可以单独调整组中的某个对象。使用add方法即可向组中添加对象。

示例:

import '../../stylus/index.styl'
import * as THREE from 'three'
import * as dat from 'dat.gui'
import {initTrackballControls, initThree, initStats} from "../../util/util";function init(){let stats = initStats();let {camera, scene, renderer} = initThree();let spotLight = new THREE.SpotLight(0xffffff);spotLight.position.set(0, 30, 50);spotLight.castShadow = true;spotLight.shadow.mapSize.set(2048, 2048);scene.add(spotLight);let axes = new THREE.AxesHelper(20);scene.add(axes);let planeGeometry = new THREE.PlaneBufferGeometry(60, 40, 1,1);let planeMaterial = new THREE.MeshLambertMaterial({color: 0xffffff});let plane = new THREE.Mesh(planeGeometry, planeMaterial);plane.rotation.x = -0.5*Math.PI;plane.receiveShadow = true;scene.add(plane);let cubeGeometry = new THREE.BoxBufferGeometry(5,5,5,5,5,5);let cubeMaterial = new THREE.MeshStandardMaterial({color: 0x00ffff});let cube1 = new THREE.Mesh(cubeGeometry, cubeMaterial);cube1.position.set(-6, 5, 0);let cube2 = new THREE.Mesh(cubeGeometry, cubeMaterial);cube2.position.set(6, 5, 5);let group = new THREE.Group();group.add(cube1, cube2);scene.add(group);let gui = new dat.GUI();let cube1GUI = gui.addFolder('cube1');let cube2GUI = gui.addFolder('cube2');let groupGUI = gui.addFolder('group');let cube1Controls = {positionX: cube1.position.x,positionY: cube1.position.y,positionZ: cube1.position.z,scale: 1};let cube2Controls = {positionX: cube2.position.x,positionY: cube2.position.y,positionZ: cube2.position.z,scale: 1};let groupControls = {positionX: group.position.x,positionY: group.position.y,positionZ: group.position.z,scale: 1};cube1GUI.add(cube1Controls, 'positionX', -10, -6);cube1GUI.add(cube1Controls, 'positionY', 5, 10);cube1GUI.add(cube1Controls, 'positionZ', 0, 10);cube1GUI.add(cube1Controls, 'scale', 0, 3);cube2GUI.add(cube2Controls, 'positionX', 6, 10);cube2GUI.add(cube2Controls, 'positionY', 5, 10);cube2GUI.add(cube2Controls, 'positionZ', 5, 10);cube2GUI.add(cube2Controls, 'scale', 0, 3);groupGUI.add(groupControls, 'positionX', -10, 10);groupGUI.add(groupControls, 'positionY', 0, 10);groupGUI.add(groupControls, 'positionZ', -10, 10);groupGUI.add(groupControls, 'scale', 0, 3);let trackballControls = initTrackballControls(camera, renderer);function render(){stats.update();trackballControls.update();cube1.position.set(cube1Controls.positionX, cube1Controls.positionY, cube1Controls.positionZ);cube1.scale.set(cube1Controls.scale, cube1Controls.scale, cube1Controls.scale);cube2.position.set(cube2Controls.positionX, cube2Controls.positionY, cube2Controls.positionZ);cube2.scale.set(cube2Controls.scale, cube2Controls.scale, cube2Controls.scale);group.position.set(groupControls.positionX, groupControls.positionY, groupControls.positionZ);group.scale.set(groupControls.scale, groupControls.scale, groupControls.scale);requestAnimationFrame(render);renderer.render(scene, camera);}render();
}
init();

在这里插入图片描述
  上例创建了两个立方体,并加入了一个Group中,使用右侧控制器可对这两个立方体进行位置及缩放的变化;其中group选项下可对整体进行调整,cube1/cube2分别对应一个立方体。

二、几何体的合并

通过THREE.Geometry.merge()方法可实现几何体之间的合并,一旦合并无法单独控制被合并的几何体。当页面存在大量几何体,使用合并可提高页面性能。

  如下,场景中显示500个立方体,观察fps好想还可以,通过右侧控制器将cubeNumber调至10000个点击redraw,你会发现fps迅速降低至低于30fps,如果勾选merge,你会发现fps就正常了。

import '../../stylus/index.styl'
import * as THREE from 'three';
import * as dat from 'dat.gui';
import {initTrackballControls, initStats, initThree} from "../../util/util";function init () {let stats = initStats();let {scene, camera, renderer} = initThree();camera.position.set(-100, 100, 80);let cubeMaterial = new THREE.MeshNormalMaterial({transparent: true,opacity: 0.8});let addCube = () => {let cubeGeometry =  new THREE.BoxGeometry(4,4,4,4);let cube = new THREE.Mesh(cubeGeometry, cubeMaterial);cube.position.x = - 100 + Math.round(Math.random() * 200);cube.position.y =  Math.round(Math.random() * 10);cube.position.z = - 100 + Math.round(Math.random() * 200);return cube;};for (let i = 0; i < 500; i++) {scene.add(addCube());}let gui = new dat.GUI();let guiControls = {cubeNumber: 500,merge: false,redraw: function () {let removeArr = [];scene.children.forEach(item => {item instanceof THREE.Mesh && removeArr.push(item);});removeArr.forEach(item => scene.remove(item));if ( this.merge ) {let geometry = new THREE.Geometry();for (let i = 0; i < this.cubeNumber; i++) {let cubeMesh = addCube();cubeMesh.updateMatrix();geometry.merge(cubeMesh.geometry, cubeMesh.matrix);}scene.add(new THREE.Mesh(geometry, cubeMaterial));} else {for (let i = 0; i < this.cubeNumber; i++) {scene.add(addCube());}}addCube();}};gui.add(guiControls, 'cubeNumber');gui.add(guiControls, 'merge');gui.add(guiControls, 'redraw');let trackballControls = initTrackballControls(camera, renderer);function render() {stats.update();trackballControls.update();requestAnimationFrame(render);renderer.render(scene, camera);}render();
}init();

这篇关于【Three.js】八、three.js几何体的组合与合并的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



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

相关文章

JS纯前端实现浏览器语音播报、朗读功能的完整代码

《JS纯前端实现浏览器语音播报、朗读功能的完整代码》在现代互联网的发展中,语音技术正逐渐成为改变用户体验的重要一环,下面:本文主要介绍JS纯前端实现浏览器语音播报、朗读功能的相关资料,文中通过代码... 目录一、朗读单条文本:① 语音自选参数,按钮控制语音:② 效果图:二、朗读多条文本:① 语音有默认值:②

在Node.js中使用.env文件管理环境变量的全过程

《在Node.js中使用.env文件管理环境变量的全过程》Node.js应用程序通常依赖于环境变量来管理敏感信息或配置设置,.env文件已经成为一种流行的本地管理这些变量的方法,本文将探讨.env文件... 目录引言为什么使php用 .env 文件 ?如何在 Node.js 中使用 .env 文件最佳实践引

使用Node.js和PostgreSQL构建数据库应用

《使用Node.js和PostgreSQL构建数据库应用》PostgreSQL是一个功能强大的开源关系型数据库,而Node.js是构建高效网络应用的理想平台,结合这两个技术,我们可以创建出色的数据驱动... 目录初始化项目与安装依赖建立数据库连接执行CRUD操作查询数据插入数据更新数据删除数据完整示例与最佳

C#实现一键批量合并PDF文档

《C#实现一键批量合并PDF文档》这篇文章主要为大家详细介绍了如何使用C#实现一键批量合并PDF文档功能,文中的示例代码简洁易懂,感兴趣的小伙伴可以跟随小编一起学习一下... 目录前言效果展示功能实现1、添加文件2、文件分组(书签)3、定义页码范围4、自定义显示5、定义页面尺寸6、PDF批量合并7、其他方法

Three.js构建一个 3D 商品展示空间完整实战项目

《Three.js构建一个3D商品展示空间完整实战项目》Three.js是一个强大的JavaScript库,专用于在Web浏览器中创建3D图形,:本文主要介绍Three.js构建一个3D商品展... 目录引言项目核心技术1. 项目架构与资源组织2. 多模型切换、交互热点绑定3. 移动端适配与帧率优化4. 可

MySQL进行分片合并的实现步骤

《MySQL进行分片合并的实现步骤》分片合并是指在分布式数据库系统中,将不同分片上的查询结果进行整合,以获得完整的查询结果,下面就来具体介绍一下,感兴趣的可以了解一下... 目录环境准备项目依赖数据源配置分片上下文分片查询和合并代码实现1. 查询单条记录2. 跨分片查询和合并测试结论分片合并(Shardin

基于Python实现进阶版PDF合并/拆分工具

《基于Python实现进阶版PDF合并/拆分工具》在数字化时代,PDF文件已成为日常工作和学习中不可或缺的一部分,本文将详细介绍一款简单易用的PDF工具,帮助用户轻松完成PDF文件的合并与拆分操作... 目录工具概述环境准备界面说明合并PDF文件拆分PDF文件高级技巧常见问题完整源代码总结在数字化时代,PD

pandas数据的合并concat()和merge()方式

《pandas数据的合并concat()和merge()方式》Pandas中concat沿轴合并数据框(行或列),merge基于键连接(内/外/左/右),concat用于纵向或横向拼接,merge用于... 目录concat() 轴向连接合并(1) join='outer',axis=0(2)join='o

Python使用python-can实现合并BLF文件

《Python使用python-can实现合并BLF文件》python-can库是Python生态中专注于CAN总线通信与数据处理的强大工具,本文将使用python-can为BLF文件合并提供高效灵活... 目录一、python-can 库:CAN 数据处理的利器二、BLF 文件合并核心代码解析1. 基础合

使用Python获取JS加载的数据的多种实现方法

《使用Python获取JS加载的数据的多种实现方法》在当今的互联网时代,网页数据的动态加载已经成为一种常见的技术手段,许多现代网站通过JavaScript(JS)动态加载内容,这使得传统的静态网页爬取... 目录引言一、动态 网页与js加载数据的原理二、python爬取JS加载数据的方法(一)分析网络请求1