①构建三维坐标,代码如下

<!--  -->
<template><div id="container"></div>
</template><script>
//这里可以导入其他文件(比如:组件,工具js,第三方插件js,json文件,图片文件等等)
//例如:import 《组件名称》 from '《组件路径》';
import * as THREE from "three";
import { OBJLoader, MTLLoader } from "three-obj-mtl-loader";
const OrbitControls = require("three-orbit-controls")(THREE);
import Stats from "stats-js";
export default {//import引入的组件需要注入到对象中才能使用components: { THREE, OBJLoader, MTLLoader, OrbitControls, Stats },props: {},data() {//这里存放数据return {};},//监听属性 类似于data概念computed: {},//监控data中的数据变化watch: {},//方法集合methods: {init() {var scene, camera, renderer, controls;scene = initScene();renderScene();// 控制器,监听鼠标事件function renderScene() {renderer.render(scene, camera);}// 场景自适应window.addEventListener("resize", onWindowResize, false);function onWindowResize() {camera.aspect = window.innerWidth / window.innerHeight;camera.updateProjectionMatrix();renderer.setSize(window.innerWidth, window.innerHeight);}function initScene() {// 创建场景var scene = new THREE.Scene();// 创建相机camera = new THREE.PerspectiveCamera(75,window.innerWidth / window.innerHeight,0.01,1000);//创建渲染器renderer = new THREE.WebGLRenderer({ antialias: true });renderer.setSize(window.innerWidth, window.innerHeight);renderer.setClearColor(0xffffff, 0);renderer.setPixelRatio(window.devicePixelRatio);document.getElementById("container").appendChild(renderer.domElement);// 创建坐标轴var axes = new THREE.AxesHelper(100);scene.add(axes);camera.position.x = 1.8;camera.position.y = 0.6;camera.position.z = 2.7;camera.lookAt(scene.position);scene.add(camera);// 控制器,监听鼠标事件controls = new OrbitControls(camera, renderer.domElement);controls.addEventListener("change", renderScene);return scene;}},animate() {},},//生命周期 - 创建完成(可以访问当前this实例)created() {},//生命周期 - 挂载完成(可以访问DOM元素)mounted() {this.init();},beforeCreate() {}, //生命周期 - 创建之前beforeMount() {}, //生命周期 - 挂载之前beforeUpdate() {}, //生命周期 - 更新之前updated() {}, //生命周期 - 更新之后beforeDestroy() {}, //生命周期 - 销毁之前destroyed() {}, //生命周期 - 销毁完成activated() {}, //如果页面有keep-alive缓存功能,这个函数会触发
};
</script>
<style  scoped>
</style>

②加载obj文件

  // 创建objLoader对象var loader = new OBJLoader();loader.load("../../static/536.obj", function (obj) {  // 调用OBJ的loader函数,加载成功会有个回调函数,参数obj就是模型加载成功后的网格Mesh实例对象scene.add(obj);// 页面加载成功后没有立即渲染模型,调用立即渲染函数renderScene();});

③未看见模型,原因:未设置光源,因此,设置光源

④ 设置网格对象的参数

// 创建objLoader对象var loader = new OBJLoader();loader.load("../../static/536.obj", function (obj) {  // 调用OBJ的loader函数,加载成功会有个回调函数,参数obj就是模型加载成功后的网格Mesh实例对象// 调试发现模型会在y轴上方的,我们希望在y轴的下方一些// 网格模型按xyz进行放缩obj.scale.set(2,2,2);obj.position.y = -65;obj.position.x = -1045;obj.position.z = -50;// 几何体绕着x轴旋转45度obj.rotateX(Math.PI / 6);scene.add(obj);// 页面加载成功后没有立即渲染模型,调用立即渲染函数renderScene();});

⑤贴图

  // 给模型穿衣服,加载uv网格图片,以下代码写在模型加载上面const textureLoader = new THREE.TextureLoader();// 下载地址:https://github.com/mrdoob/three.js/blob/master/examples/textures/uv_grid_opengl.jpgconsole.log("texture对象初始化成功");// 创建objLoader对象var loader = new OBJLoader();loader.load("../../static/536.obj", function (obj) {// 调用OBJ的loader函数,加载成功会有个回调函数,参数obj就是模型加载成功后的网格Mesh实例对象// 调试发现模型会在y轴上方的,我们希望在y轴的下方一些// 遍历子网格obj.traverse(function (child) {if (child.isMesh) {// 纹理设置console.log("遍历子网格");child.material.map = texture;}});// 网格模型按xyz进行放缩obj.scale.set(2, 2, 2);obj.position.y = -65;obj.position.x = -1045;obj.position.z = -50;// 几何体绕着x轴旋转45度obj.rotateX(Math.PI / 6);scene.add(obj);// 页面加载成功后没有立即渲染模型,调用立即渲染函数renderScene();});

⑥管理器

初始化管理器

// 配置加载管理器类,获取加载进度和是否加载出错
const manager = new THREE.LoadingManager();
// 参数1:正在加载的模型,参数2:已经加载的模型 参数3:总的模型数量
manager.onProgress = function(item,loaded,total){console.log(item,loaded,total);
}

 预先定义一个存放OBJ模型的变量

// 预先定义一个存放OBJ模型的变量
var object;

编写一个模型加载完成 callback函数

// 编写一个模型加载完成 callback函数
function loadModel(){// 遍历子网格object.traverse(function (child) {if (child.isMesh) {// 纹理设置console.log("遍历子网格");child.material.map = texture;}});// 网格模型按xyz进行放缩object.scale.set(2, 2, 2);object.position.y = -65;object.position.x = -1045;object.position.z = -50;// 几何体绕着x轴旋转45度object.rotateX(Math.PI / 6);scene.add(object);// 页面加载成功后没有立即渲染模型,调用立即渲染函数renderScene();
}loader.load('obj文件路径',function(obj)->{object=obj;
});

将loadModel传递给LoadingManager的构造函数中

// 将loadModel传递给LoadingManager的构造函数中
const manager = new THREE.LoadingManager(loadModel);

将manager作为纹理和模型加载器的构造函数中

// 将manager作为纹理和模型加载器的构造函数中const  textureLoader = new THREE.TextureLoader(manager);var loader =new OBJLoader(manager);

控制台查看manager是否打印,将遍历子网格的方法注释掉暂时用不到

⑥加载mtl文件

// 创建加载mtl的对象,manager作为参数传入var mtlLoader = new MTLLoader(manager);
// 加载mtl 文件 ,参数1: mtl文件路径 , 参数2:回调函数mtlLoader.load('./male02/male02.mtl',function(materials){// 调用预加载函数,作用: 让浏览器提前加载指定资源(加载后并不执行),在需要执行的时候再执行materials.preload();})

声明一个变量用于存储加载好的材质实例

 // 声明一个变量用于存储加载好的材质实例var mat;mtlLoader.load('./male02/male02.mtl',function(materials){// 调用预加载函数,作用: 让浏览器提前加载指定资源(加载后并不执行),在需要执行的时候再执行materials.preload();mat=materials;})

载入模型材质

   // 创建加载mtl的对象,manager作为参数传入var mtlLoader = new MTLLoader(manager);// 加载mtl 文件 ,参数1: mtl文件路径 , 参数2:回调函数mtlLoader.load("../../static/536.mtl", function (materials) {// 调用预加载函数,作用: 让浏览器提前加载指定资源(加载后并不执行),在需要执行的时候再执行materials.preload();mat = materials;// 创建objLoader对象var loader = new OBJLoader(manager);loader.setMaterials(mat);loader.load("../../static/536.obj", function (obj) {object = obj;},onProgress,onError);});

定义onproces函数用于显示模型的加载进度和加载出错函数

 // 定义onproces函数用于显示模型的加载进度function onProgress(xhr) {//做一个判断,如果获取到模型信息就控制台输出一个模型进度if (xhr.lengthComputable) {const percentComplete = (xhr.loaded / xhr.total) * 100;console.log("model " + Math.round(percentComplete, 2) + "% downloaded");}}// 加载出错的函数,暂不编写function onError() {}

作为加载obj文件回调函数的参数

vue使用three.js加载obj和mtl相关推荐

  1. threejs加载服务器文件,如何使用Three.js加载obj和mtl文件

    OBJ和MTL是3D模型的几何模型文件和材料文件. 在最新的three.js版本(r78)中,以前的OBJMTLLoader类已废弃. 现在要加载OBJ和MTL文件,需要结合OBJLoader和MTL ...

  2. Three.js加载.obj和.mtl文件(无法加载材质、路径错误问题)

    加载.obj模型文件 本文是Three.js电子书的14.3节 使用三维软件导出.obj模型文件的时候,会同时导出一个材质文件.mtl, .obj和.stl文件包含的信息一样都是几何体顶点相关数据,材 ...

  3. Vue引入Thee.js 加载obj文件和mtl文件并上纹理贴图

    目录 1.引入包三个包 2.在vue 组件内 import文件 3.在mound钩子函数内调用 4.效果图 部分加载报错 另:HTML页面使用three加载obj文件和mtl文件 1.引入包三个包 n ...

  4. HTML版的使用three.js加载obj和mtl文件并上贴图

    目录 效果图 全部代码 另: [Vue版的](https://blog.csdn.net/weixin_44601948/article/details/108502580) 效果图 全部代码 < ...

  5. three.js加载obj模型和材质

    1.Vue中安装three.js和加载用的包 安装three.js使用npm install three --save 安装加载obj和mtl文件的包npm install three-obj-mtl ...

  6. three.js加载OBJ模型

    three.js加载OBJ模型 推荐一个免费下载3D模型的网址https://www.cgtrader.com,包含多种格式(obj, mtl等). three.js现在是es6语法,旧版本是es5的 ...

  7. VR 效果 前端使用 three.js 加载 Obj,drc文件(三维模型文件)

    VR 效果 前端使用 three.js 加载 Obj(三维模型文件) 前言:我对 three.js 并不熟!只是朋友有这个需求,写了几个 demo 运行,能看~.如果想深入学习,还需要多看看官方文档, ...

  8. vue中通过js加载图片显现

    在vue开发中会遇到这样的问题:有时需要在img中加载多个静态资源的图片,如果我们将src的路径整个定义成一个变量,会发现img加载不出来正个图片的路径,其实此时需要require()来加载静态资源的 ...

  9. 首次使用three.js加载obj模型未成功

    接此,https://blog.csdn.net/bcbobo21cn/article/details/110676331 基本代码如下: <!DOCTYPE html> <html ...

最新文章

  1. php成绩管理前段模板,php学生成绩管理系统(模板).doc
  2. python3 判断ip类型 ipv4 ipv6
  3. 人一生中最该看清的5个真相
  4. 初学者指南:服务器基本技术名词
  5. ANSI颜色字体一篇通
  6. 如何用 200 行 JavaScript 代码实现人脸检测?
  7. java nio 关闭channel_JAVA NIO(二)Channel通道
  8. python新式类中的__new__方法与__init__方法
  9. matlab分段函数的表达_构造一个新函数遇到的matlab基础问题
  10. WinSCP通过puTTYgen生成的ppk文件访问远程主机
  11. libyuv 交叉编译
  12. html鼠标悬停下划线消失,CSS3 2个实用的鼠标悬停文本下划线动画效果
  13. 数据库事务Transaction)那点事
  14. 营养素的基础知识1(非技术文)
  15. 使用NAudio音频文件剪切指定片段
  16. 语音增强 理论与实践 pdf_初中英语语音教学策略研究 (结题报告)
  17. python中怎么编写程序_python写完程序怎么运行
  18. 达梦数据库全文索引使用示例
  19. 解决运行gazebo时出现“[gazebo-2] process has died [pid 7920, exit code 255.....“的问题
  20. 第一周-3.2道路升级

热门文章

  1. svn——“验证位置时发生错误”的解决办法
  2. Floyd算法求最短路径(附代码实例)
  3. 什么是SWFObject,如何使用!
  4. swfobject.js for flash 的使用(for swfobject 2.0)
  5. PHP:【微信小程序】初识微信小程序,微信小程序配置
  6. 高性能永磁交流伺服电机系统控制策略
  7. 电子商务网站一般架构有哪些
  8. Mysql的日志详解(详细)
  9. 介绍python中几种遍历列表的for循环方法
  10. 请你谈谈如何破坏双亲委派模型?