Vue使用Three.js加载glTF模型的方法详解


Posted in Javascript onJune 14, 2020

前言

Three.js是一个跨浏览器的脚本,使用JavaScript函数库或API来在网页浏览器中创建和展示动画的三维计算机图形,基于WebGL实现,对WebGL进行了进一步的封装,简化了多数复杂的接口。

Three.js支持包括 .obj、.gltf等类型的模型结构。glTF(GL传输格式)是Khronos的一个开放项目,它为3D资产提供了一种通用的、可扩展的格式,这种格式既高效又与现代web技术高度互操作。

obj格式的模型只支持顶点、法线、纹理坐标和基本材质,而glTF模型除上述所有内容外,glTF还提供了如下功能:

层级对象
场景信息(光源,相机)
骨骼结构与动画
更可靠的材质和着色器

一、安装引入Three.js

npm install three

在需要使用3D模型的页面导入包:

import * as Three from "three"

在Vue中导入glTF模型需要使用 Three.js 中的 GLTFLoader:

import { GLTFLoader } from "three/examples/jsm/loaders/GLTFLoader"
// 导入轨道模型控制器
import { OrbitControls } from "three/examples/jsm/controls/OrbitControls

二、页面DOM元素渲染

在Vue中,我们需要使用一个 div 元素来作为3D模型的容器:

<div id="container"></div>

页面打开之后,Three.js会给 div 元素添加一个 canvas 子元素用来作为3D模型的画布。

三、初始化

Three.js中最重要的三大组件:

场景——Scene

相机——Camera

渲染器——Renderer

初始化:

mounted(){

  this.initScene()

  this.initContainer()

  this.initCamera()

  this.initRenderer()

  this.initControls()

},

methods:{

   initModelContainer() {

   this.model_container = document.getElementById("container");

   this.model_container.style.height = window.innerHeight + "px";

   this.model_container.style.width = window.innerWidth + "px";

   this.height = this.model_container.clientHeight;

   this.width = this.model_container.clientWidth;

  },

  initScene() {

   this.scene = new Three.Scene();

  },

  

  initCamera() {

    // 照相机

   this.camera = new Three.PerspectiveCamera(70, this.width / this.height, 0.01, 1000);

   this.camera.position.set(-100, 60, 0);

  },

  initRenderer() {

   this.renderer = new Three.WebGLRenderer({ antialias: true, alpha: true });

   this.renderer.setSize(this.width, this.height);

   // 兼容高清屏幕

   this.renderer.setPixelRatio(window.devicePixelRatio);

    // 消除canvas的外边框

   this.renderer.domElement.style.outline = "none";

   this.model_container.appendChild(this.renderer.domElement);

  },

  initControls() {

   this.orbitControls = new OrbitControls(

    this.camera,

    this.renderer.domElement

   );

   // 惯性

   this.orbitControls.enableDamping = true;

   // 动态阻尼系数

   this.orbitControls.dampingFactor = 0.25;

   // 缩放

   this.orbitControls.enableZoom = true;

   // 右键拖拽

   this.orbitControls.enablePan = true;

   // 水平旋转范围

   this.orbitControls.maxAzimuthAngle = Math.PI / 6;

   this.orbitControls.minAzimuthAngle = -Math.PI / 6;

   // 垂直旋转范围

   this.orbitControls.maxPolarAngle = Math.PI / 6;

   this.orbitControls.minPolarAngle = -Math.PI / 6;

  },

}

四、导入glTF模型

将你的 gltf 模型放在 Vue 项目中的 public 文件夹下,注意,只有将 gltf 模型放在静态资源文件夹下才能被访问到。

在钩子函数 mounted 中进行模型加载:

mounted(){

  this.loadModel()

},

methods:{

  loadModel(){

    let that = this

    // gltf模型加载器

    let loader = new GLTFLoader()

    return new Promise(function(resolve, reject){

      loader.load(

        // 模型在 /public/static/building/文件夹下

        "static/building/scene.gltf",

        gltf => {

          console.log(gltf)

          gltf.scene.traverse(object => {

            // 修改模型材质

            let material = ...

            object.material = material

          })

          let group = new Three.Group()

          group.add(gltf.scene)

          let box = new Three.Box3()

          box.setFromObject(group)

          let wrapper = new Three.Object3D()

          wrapper.add(group)

          // 根据自己模型的大小设置位置

          wrapper.position.set(100, -300, 120)

          // 将模型加入到场景中 ! important

          that.scene.add(wrapper)

        },

        xhr => {

          // 模型加载期间的回调函数

          console.log(`${(xhr.loaded / xhr.total) * 100% building model loaded`

      );

        },

        error => {

          // 模型加载出错的回调函数

          console.log("error while loading", error);

          reject("load model error", error);

        }

      )

    })

  }

}

启动项目,模型导入成功,可以根据自己的需求为模型渲染材质。

总结

到此这篇关于Vue使用Three.js加载glTF模型的文章就介绍到这了,更多相关Vue用Three.js加载glTF模型内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Javascript 相关文章推荐
window.open的功能全解析
Oct 10 Javascript
jqGrid增加时--判断开始日期与结束日期(实例解析)
Nov 08 Javascript
让jQuery Mobile不显示讨厌loading界面的方法
Feb 19 Javascript
document.write的几点使用心得
May 14 Javascript
jquery中ajax使用error调试错误的方法
Feb 08 Javascript
JavaScript中的方法重载实例
Mar 16 Javascript
JQuery插件Quicksand实现超炫的动画洗牌效果
May 03 Javascript
JavaScript如何实现组合列表框中元素移动效果
Mar 01 Javascript
基于BootstrapValidator的Form表单验证(24)
Dec 12 Javascript
JS中正则表达式全局匹配模式 /g用法详解
Apr 01 Javascript
如何重置vue打印变量的显示方式
Dec 06 Javascript
浅谈VUE单页应用首屏加载速度优化方案
Aug 28 Javascript
浅谈Vue 自动化部署打包上线
Jun 14 #Javascript
JS定时器如何实现提交成功提示功能
Jun 12 #Javascript
Jquery ajax书写方法代码实例解析
Jun 12 #jQuery
ng-alain的sf如何自定义部件的流程
Jun 12 #Javascript
如何在微信小程序中使用骨架屏的步骤
Jun 12 #Javascript
基于Web Audio API实现音频可视化效果
Jun 12 #Javascript
js实现mp3录音通过websocket实时传送+简易波形图效果
Jun 12 #Javascript
You might like
DedeCMS 核心类TypeLink.class.php摘要笔记
2010/04/07 PHP
基于php中echo用逗号和用点号的区别详解
2018/01/23 PHP
PHP调用其他文件中的类
2018/04/02 PHP
javascript+dom树型菜单类,希望朋友们一起进步
2007/05/03 Javascript
JavaScript中使用arguments获得函数传参个数实例
2014/08/27 Javascript
jQuery实现tag便签去重效果的方法
2015/01/20 Javascript
JavaScript通过使用onerror设置默认图像显示代替alt
2016/03/01 Javascript
微信小程序 教程之wxapp视图容器 scroll-view
2016/10/19 Javascript
jQuery设计思想
2017/03/07 Javascript
用原生JS实现简单的多选框功能
2017/06/12 Javascript
JavaScript算法教程之sku(库存量单位)详解
2017/06/29 Javascript
jquery版轮播图效果和extend扩展
2017/07/18 jQuery
利用node.js爬取指定排名网站的JS引用库详解
2017/07/25 Javascript
vue的一个分页组件的示例代码
2017/12/25 Javascript
详解ES6语法之可迭代协议和迭代器协议
2018/01/13 Javascript
vue 利用路由守卫判断是否登录的方法
2018/09/29 Javascript
Vue 组件封装 并使用 NPM 发布的教程
2018/09/30 Javascript
Vue简单封装axios之解决post请求后端接收不到参数问题
2020/02/16 Javascript
Vant Weapp组件踩坑:picker的初始赋值解决
2020/11/12 Javascript
python中hashlib模块用法示例
2017/10/30 Python
使用apidocJs快速生成在线文档的实例讲解
2018/02/07 Python
django如何实现视图重定向
2019/07/24 Python
python读取指定字节长度的文本方法
2019/08/27 Python
Python使用random模块生成随机数操作实例详解
2019/09/17 Python
基于python实现学生信息管理系统
2019/11/22 Python
Python作用域与名字空间原理详解
2020/03/21 Python
关于前端上传文件全面基础扫盲贴(入门)
2019/08/01 HTML / CSS
amazeui模态框弹出后立马消失并刷新页面
2020/08/19 HTML / CSS
Darphin迪梵官网: 来自巴黎,植物和精油调制的护肤品牌
2016/10/11 全球购物
奥地利票务门户网站:oeticket.com
2019/12/31 全球购物
化学系大学生自荐信范文
2014/03/01 职场文书
我爱我家教学反思
2014/05/01 职场文书
授权委托书范本(单位)
2014/09/28 职场文书
Java异常处理try catch的基本用法
2021/12/06 Java/Android
python实现双链表
2022/05/25 Python
Mysql的Table doesn't exist问题及解决
2022/12/24 MySQL