【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+HTML实现在线图片水印添加工具

《JS+HTML实现在线图片水印添加工具》在社交媒体和内容创作日益频繁的今天,如何保护原创内容、展示品牌身份成了一个不得不面对的问题,本文将实现一个完全基于HTML+CSS构建的现代化图片水印在线工具... 目录概述功能亮点使用方法技术解析延伸思考运行效果项目源码下载总结概述在社交媒体和内容创作日益频繁的

Node.js 数据库 CRUD 项目示例详解(完美解决方案)

《Node.js数据库CRUD项目示例详解(完美解决方案)》:本文主要介绍Node.js数据库CRUD项目示例详解(完美解决方案),本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考... 目录项目结构1. 初始化项目2. 配置数据库连接 (config/db.js)3. 创建模型 (models/

使用Node.js制作图片上传服务的详细教程

《使用Node.js制作图片上传服务的详细教程》在现代Web应用开发中,图片上传是一项常见且重要的功能,借助Node.js强大的生态系统,我们可以轻松搭建高效的图片上传服务,本文将深入探讨如何使用No... 目录准备工作搭建 Express 服务器配置 multer 进行图片上传处理图片上传请求完整代码示例

用js控制视频播放进度基本示例代码

《用js控制视频播放进度基本示例代码》写前端的时候,很多的时候是需要支持要网页视频播放的功能,下面这篇文章主要给大家介绍了关于用js控制视频播放进度的相关资料,文中通过代码介绍的非常详细,需要的朋友可... 目录前言html部分:JavaScript部分:注意:总结前言在javascript中控制视频播放

Python实现合并与拆分多个PDF文档中的指定页

《Python实现合并与拆分多个PDF文档中的指定页》这篇文章主要为大家详细介绍了如何使用Python实现将多个PDF文档中的指定页合并生成新的PDF以及拆分PDF,感兴趣的小伙伴可以参考一下... 安装所需要的库pip install PyPDF2 -i https://pypi.tuna.tsingh

使用Apache POI在Java中实现Excel单元格的合并

《使用ApachePOI在Java中实现Excel单元格的合并》在日常工作中,Excel是一个不可或缺的工具,尤其是在处理大量数据时,本文将介绍如何使用ApachePOI库在Java中实现Excel... 目录工具类介绍工具类代码调用示例依赖配置总结在日常工作中,Excel 是一个不可或缺的工http://

使用Python创建一个能够筛选文件的PDF合并工具

《使用Python创建一个能够筛选文件的PDF合并工具》这篇文章主要为大家详细介绍了如何使用Python创建一个能够筛选文件的PDF合并工具,文中的示例代码讲解详细,感兴趣的小伙伴可以了解下... 目录背景主要功能全部代码代码解析1. 初始化 wx.Frame 窗口2. 创建工具栏3. 创建布局和界面控件4

Node.js net模块的使用示例

《Node.jsnet模块的使用示例》本文主要介绍了Node.jsnet模块的使用示例,net模块支持TCP通信,处理TCP连接和数据传输,具有一定的参考价值,感兴趣的可以了解一下... 目录简介引入 net 模块核心概念TCP (传输控制协议)Socket服务器TCP 服务器创建基本服务器服务器配置选项服

mac安装nvm(node.js)多版本管理实践步骤

《mac安装nvm(node.js)多版本管理实践步骤》:本文主要介绍mac安装nvm(node.js)多版本管理的相关资料,NVM是一个用于管理多个Node.js版本的命令行工具,它允许开发者在... 目录NVM功能简介MAC安装实践一、下载nvm二、安装nvm三、安装node.js总结NVM功能简介N

Python自动化办公之合并多个Excel

《Python自动化办公之合并多个Excel》在日常的办公自动化工作中,尤其是处理大量数据时,合并多个Excel表格是一个常见且繁琐的任务,下面小编就来为大家介绍一下如何使用Python轻松实现合... 目录为什么选择 python 自动化目标使用 Python 合并多个 Excel 文件安装所需库示例代码