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

babylon.js-3:了解STL网格模型

网格模型上色

本篇文章主要介绍如何在 BabylonJS 中实现STL网格模型上色。

文章目录

    • 网格模型上色
      • 运用场景
      • 概要
      • 延申
      • 正文
        • 加载器库的支持
        • 认识 OBJ 和 STL 文件
        • GUI 色板选择器
        • 网格模型异步加载
        • 加载动画
        • 网格模型上色
        • 官方即将弃用 `ImportMesh` 而推荐使用 `ImportMeshAsync` 说明
        • OBJ 或 STL 文件 第三方资源
      • 总结

  • .STL文件:从官方上的叫法应该叫“标准三角面片文件”。但是为了易懂,我们下面称它为“网格模型”。当然,在场景渲染后它就是一个Mesh(网格)。

  • 图片
    在这里插入图片描述

运用场景

  • 产品私有化选型定制

概要

  • 加载器库
  • 初识 OBJ 和 STL 文件
  • GUI色板选择器
  • 网格模型异步加载
  • 加载动画
  • 网格模型上色
  • 官方即将弃用 ImportMesh 而推荐使用 ImportMeshAsync 说明
  • OBJ 或 STL 文件 第三方资源

延申

  • 网格模型局部部件上色

正文

加载器库的支持
  • CDN 引用

    <script src="https://cdn.babylonjs.com/loaders/babylonjs.loaders.min.js"></script>
    
  • npm 安装

    # @see: https://www.npmjs.com/search?q=babylonjs-loaders
    npm install babylonjs-loaders
    

    更多Vue支持请看: 如何在 Vue 中使用 BabylonJS

认识 OBJ 和 STL 文件

在这里插入图片描述

  • OBJ 文件
    • 定义:OBJ(Object)文件是一种三维对象文件格式,它是一种文本文件,包含了几何信息,如顶点位置、纹理坐标、法线向量和三角形面片信息等。
    • 用途:常用于在不同的三维软件和渲染引擎之间交换三维模型数据,广泛应用于 3D 建模、动画制作、游戏开发等领域,因为它可以存储丰富的几何信息,支持多面体几何图形,并且可以包含材质和纹理信息。
    • 结构:文件中通常以 v 开头的行表示顶点坐标,vt 表示纹理坐标,vn 表示法线,f 表示面信息,这些信息可以组合成一个完整的 3D 模型的几何形状。
    • 示例
      # Blender v2.79 (sub 0) OBJ File: ''
      # www.blender.org
      o Cube
      v 1.000000 -1.000000 -1.000000
      v 1.000000 -1.000000 1.000000
      ...vt 0.625000 0.500000vt 0.875000 0.500000
      ...vn 0.0000 0.0000 1.0000vn 0.0000 0.0000 -1.0000
      ...f 1/1/1 2/2/1 3/3/1f 3/3/1 4/4/1 1/1/1
      

在这里插入图片描述

  • STL 文件
    • 定义:STL(Stereolithography)文件有两种格式,一种是二进制格式,另一种是文本格式,主要用于描述三维表面几何形状,仅包含三角形面片信息,不包含颜色、纹理和其他属性。
    • 用途:主要用于快速成型系统,如 3D 打印,因为它的简单性和对表面几何形状的准确描述,使它成为 3D 打印机的标准输入文件之一。
    • 结构(文本格式):以 solid 开头,包含多个 facet normal 描述三角形面片的法线,然后是 outer loop 包含三角形的三个顶点,以 endloopendfacet 结束一个面片,最后以 endsolid 结束整个文件。
    • 示例(文本格式)
      solid Cube
      facet normal 0.0 0.0 1.0outer loopvertex 1.0 1.0 1.0vertex -1.0 1.0 1.0vertex -1.0 -1.0 1.0endloop
      endfacet
      ...
      endsolid Cube
      

二、VSCode 相关插件

在这里插入图片描述

  • 3D Viewer for VSCode:在 VSCode 中,可以使用 3D Viewer for VSCode 插件,它可以让你在编辑器中预览 STL 文件。安装该插件后,打开 STL 文件,在编辑器的侧边栏会出现一个 3D 视图,可以旋转、缩放和平移查看 STL 模型。
  • 市场:3dviewer
GUI 色板选择器

在这里插入图片描述

这里的颜色选择面板我们选用BABYLONJS内置原滋原味的GUI面板控件:ColorPicker

具体实现:

// 创建一个全屏的动态纹理
const advancedTexture = BABYLON.GUI.AdvancedDynamicTexture.CreateFullscreenUI("UI");
// 创建一个颜色选择器
const colorPicker = new BABYLON.GUI.ColorPicker();
// 设置颜色选择器的添加位置
advancedTexture.addControl(colorPicker);

注意:请务必添加GUI库,否则浏览器会报错,找不到 AdvancedDynamicTexture 属性

<!-- 引入 BabylonJS GUI 库 -->
<script src="https://cdn.babylonjs.com/gui/babylon.gui.min.js"></script>
网格模型异步加载

由于网格模型过大,正如素材里面的“vaze2.STL”文件165MB。所以在场景中加载的时候需要采用异步加载。

实现代码:

const result = await BABYLON.SceneLoader.ImportMeshAsync('meshName', './3066-vase-3d-model/', 'vaze2.STL', scene, (event) => {})
const newMeshes = result.meshes; // meshes是一个数组集
if (newMeshes.length > 0) {importedMesh = newMeshes[0];
}

参数剖析:

  • lengthComputable:用于检查是否可以计算进度的准确百分比。

    • 注意:为什么需要进入if (event.lengthComputable)这个判断作为前提?
    • event.lengthComputabletrue 时,意味着文件的总大小是已知的,并且可以计算出加载进度的准确百分比。这是因为有些文件的大小可能无法提前得知,例如在某些跨域请求或服务器没有正确设置 Content-Length 头信息时,文件的总大小是不确定的。
  • loaded:表示已经加载的数据量。

  • total:表示文件的总大小。

那么,通过获取以上参数,可以准确的计算当前网格模型加载的进度和展现进度百分比情况。同时可以控制加载完成后,网格模型与加载动画的显示与隐藏。

加载动画

加载动画的思路是一贯的,所以下面给出简单的逻辑和具体实现代码:

  1. 绘制进度条背景
    // 绘制进度背景
    const progressBar = new BABYLON.GUI.Rectangle();
    progressBar.width = "200px"; // 宽度200px
    progressBar.background = "gray";// 底色为灰色
    progressBar.horizontalAlignment = BABYLON.GUI.Control.HORIZONTAL_ALIGNMENT_CENTER; // 水平居中
    progressBar.verticalAlignment = BABYLON.GUI.Control.VERTICAL_ALIGNMENT_CENTER; // 垂直居中
    
  2. 绘制进度条
    // 绘制进度条
    const progressBarFill = new BABYLON.GUI.Rectangle();
    progressBarFill.width = "0px"; // 默认宽度为0
    progressBarFill.background = "blue"; // 底色为蓝色
    progressBarFill.horizontalAlignment = BABYLON.GUI.Control.HORIZONTAL_ALIGNMENT_LEFT; // 水平左对齐(不然会从中间向两天展开)
    
  3. 计算当前进度
    // 计算当前进度
    if (event.lengthComputable) {const progress = event.loaded / event.total;
    }
    
  4. 绘制进度和进度值
    // 宽度为当前进度乘以200
    progressBarFill.width = progress * 200 + "px"; 
    // 显示当前进度
    progressText.text = Math.floor(progress * 100) + "%"; 
    
  5. 加载完毕动作
    // 隐藏进度条
    progressBar.isVisible = false;
    
网格模型上色

颜色选择器绑定一个选择监视器事件,当选择颜色的时候,就给网格模型上色。

具体实现:

colorPicker.onValueChangedObservable.add((value) => {importedMesh.material.diffuseColor = new BABYLON.Color3(value.r, value.g, value.b);
});
官方即将弃用 ImportMesh 而推荐使用 ImportMeshAsync 说明

各自的参数说明就不在赘述了,感兴趣的可以去官方查看,这里主要说明两者的运用场景,就目前环境下谁更好。

  • 使用方法比较

    • ImportMesh

      BABYLON.SceneLoader.ImportMesh("", "path/to/your/models/", "yourModel.obj", scene, function (newMeshes, particleSystems, skeletons) {if (newMeshes.length > 0) {const mesh = newMeshes[0];// 对导入的网格进行操作,例如设置位置和旋转mesh.position = new BABYLON.Vector3(0, 0, 0);mesh.rotation = new BABYLON.Vector3(0, Math.PI, 0);}
      }, function (event) {if (event.lengthComputable) {console.log(`Loaded ${event.loaded} of ${event.total} bytes`);}
      }, function (error) {console.error("Error loading mesh:", error);
      });
      
    • ImportMeshAsync

      const importMeshAsync = async function() {try {const result = await BABYLON.SceneLoader.ImportMeshAsync("", "path/to/your/models/", "yourModel.obj", scene, function (event) {if (event.lengthComputable) {console.log(`Loaded ${event.loaded} of ${event.total} bytes`);}});const newMeshes = result.meshes;if (newMeshes.length > 0) {const mesh = newMeshes[0];// 对导入的网格进行操作,例如设置位置和旋转mesh.position = new BABYLON.Vector3(0, 0, 0);mesh.rotation = new BABYLON.Vector3(0, Math.PI, 0);}} catch (error) {console.error("Error loading mesh:", error);}
      };
      importMeshAsync();
      
  • 区别和优点

    • ImportMesh 是一个传统的回调函数风格的方法,而 ImportMeshAsync 是一个返回 Promise 的异步方法,使用 async/await.then() 处理结果,更符合现代 JavaScript 的异步编程风格。

    • ImportMeshAsync 在使用时可以利用 try...catch 语句来捕获错误,代码结构更清晰,避免了回调函数的嵌套,使代码更易读和维护。

  • 使用场景

    • ImportMesh
      • 适用于传统的回调函数风格的编程,如果你更熟悉这种风格,或者项目中已经大量使用回调函数,可以使用 ImportMesh
      • 在不支持 async/await 的旧环境中使用。
    • ImportMeshAsync
      • 适用于现代 JavaScript 开发,使用 async/await 可以使代码更加简洁,避免回调地狱。
      • 在需要处理多个异步操作时,使用 async/await 可以让代码更易读,更容易组合和管理多个异步操作。
OBJ 或 STL 文件 第三方资源
  • 下载模型的站点:
    • creazilla

总结

  • 案例特点
    在加载大型网格模型,进度条让用户了解加载的进度,提高用户体验。 用户可以通过颜色选择器为模型上色,实现个性化定制。

  • 价值
    可以用于展示各种3D模型,如产品设计、建筑模型、艺术作品等,让用户可以从不同角度查看模型的细节,这在产品设计、游戏开发等领域非常有用。

  • 实现效果展示
    在这里插入图片描述

相关文章:

babylon.js-3:了解STL网格模型

网格模型上色 本篇文章主要介绍如何在 BabylonJS 中实现STL网格模型上色。 文章目录 网格模型上色运用场景概要延申正文加载器库的支持认识 OBJ 和 STL 文件GUI 色板选择器网格模型异步加载加载动画网格模型上色官方即将弃用 ImportMesh 而推荐使用 ImportMeshAsync 说明OBJ …...

基于SpringBoot的假期周边游平台的设计与实现(源码+SQL脚本+LW+部署讲解等)

专注于大学生项目实战开发,讲解,毕业答疑辅导&#xff0c;欢迎高校老师/同行前辈交流合作✌。 技术范围&#xff1a;SpringBoot、Vue、SSM、HLMT、小程序、Jsp、PHP、Nodejs、Python、爬虫、数据可视化、安卓app、大数据、物联网、机器学习等设计与开发。 主要内容&#xff1a;…...

【MySQL】初始MySQL、库与表的操作

目录 基本使用 使用案例 SQL分类 存储引擎 库的操作 字符集和校验规则 查看系统默认字符集和校验规则 查看数据库支持的字符集 查看数据库支持的字符集校验规则 指定编码常见数据库 校验规则对数据库的影响 操纵数据库 库的备份与恢复 表的操作 创建表 查看表 …...

将DeepSeek接入Word,打造AI办公助手

最近&#xff0c;DeepSeek热度一路高涨&#xff0c;成为AI领域的焦点。通过开放的API&#xff0c;我们可以将DeepSeek接入Word&#xff0c;直接进行AI对话。更进一步&#xff0c;还能利用DeepSeek辅助修改文档&#xff0c;甚至提出一些排版建议。 Word报告工具已经新增“DeepS…...

Coze,Dify,FastGPT,对比

在当今 AI 技术迅速发展的背景下&#xff0c;AI Agent 智能体成为了关键领域&#xff0c;Coze、Dify 和 FastGPT 作为其中的佼佼者&#xff0c;各有千秋。 平台介绍 - FastGPT&#xff1a;由环界云计算公司发起&#xff0c;是基于大语言模型&#xff08;LLM&#xff09;的开源…...

Kafka 日志存储 — 磁盘存储

Kafka 依赖与磁盘来存储和缓存消息&#xff0c;采用文件追加的方式来写入消息。顺序写盘的速度快于随机写内存。 1 磁盘存储 除顺序写入外&#xff0c;Kafka中大量使用了页缓存、零拷贝等技术来进一步提升吞吐性能。 1.1 页缓存 页缓存是操作系统实现的一种磁盘缓存&#x…...

996引擎 - NPC-添加NPC引擎自带形象

996引擎 - NPC-添加NPC引擎自带形象 截图参考添加NPC参考资料截图参考 添加NPC 编辑NPC表:Envir\DATA\cfg_npclist.xls 1.1. 需要临时隐藏NPC时可以在id前加 // 1.2. 如果NPC朝向不对,可以调整dir 列。(按8方向,上是0顺时针数。我这里给的4) 1.3. 形象代码:NPC代码、怪物…...

GL C++显示相机YUV视频数据使用帧缓冲FBO后期处理,实现滤镜功能。

一.前言&#xff1a; GitHub地址&#xff1a;GitHub - wangyongyao1989/WyFFmpeg: 音视频相关基础实现 系列文章&#xff1a; 1. OpenGL Texture C 预览Camera视频&#xff1b; 2. OpenGL Texture C Camera Filter滤镜; 3. OpenGL 自定义SurfaceView Texture C预览Camera视…...

【hot100】刷题记录(7)-除自身数组以外的乘积

题目描述&#xff1a; 给你一个整数数组 nums&#xff0c;返回 数组 answer &#xff0c;其中 answer[i] 等于 nums 中除 nums[i] 之外其余各元素的乘积 。 题目数据 保证 数组 nums之中任意元素的全部前缀元素和后缀的乘积都在 32 位 整数范围内。 请 不要使用除法&#x…...

解决.NET程序通过网盘传到Linux和macOS不能运行的问题

问题描述&#xff1a;.net程序用U盘传到虚拟机macOS和Linux可以正常运行&#xff0c;但是网盘传过去就不行。 解决方法&#xff1a; 这是文件权限的问题。当你通过U盘将文件传输到虚拟机的macOS和Linux系统时&#xff0c;文件的权限和所有权可能得到了保留或正确设置。但如果…...

练习(复习)

大家好&#xff0c;今天我们来做几道简单的选择题目来巩固一下最近学习的知识&#xff0c;以便我们接下来更好的学习。 这道题比较简单&#xff0c;我们前面学过&#xff0c;在Java中&#xff0c;一个类只能继承一个父类&#xff0c;但是一个父类可以有多个子类&#xff0c;一个…...

Class2(2020):Shell基础(二)——Shell脚本设计基础

本系列博客为MIT的《Missing in CS Class》的课程笔记。 Class2(2020):Shell基础(二)——Shell脚本设计基础 注&#xff1a;若无特殊说明&#xff0c;本文中带有[]的部分均为可选参数。 脚本文件 脚本语言为解释执行&#xff0c;其运行需有解释器&#xff0c;如Python。Shel…...

HBase-2.5.10 伪分布式环境搭建【Mac】

文章目录 前言一、搭建单节点Zookeeper1. 解压zookeeper2. 配置环境变量3. 修改配置文件4. 启动zk 二、搭建伪分布式Hbase1. 解压hbase2. 配置环境变量3. 修改配置4. 启动HBase 前言 搭建hbase伪分布式环境 提示&#xff1a;以下是本篇文章正文内容&#xff0c;下面案例仅供参…...

计算机毕业设计Python+CNN卷积神经网络高考推荐系统 高考分数线预测 高考爬虫 协同过滤推荐算法 Vue.js Django Hadoop 大数据毕设

温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 作者简介&#xff1a;Java领…...

macos的图标过大,这是因为有自己的设计规范

苹果官方链接&#xff1a;App 图标 | Apple Developer Documentation 这个在官方文档里有说明&#xff0c;并且提供了sketch 和 ps 的模板。 figma还提供了模板&#xff1a; Figma...

2025_1_29 C语言学习中关于指针

1. 指针 指针就是存储的变量的地址&#xff0c;指针变量就是指针的变量。 1.1 空指针 当定义一个指针没有明确指向内容时&#xff0c;就可以将他设置为空指针 int* p NULL;这样对空指针的操作就会使程序崩溃而不会导致出现未定义行为&#xff0c;因为程序崩溃是宏观的&…...

解决ImportError: cannot import name ‘notf‘

解决ImportError: cannot import name ‘notf‘ 报错&#xff1a; 报错代码&#xff1a; from torch.utils.tensorboard import SummaryWriter cannot import name notf from tensorboard.compat 解决方法&#xff1a; pip install numpy1.26.0 测试代码&#xff1a; py…...

HTML<label>标签

例子 三个带标签的单选按钮&#xff1a; <form action"/action_page.php"> <input type"radio" id"html" name"fav_language" value"HTML"> <label for"html">HTML</label><br&…...

shiro学习五:使用springboot整合shiro。在前面学习四的基础上,增加shiro的缓存机制,源码讲解:认证缓存、授权缓存。

文章目录 前言1. 直接上代码最后在讲解1.1 新增的pom依赖1.2 RedisCache.java1.3 RedisCacheManager.java1.4 jwt的三个类1.5 ShiroConfig.java新增Bean 2. 源码讲解。2.1 shiro 缓存的代码流程。2.2 缓存流程2.2.1 认证和授权简述2.2.2 AuthenticatingRealm.getAuthentication…...

大数据Hadoop入门1

目录 相关资料 第一部分 1.课程内容大纲和学习目标 2.数据分析和企业数据分析方向 3.数据分析基本流程步骤 4.大数据时代 5.分布式和集群 6.Linux操作系统概述 7.VMware虚拟机概念与安装 8.centos操作系统的虚拟机导入 9.VMware虚拟机常规使用、快照 第二部分 1.课…...

将嵌套循环中的Java对象数组转换为HashMap以优化性能

本文旨在指导开发人员如何通过将嵌套循环转换为Hashmap来优化Java代码的性能&#xff0c;特别是当涉及到对象属性的相等性检查时。通过使用Hashmap的快速搜索特性&#xff0c;可以显著降低时间复杂性&#xff0c;提高代码执行效率。本文将提供详细的步骤和示例代码&#xff0c;…...

告别调参玄学:手把手教你用‘黎卡提方程’为自动驾驶LQR控制器选择Q和R矩阵

自动驾驶轨迹跟踪实战&#xff1a;从黎卡提方程到LQR调参的工程化思考 当你在仿真环境中第一次看到自己设计的LQR控制器让车辆完美跟踪参考轨迹时&#xff0c;那种成就感难以言喻。但更多时候&#xff0c;我们面对的是震荡的超调曲线、缓慢的收敛速度&#xff0c;以及令人抓狂的…...

从‘各玩各的’到‘协同作战’:聊聊多传感器SLAM中坐标系对齐的那些‘坑’与最佳实践

从‘各玩各的’到‘协同作战’&#xff1a;多传感器SLAM坐标系对齐的工程实践指南 当激光雷达的轨迹点云与相机的视觉路径在三维空间中"貌合神离"&#xff0c;工程师们往往面临一个关键抉择&#xff1a;是强行统一时间基准&#xff0c;还是重新建立空间映射关系&…...

探索分子世界的三维画笔:PyMOL开源版如何让你成为分子艺术家?

探索分子世界的三维画笔&#xff1a;PyMOL开源版如何让你成为分子艺术家&#xff1f; 【免费下载链接】pymol-open-source Open-source foundation of the user-sponsored PyMOL molecular visualization system. 项目地址: https://gitcode.com/gh_mirrors/py/pymol-open-so…...

FanControl风扇控制软件:从噪音困扰到静音享受的完整指南

FanControl风扇控制软件&#xff1a;从噪音困扰到静音享受的完整指南 【免费下载链接】FanControl.Releases This is the release repository for Fan Control, a highly customizable fan controlling software for Windows. 项目地址: https://gitcode.com/GitHub_Trending…...

Llama-3.2V-11B-cot惊艳案例:电影截图角色关系推演与剧情发展预测展示

Llama-3.2V-11B-cot惊艳案例&#xff1a;电影截图角色关系推演与剧情发展预测展示 1. 视觉推理工具简介 Llama-3.2V-11B-cot是基于Meta多模态大模型开发的高性能视觉推理工具&#xff0c;专为双卡4090环境深度优化。该工具不仅修复了视觉权重加载的关键问题&#xff0c;还支持…...

Dify工作流终极指南:3天从新手到专家的完整免费教程

Dify工作流终极指南&#xff1a;3天从新手到专家的完整免费教程 【免费下载链接】Awesome-Dify-Workflow 分享一些好用的 Dify DSL 工作流程&#xff0c;自用、学习两相宜。 Sharing some Dify workflows. 项目地址: https://gitcode.com/GitHub_Trending/aw/Awesome-Dify-Wo…...

掌握 AgentScope 与 Spring AI Alibaba:大模型多智能体实践指南(收藏版)

本文深入探讨了 AgentScope 与 Spring AI Alibaba 在大模型应用中的多智能体实践。从单智能体优先原则出发&#xff0c;详细解析了 Pipeline、Routing、Skills、Subagents、Supervisor、Handoffs 及 Custom Workflow 等多种多智能体模式&#xff0c;并提供了实用的架构选型指南…...

别再只盯着GNSS了!用移远EC20模组实现基站定位的完整配置流程(含免费Token申请)

移远EC20模组基站定位实战&#xff1a;从零配置到室内场景精准落地 在物联网设备定位领域&#xff0c;GNSS卫星定位长期占据主导地位&#xff0c;但鲜为人知的是&#xff0c;像移远EC20这样的LTE模组还隐藏着一个被低估的功能——基站定位。当你的智能水表安装在地下室、共享设…...

收藏!2026非科班/转行小白必看:3步切入AI大模型,月薪30w+实战路径

2026年的职场赛道&#xff0c;AI大模型依旧是绝对的“黄金风口”。 最新行业报告显示&#xff0c;AI相关岗位需求逆势增长37%&#xff0c;薪资领跑全行业&#xff0c;大厂校招起薪普遍突破25k。但一个残酷的现实是&#xff1a; 太多非科班、半路转行的程序员&#xff0c;还在门…...