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

news2025/2/28 18:09:27
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.coloradmin.cn/o/2307502.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

关于mysql 表中字段存储JSON对象对JSON对象中的bolean字段进行查询的方式

业务场景如题 JSON对象为 表为客诉表中的 发现利用原有的xml中的 and a1.order_list ->‘$[*].isZg’ request.isZg 后续发现需要更改为有效 本文作为自己日常工作记录用,有遇到相同问题的可以作为参考。

Kylin麒麟操作系统 | 系统监控

以下所使用的环境为: 虚拟化软件:VMware Workstation 17 Pro 麒麟系统版本:Kylin-Server-V10-SP3-2403-Release-20240426-x86_64 一、系统状态查询工具 1. 静态显示系统进程信息ps ps命令会生成一个静态列表,列表中显示的进程其…

vLLM服务设置开机自启动(Linux)

要在开机时进入指定的 conda 环境并启动此 vllm 服务,您可以通过以下步骤设置一个 systemd 服务来自动执行脚本。 一、第一步:创建一个启动脚本 1.打开终端并创建启动脚本,例如 /home/username/start_vllm.sh(请替换 username 为…

几个api

几个api 原型链 可以阅读此文 Function instanceof Object // true Object instanceof Function // true Object.prototype.isPrototypeOf(Function) // true Function.prototype.isPrototypeOf(Object) // true Object.__proto__ Function.prototype // true Function.pro…

数字IC后端设计实现OCC(On-chip Clock Controller)电路介绍及时钟树综合案例

数字IC后端时钟树综合专题(OCC电路案例分享) 复杂时钟设计时钟树综合(clock tree synthesis)常见20个典型案例 1、什么是OCC? 片上时钟控制器(On-chip Clock Controllers ,OCC),也称为扫描时钟控制器(Scan Clock Con…

Trae根据原型设计稿生成微信小程序密码输入框的踩坑记录

一、需求描述 最近经常使用Trae生成一些小组件和功能代码(对Trae赶兴趣的可以看之前的文章《TraeAi上手体验》),刚好在用uniapp开发微信小程序时需要开发一个输入密码的弹框组件,于是想用Trae来实现。原型设计稿如下:…

华为AP 4050DN-HD的FIT AP模式改为FAT AP,家用FAT基本配置

在某鱼买了两台华为AP 4050DN-HD , AP是二手的 , 在AC上上过线 , 所以就不能开机自选为FIP模式了 我没有AC无线控制器 , 就是买一个自己玩 , AP又是FIT瘦AP模式 ,所以我就想把AP的瘦AP模式改为FAT胖AP模式 1. 准备工作 1.1下载好对应软件,进入到 企业业务网站去下…

vue3+ts+uniapp+unibest 微信小程序(第二篇)—— 图文详解自定义背景图页面布局、普通页面布局、分页表单页面布局

文章目录 简介一、自定义背景图布局1.1 效果预览1.2 实现思路1.3 custom-page 组件全量代码1.4 页面使用 二、普通页面布局2.1 效果预览2.2 实现思路2.3 公共样式部分2.4 页面使用 三、分页表单页面布局3.1 效果预览3.2 实现思路3.3 页面代码 简介 开发工具:VsCode…

虚拟机缩放比例问题处理

上班打开虚拟机的样子。 最开始判断可能是vmtools 异常重启安装后发现没有效果 通过 xrandr 功能查询显示器信息获取显示器名 设置显示器 同时设置分辨率 也可以同时设置刷新率 注意下图中设置的关键字

【Python 入门基础】—— 人工智能“超级引擎”,AI界的“瑞士军刀”,

欢迎来到ZyyOvO的博客✨,一个关于探索技术的角落,记录学习的点滴📖,分享实用的技巧🛠️,偶尔还有一些奇思妙想💡 本文由ZyyOvO原创✍️,感谢支持❤️!请尊重原创&#x1…

DeepSeek-R1-Zero:基于基础模型的强化学习

注:此文章内容均节选自充电了么创始人,CEO兼CTO陈敬雷老师的新书《自然语言处理原理与实战》(人工智能科学与技术丛书)【陈敬雷编著】【清华大学出版社】 文章目录 DeepSeek大模型技术系列四DeepSeek大模型技术系列四》DeepSeek-…

(dp 买入股票的最佳时机)leetcode 121

题目 题解的dp数组 0列是负数&#xff0c;这里我改成正数不再相加而是相减获取利润 class Solution { public:int maxProfit(vector<int>& prices) {int nprices.size();vector<vector<int>>dp(n,vector<int>(2));dp[0][0]prices[0];dp[0][1]0;//0…

由 Mybatis 源码畅谈软件设计(三):简单查询 SQL 执行流程

大家好&#xff0c;我是 方圆。SQL 查询是 Mybatis 中的核心流程&#xff0c;本节我们来介绍简单 SQL 的执行流程&#xff0c;过程会比较长&#xff0c;期间会认识很多重要的组件&#xff0c;比如 SqlSession、四大处理器&#xff08;Executor、StatementHandler、ParameterHan…

项目实践 之 pdf简历的解析和填充(若依+vue3)

文章目录 环境背景最终效果前端讲解左侧模块解析右侧上传模块解析前端步骤 后端讲解代码前端 环境背景 若依前后端分离框架 vue最后边附有代码哦 最终效果 前端讲解 左侧模块解析 1、左侧表单使用el-form 注意&#xff1a; 1、prop出现的字段&#xff0c;需要保证是该类所…

lowagie(itext)老版本手绘PDF,包含页码、水印、图片、复选框、复杂行列合并、行高设置等。

入口类&#xff1a;exportPdf package xcsy.qms.webapi.service;import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; import com.alibaba.nacos.common.utils.StringUtils; import com.ibm.icu.text.RuleBasedNumberFormat; import com.lowagie…

第002文-kali虚拟机安全与网络配置

1、kali系统介绍 kali是一个基于Linux kernel的操作系统&#xff0c;由BackTrack(简称BT)发展而来。BackTrack是2006年推出的一个用于渗透测试及黑客攻防的专用平台&#xff0c;基于Knoppix(linux的一个发行版)开发。BackTrack版本周期&#xff1a;2006年的起始版本BackTrack …

软件工程复试专业课-软件生命周期

文章目录 软件过程模型瀑布模型模型图特点优缺点改进后的瀑布模型 快速原型模型模型图优缺点 增量模型&#xff08;迭代-递增模型&#xff09;原型图与瀑布和快速原型的区别优缺点风险更大的增量模型 螺旋模型简介模型图优缺点 喷泉模型模型图优缺点 编码修补模型敏捷过程优缺点…

DILLEMA:扩散模型+大语言模型,多模态数据增强框架

引言&#xff1a;深度学习模型的鲁棒性测试需要全面且多样化的测试数据。现有的方法通常基于简单的数据增强技术或生成对抗网络&#xff0c;但这些方法在生成真实且多样化的测试数据集方面存在局限性。为了克服这些限制&#xff0c;DILLEMA框架应运而生&#xff0c;旨在通过结合…

C++程序员内功修炼——Linux C/C++编程技术汇总

在软件开发的宏大版图中&#xff0c;C 语言宛如一座巍峨的高山&#xff0c;吸引着无数开发者攀登探索。而 Linux 操作系统&#xff0c;以其开源、稳定、高效的特性&#xff0c;成为了众多开发者钟爱的开发平台。将 C 与 Linux 相结合&#xff0c;就如同为开发者配备了一把无坚不…

苍穹外卖-阿里云OSS文件上传

苍穹外卖-阿里云OSS文件上传 一、阿里云OSS简介**获取AccessKey**获取enpoint 二、代码实现1 引入依赖2 定义OSS相关配置2.1 application-dev.yml2.2 application.yml 3 读取OSS配置3.1 AliOssProperties 4 生成OSS工具类对象4.1 AliOssUtil4.2 OssConfiguration2.5 CommonCont…