obj离线加载(vue+threejs)+apk方式浏览

devtools/2025/2/27 13:55:48/
demo需求:移动端,实现obj本地离线浏览
结合需求,利用(vue2+threejs173)进行obj的加载,然后采用apk方式(hbuilderX打包发布)移动端浏览;

https://github.com/bianbian886/LoadLocalObjThreejs-Vue2.githttps://github.com/bianbian886/LoadLocalObjThreejs-Vue2.git

技术要点:

1、threejs的objloader的方法是使用Fetch API进行网络请求,不适用与three原生obj 的加载方式,因此需要改造three的方法;

常规通用写法:

mtlLoader.load(

      "./static/models1/xpj1/A-XPJ.mtl",

      function (materials) {

        materials.preload();

        objLoader

          .setMaterials(materials)

          .load("./static/models1/xpj1/A-XPJ.obj", function (object) {

            object.children[0].geometry.computeBoundingBox(); //

            object.children[0].geometry.center(); //定位到模型中心

            console.log(object.children[0].geometry.center());

            object.rotateZ(Math.PI / 2); //模型倒置

            object.rotateY(Math.PI / 2); //模型倒置

            object.position.y = 10; //模型抬升

            that.scene.add(object);

          }),

          (xhr) => {

            console.log((xhr.loaded / xhr.total) * 100 + "% loaded");

          },

          // called when loading has errors

          (error) => {

            console.log("An error happened " + error);

          };

      }

    );

    }

但是在apk调试会报请求错误,因为是fecth api的方式。

‌解决方式:将threejs的objloader的方法改为XMLHttpRequest进行请求。代码如下:

// 加载 .mtl 文件

  loadMTL(mtlLoader, mtlUrl, callback) {

    const xhr = new XMLHttpRequest();

    xhr.open("GET", mtlUrl, true);

    xhr.onload = function () {

      if (xhr.status === 200) {

        const materials = mtlLoader.parse(xhr.responseText); // 解析 .mtl 文件

        materials.preload(); // 预加载材质

        callback(materials);

      } else {

        console.error("Failed to load MTL file:", xhr.statusText);

      }

    };

    xhr.onerror = function (error) {

      console.error("Error loading MTL file:", error);

    };

    xhr.send();

  }

  // 加载 .obj 文件

  loadOBJ(objLoader, objUrl, materials, callback) {

    const xhr = new XMLHttpRequest();

    xhr.open("GET", objUrl, true);

    xhr.onload = function () {

      if (xhr.status === 200) {

        objLoader.setMaterials(materials); // 设置材质

        const object = objLoader.parse(xhr.responseText); // 解析 .obj 文件

        callback(object);

      } else {

        console.error("Failed to load OBJ file:", xhr.statusText);

      }

    };

    xhr.onerror = function (error) {

      console.error("Error loading OBJ file:", error);

    };

    xhr.send();

  }

var objLoader = new OBJLoader();

var mtlLoader = new MTLLoader();

this.loadMTL(mtlLoader, mtlUrl, function (materials) {

      that.loadOBJ(objLoader, objUrl, materials, function (object) {

        console.log("Model loaded");

        // 对单个模型进行操作

        const model = object.children[0];

       /model.geometry.computeBoundingBox();

       model.geometry.center();//模型定位

       console.log(model.geometry.center());

        //object.rotateZ(Math.PI);

        object.rotateX(Math.PI/2);

        object.scale.setScalar(0.3);

        //添加到场景that.filterEmptyMeshes()

        that.scene.add(object);

        console.log("Model added to scene");

      });

    });

    this.animate();

    window.addEventListener("resize", () => {

      this.onWindowResize();

    });

  }

2、obj 数据,其中mtl文件一定要是相对路径(且mtl 不要带中文),不然在apk 调试也请求不到。

带中文报错截图,忘记截图了,在apk运行到手机模拟器一看就知道了。

3、最后,利用vue 打包好的拷贝到hbuilderX发布apk,示例参考很多,利用5+app发布就可以了(发布前可以自己运行调试下),如图红框即为替换的内容。npm run build 打包出来的内容

利用5+app模版,将相应内容更换后的布局。

注意点是index.html 中的路径要修改,具体,全局搜索/css和/js的将其修改为css和js。修改前

修改后

成果展示:


http://www.ppmy.cn/devtools/163079.html

相关文章

RPC 框架项目剖析

RPC 框架项目剖析 说明 本文用于梳理一个 rpc项目的实现细节,此项目基于cpp语言 大概三千行左右,用于学习目的。 项目链接:rpc项目 项目底层类 1.抽象消息类 描述: 各种消息的基类 属性: 消息id,消息类型…

6.6.3 SQL数据查询(一)

文章目录 SELECT语句简单查询连接查询子查询聚集函数 SELECT语句 SELECT是用于查询的动词,基本格式为SELECT-FROM-WHERE,其中WHERE可选。SELECT对应投影运算,FROM对应笛卡尔积运算,WHERE对应选择运算。选择使用的条件表达式p可包含…

【2025全网最新最全】前端Vue3框架的搭建及工程目录详解

文章目录 安装软件Node.js搭建Vue工程创建Vue工程精简Vue项目文件 Vue工程目录的解读网页标题的设置设置全局样式路由配置 安装软件Node.js 下载地址:https://nodejs.org/zh-cn/ 安装完成后,打开cmd,查看环境是否准备好 node -v npm -vnpm使用之前一定…

Ubuntu22上安装MySQL8启动成功,远程无法连接

解决步骤: 1.首先验证网络是否通 ping Linux服务器ip 2.如果网络通,验证是否开放了访问 2.1在服务器上使用 sudo mysql -u root -p 并输入密码连接到mysql 2.2执行 SELECT User, Host FROM mysql.user; 查找一个Host列为’%的用户,这表示允许从任何主机连…

使用 frp 实现内网穿透:从零到一的完整指南

使用 frp 实现内网穿透:从零到一的完整指南 🎁 DeepSeek满血版免费领啦!字节跳动火山引擎官方,免费抵扣3625万tokens,畅享R1与V3模型!参与入口:点击进入 为什么需要内网穿透? 在日常…

大连指令数据集的创建--数据收集与预处理_02

1.去哪儿爬虫 编程语言:Python爬虫框架:Selenium(用于浏览器自动化)解析库:BeautifulSoup(用于解析HTML) 2.爬虫策略 目标网站:去哪儿(https://travel.qunar.com/trav…

大模型基础概念之神经网络宽度

在大模型中,神经网络宽度是提升模型容量的核心手段之一,与深度、数据规模共同构成性能的三大支柱。合理增加宽度可显著增强模型表达能力,但需结合正则化、硬件优化和结构设计进行平衡。未来趋势可能包括动态宽度调整、稀疏化宽度设计(如MoE)以及更高效宽度-深度复合缩放策…

【p-camera-h5】 一款开箱即用的H5相机插件,支持拍照、录像、动态水印与样式高度定制化。

【开源推荐】p-camera-h5:一款轻量级H5相机插件开发实践 一、插件背景 在Web开发中,原生摄像头功能的集成往往面临以下痛点: 浏览器兼容性问题视频流与水印叠加实现复杂移动端适配困难功能定制成本高 为此,p-camera-h5 —— 一…