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 相关文章推荐
HTTP状态代码以及定义(解释)
Feb 02 Javascript
再谈javascript图片预加载技术(详细演示)
Mar 12 Javascript
jQuery焦点图切换特效插件封装实例
Aug 18 Javascript
浅谈JavaScript Date日期和时间对象
Dec 29 Javascript
基于javascript实现右下角浮动广告效果
Jan 08 Javascript
AngularJS入门教程之更多模板详解
Aug 19 Javascript
详解JavaScript添加给定的标签选项
Sep 17 Javascript
vue中npm包全局安装和局部安装过程
Sep 03 Javascript
layui的select联动实现代码
Sep 28 Javascript
openlayers 3实现车辆轨迹回放
Sep 24 Javascript
JavaScript WeakMap使用详解
Feb 05 Javascript
利用uni-app生成微信小程序的踩坑记录
Apr 05 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
十天学会php之第三天
2006/10/09 PHP
php 自写函数代码 获取关键字 去超链接
2010/02/08 PHP
JQuery写动态树示例代码
2013/07/31 Javascript
js确认删除对话框效果的示例代码
2014/02/20 Javascript
jquery1.10给新增元素绑定事件的方法
2014/03/06 Javascript
jQuery表格排序组件-tablesorter使用示例
2014/05/26 Javascript
深入分析escape()、encodeURI()、encodeURIComponent()的区别及示例
2014/08/04 Javascript
快速获取/设置iframe内对象元素的几种js实现方法
2016/05/20 Javascript
基于JavaScript实现前端文件的断点续传
2016/10/17 Javascript
浅谈vue的几种绑定变量的值 防止其改变的方法
2018/03/01 Javascript
vue-baidu-map 进入页面自动定位的解决方案(推荐)
2018/04/28 Javascript
结合Vue控制字符和字节的显示个数的示例
2018/05/17 Javascript
Bootstrap的aria-label和aria-labelledby属性实例详解
2018/11/02 Javascript
vue 地图可视化 maptalks 篇实例代码详解
2019/05/21 Javascript
基于Node.js的大文件分片上传示例
2019/06/19 Javascript
layui加载数据显示loading加载完成loading消失的实例代码
2019/09/23 Javascript
vue el-table实现行内编辑功能
2019/12/11 Javascript
js删除指定位置超链接中含有百度与360的标题
2021/01/06 Javascript
Python程序设计入门(1)基本语法简介
2014/06/13 Python
Python文件处理
2016/02/29 Python
Python实现将doc转化pdf格式文档的方法
2018/01/19 Python
详解python数据结构和算法
2019/04/18 Python
Python中的十大图像处理工具(小结)
2019/06/10 Python
python实现实时视频流播放代码实例
2020/01/11 Python
Autopep8的使用(python自动编排工具)
2021/03/02 Python
英国精品买手店:Browns Fashion
2016/09/29 全球购物
xml有哪些解析技术?区别是什么
2016/04/26 面试题
校园新闻广播稿
2014/01/10 职场文书
检举信的格式及范文
2014/04/04 职场文书
新学期开学标语
2014/06/30 职场文书
幼儿园教师的自我评价范文
2014/09/17 职场文书
老兵退伍标语
2014/10/07 职场文书
毕业设计论文致谢词
2015/05/14 职场文书
.Net Core导入千万级数据至Mysql的步骤
2021/05/24 MySQL
为Centos安装指定版本的Docker
2022/04/01 Servers
ipad隐藏软件app图标方法
2022/04/19 数码科技