前言

大部分的webgl框架,比如threejs和babylon等,都可以加载obj和gltf模型。 我们的引擎,基于three封装,同样有加载模型的loader,因此加载obj和gltf模型也是很简单就可以实现的。

不过加载文件都是在线的文件,也就是通过url的形式进行加载。 团队开发的三维可视化平台框架,需要能够上传obj和gltf等格式的模型,在上传前,需要先对模型预览,这就涉及到如何加载本地模型的问题了。

加载本地模型

本文以gltf为例,进行说明。 加载本地模型的思路是这样的:

既然引擎可以通过url的机制,加载模型。 那么如果有一种机制,可以把本地文件及其关联的资源(比如贴图)等转换成url的形式,就可以进行使用loader进行访问了。

Blob & File

首先我们学习下Blob和File对象,以下内容来自MDN:

Blob对象表示一个不可变、原始数据的类文件对象。它的数据可以按文本或二进制的格式进行读取,也可以转换成 ReadableStream 来用于数据操作。

Blob 表示的不一定是JavaScript原生格式的数据。File 接口基于Blob,继承了 blob 的功能并将其扩展使其支持用户系统上的文件。

File 对象是特殊类型的 Blob,且可以用在任意的 Blob 类型的 context 中。比如说, FileReader, URL.createObjectURL(), createImageBitmap() (en-US), 及 XMLHttpRequest.send() 都能处理 Blob File

createObjectURL

URL对象上的方法 createObjectURL可以把一个Blob对象或者File对象,转化成一个url对象,语法如下:

objectURL = URL.createObjectURL(object);

其中object表示的是Blob或者File对象。返回的是一个url地址对象。

加载本地模型

有了上述基础知识,大致的思路就出来了:

  • 首先 加载本地文件,读取file对象(可能是多个File对象,因为一个模型可能包括多个资源文件)。
  • 找出主要文件(gltf glb等格式的)文件,主文件通过 createObjectURL方法转换成url对象
  • 找出其他文件,通过createObjectURL方法转换成url对象
  • 加载主文件的url,并在加载过程中,通过地址改写的方式,把相关的资源替换成文件的url对象。

以上思路的大致代码如下:

let files = document.getElementById("file-input").files;

          if (!files.length) return;
console.log(files);
let rootFile;
const fileMap = new Map();
Array.from(files).forEach((file) => fileMap.set(file.name, file));
Array.from(fileMap).forEach(([path, file]) => {
if (file.name.match(/\.(gltf|glb)$/)) {
rootFile = file;
rootPath = path.replace(file.name, "");
}
});
const fileUrl = URL.createObjectURL(rootFile);
const gltf = await load(fileUrl, rootPath, fileMap); function load(url, rootPath, assetMap) {
const index = url.lastIndexOf("/");
const baseURL = index === -1 ? "./" : url.substr(0, index + 1);
const manager = new dt.LoadingManager();
// Load.
return new Promise((resolve, reject) => {
manager.setURLModifier((url, path) => {
const normalizedURL =
rootPath +
decodeURI(url)
.replace(baseURL, "")
.replace(/^(\.?\/)/, ""); if (assetMap.has(normalizedURL)) {
const blob = assetMap.get(normalizedURL);
const blobURL = URL.createObjectURL(blob);
blobURLs.push(blobURL);
return blobURL;
}
return (path || "") + url;
});
const loader = new dt.GLTFLoader(manager).setCrossOrigin("anonymous");
loader.setDRACOLoader(new dt.DRACOLoader());
loader.setMeshoptDecoder(MeshoptDecoder);
const blobURLs = [];
let time = new Date().getTime();
loader.load(url,(gltf) => {
const scene = gltf.scene || gltf.scenes[0];
const clips = gltf.animations || [];
if (!scene) {
throw new Error("This model contains no scene");
}
console.log("delta", new Date().getTime() - time);
blobURLs.forEach(URL.revokeObjectURL);
resolve(gltf);
},
undefined,
reject
);
});
}

总结

通过上述方式,可以写简单工具,帮助开发和建模人员随时查看模型的情况。



除gltf模型外,其他格式的模型,比如fbx或者obj,也可以类似操作。

如果对可视化感兴趣,可以和我交流,微信541002349。 关注公号“ITMan彪叔” 可以及时收到更多有价值的文章。

WebGL加载本地模型的更多相关文章

  1. cesium 学习(五) 加载场景模型

    cesium 学习(五) 加载场景模型 一.前言 现在开始实际的看看效果,目前我所接触到基本上都是使用Cesium加载模型这个内容,以及在模型上进行操作.So,现在进行一些加载模型的学习,数据的话可以 ...

  2. WebGL three.js学习笔记 加载外部模型以及Tween.js动画

    WebGL three.js学习笔记 加载外部模型以及Tween.js动画 本文的程序实现了加载外部stl格式的模型,以及学习了如何把加载的模型变为一个粒子系统,并使用Tween.js对该粒子系统进行 ...

  3. World Wind Java开发之八——加载本地缓存文件构建大范围三维场景(

    http://blog.csdn.net/giser_whu/article/details/42044599 上一篇博客主要是针对小文件直接导入WW中显示,然而当文件特别大时,这种方式就不太可行.因 ...

  4. Google浏览器如何加载本地文件

    Chrome浏览器加载本地文件 一般来说,为了安全起见,浏览器是不能通过load方法来加载本地文件的,load方法只能加载远程服务器上的文件. 在浏览器默认的情况下,试图加载一个本地文件,会出现交叉域 ...

  5. xBIM 实战02 在浏览器中加载IFC模型文件并设置特效

    系列目录    [已更新最新开发文章,点击查看详细]  在模型浏览器中加载模型后,可以对模型做一些特殊操作.下图是常用的设置. 都是通过 xbim-viewer.js 中的 API 来设置以达到一定的 ...

  6. xBIM 实战01 在浏览器中加载IFC模型文件

    系列目录    [已更新最新开发文章,点击查看详细]  一.创建Web项目 打开VS,新建Web项目,选择 .NET Framework 4.5  选择一个空的项目 新建完成后,项目结构如下: 二.添 ...

  7. live2d web端加载moc3模型

    大佬博客链接:https://blog.csdn.net/weixin_44128558/article/details/104792345 照着大佬的博客做一下,可以先学会怎么生成bundle.js ...

  8. #iOS问题记录#动态Html加载本地CSS和JS文件

    所谓动态Html,指代码中组合生成的html字符串: 若需要加载本地CSS,图片,JS文件,则, 1,需要文件的全路径: 2,需要"file:///"标志: 例如: //获取文件全 ...

  9. 重新想象 Windows 8.1 Store Apps (81) - 控件增强: WebView 之加载本地 html, 智能替换 html 中的 url 引用, 通过 Share Contract 分享 WebView 中的内容, 为 WebView 截图

    [源码下载] 重新想象 Windows 8.1 Store Apps (81) - 控件增强: WebView 之加载本地 html, 智能替换 html 中的 url 引用, 通过 Share Co ...

  10. iOS --- UIWebView的加载本地数据的三种方式

    UIWebView是IOS内置的浏览器,可以浏览网页,打开文档  html/htm  pdf   docx  txt等格式的文件.  safari浏览器就是通过UIWebView做的. 服务器将MIM ...

随机推荐

  1. RocketMq开启安全认证ACL-解决服务器系统安全漏洞

    1.为什么要开启ACL 通过之前的文章我们已经知道怎么安装RocketMq了.如果你还不会安装RocketMq可以查看我的这篇文章:快速入门一篇搞定RocketMq-实现微服务实战落地 进行软件安装, ...

  2. Linux使用宝塔面板发布.NetCore3.1

    1,安装宝塔面板 yum install -y wget && wget -O install.sh http://download.bt.cn/install/install_6.0 ...

  3. 研二学妹面试字节,竟倒在了ThreadLocal上,这是不要应届生还是不要女生啊?

    一.写在开头     今天和一个之前研二的学妹聊天,聊及她上周面试字节的情况,着实感受到了Java后端现在找工作的压力啊,记得在18,19年的时候,研究生计算机专业的学生,背背八股文找个Java开发工 ...

  4. CSS置顶操作(z-index属性)

    z-index使用方法: 1.首先要把position设置为 absolute 或 relative 或 fixed,z-index才能生效 2.设置z-index的值(整数) # 值越大代表越置前, ...

  5. .NET桌面程序混合开发之二:在原生WinFrom程序中使用WebView2

    本文将介绍如何在WinForms中嵌入WebView2,并讲到WebView2的主要特征.点击了解更多WebView2的API. 1. 准备 Visual Studio 2017 及以上版本 WebV ...

  6. nginx002: NGINX的环境变量,基本命令参数,目录关系及gzip优化

    NGINX的环境变量,基本命令参数,目录关系及gzip优化 添加环境变量 nginx命令执行方式 nginx [选项] [参数] 通过编译安装的nginx 默认是没有环境变量的,如何设置环境变量,让n ...

  7. tomcat部署Jenkins

    安装环境 jdk 1.8 tomcat 9.0 jenkins 2.290 准备工作 安装好Tomcat,8080端口启动 安装好jdk,配置好环境变量 ECS服务器安全组放开8080端口 关闭防火墙 ...

  8. vite+vue3+ts+elementPlus前端框架搭建 [三] router路由管理

    路由包括动态路由.静态路由两种,本文中以静态路由的方式实现了动态路由. 1. 创建Router 在Src目录下创建router文件夹,并在router文件夹下创建index.ts文件. index.t ...

  9. 在线XML格式化工具

    在线XML格式化工具可以帮助您轻松格式化混乱的XML代码.只需将您的XML代码复制并粘贴到文本框中,工具会自动对代码进行缩进.对齐和添加空格等操作,使代码看起来更加整洁和专业. 在线XML格式化工具

  10. 启动 bert-as-service

    S1:启动bert-as-service时,执行命令 bert-serving-start -model_dir /downloads/uncased_L-12_H-768_A-12/ -num_wo ...