当前位置: 首页 > news >正文

Three.js 实现模型材质分解,拆分,拆解效果

原理:通过修改模型材质的 x,y,z 轴坐标 positon.set( x,y,z) 来实现拆解,分解的效果。

注意:支持模型材质position 修改的材质类型为 type=“Mesh” ,其他类型的材质修改了position 可能没有实际效果

在上一篇 Three.js加载外部glb,fbx,gltf,obj 模型文件 的文章基础上新增一个 setModelMeshDecompose(模型拆解方法)

安装 tween.js (用于处理模型拆解的位置移动缓冲动画效果)

yarn add @tweenjs/tween.js
import TWEEN from "@tweenjs/tween.js";

setModelMeshDecompose 方法

   // decompose 分解的大小距离setModelMeshDecompose(decompose ) {// 如果当前模型只有一个材质则不进行拆解if (this.glowMaterialList.length <= 1) return false// 修改材质位置移动const modelDecomposeMove = (obj, position) => {new TWEEN.Tween(obj.position).to(position, 500).onUpdate(function (val) {obj.position.set(val.x || 0, val.y || 0, val.z || 0);}).start();}const length = this.glowMaterialList.lengthconst angleStep = (2 * Math.PI) / length;// TODD glowMaterialList:当前模型的所有材质列表名称this.glowMaterialList.forEach((name, i) => {// 通过 getObjectByName 获取 要修改的材质const mesh = this.model.getObjectByName(name)// 如果 type 类型为Mesh 则修改材质的位置if (mesh.type == 'Mesh') {// 拆解位置移动的计算公式const angle = i * angleStep;const x = (decompose) * Math.cos(angle);const y = (decompose) * Math.sin(angle);const position = {x, y, z: 0}// 执行拆解modelDecomposeMove(mesh, position)}})}

获取当前模型的所有材质名称的方法

   getFlowMeaterList(){const modelMaterialList= []this.model.traverse((v) => {if (v.isMesh && v.material) {modelMaterialList.push(v)	}})this.glowMaterialList = modelMaterialList.map(v=>v.name)}

在场景渲染动画帧方法中添加 TWEEN.update()

 render(){this.renderer.render(this.scene, this.camera)TWEEN.update()
}

完整的代码可参考:https://gitee.com/ZHANG_6666/Three.js3D/blob/master/src/views/renderModel.js

界面效果对比
在这里插入图片描述
在这里插入图片描述

http://www.lryc.cn/news/137217.html

相关文章:

  • 《JVM修仙之路》初入JVM世界
  • 苍穹外卖 day1 搭建成功环境
  • 智能主体按照功能划分
  • python中的matplotlib画折线图(数据分析与可视化)
  • 大数据数据仓库
  • Java“牵手“速卖通商品详情页面数据获取方法,速卖通API实现批量商品数据抓取示例
  • 【Git】代码误推送还原(真实项目环境,非纸上谈兵)
  • CPU 飙升?这3大场景助你精准定位
  • 6、Spring_Junit与JdbcTemplate整合
  • Redis是如何保证高可用的?
  • 精益求精:通付盾安卓应用加固升级,为移动安全保驾护航!
  • javaweb01-html、css基础
  • 牛客复盘] 2023河南萌新联赛第(七)场:信息工程大学 B\I 20230823
  • 使用PyMuPDF添加PDF水印
  • window如何实时刷新日志文件
  • 动态代理的两个使用方式(手动实现+SpringAOP实现)-Demo
  • 面试话术(MQ+mybatis+nginx+redis+ssm+mysql+linux)
  • JSON的理解
  • 面试热题(二叉树的最大路径)
  • C#设计模式之--六大原则 开闭原则
  • 编写Dockerfile制作自己的镜像并推送到私有仓库
  • 华为OD-分积木/分苹果
  • Mysql的引擎有哪些?支持事物么?DB储存引擎有哪些?
  • 【懒加载】js实现懒加载、vue实现图片懒加载指令
  • 微信小程序教学系列(7)
  • Android 9.0 kenel和frameworks中修改ram运行内存的功能实现
  • PHP实践:获取网络上图片的长宽以及图片类型
  • 使用 DPO 微调 Llama 2
  • 数据库——事务,事务隔离级别
  • 对《VB.NET通过VB6 ActiveX DLL调用PowerBasic及FreeBasic动态库》的改进