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 相关文章推荐
漂亮的widgets,支持换肤和后期开发新皮肤
Apr 23 Javascript
自己实现string的substring方法 人民币小写转大写,数字反转,正则优化
Sep 02 Javascript
父节点获取子节点的字符串示例代码
Feb 26 Javascript
JavaScript数据结构与算法之栈与队列
Jan 29 Javascript
Angularjs中$http以post请求通过消息体传递参数的实现方法
Aug 05 Javascript
轻松实现js选项卡切换效果
Sep 24 Javascript
javascript实现多张图片左右无缝滚动效果
Mar 22 Javascript
jQuery实现对网页节点的增删改查功能示例
Sep 18 jQuery
利用原生js实现html5小游戏之打砖块(附源码)
Jan 03 Javascript
vue axios请求频繁时取消上一次请求的方法
Nov 10 Javascript
微信小程序模板template简单用法示例
Dec 04 Javascript
JavaScript函数的4种调用方法实例分析
Mar 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
第一个无线电台是由谁发明的
2021/03/01 无线电
php adodb分页实现代码
2009/03/19 PHP
PHP读取CURL模拟登录时生成Cookie文件的方法
2014/11/04 PHP
详解PHP的Yii框架的运行机制及其路由功能
2016/03/17 PHP
Yii2框架实现注册和登录教程
2016/09/30 PHP
PHP实现文字写入图片功能
2019/02/18 PHP
实例介绍PHP删除数组中的重复元素
2019/03/03 PHP
php如何获取Http请求
2020/04/30 PHP
phpstorm激活码2020附使用详细教程
2020/09/25 PHP
如何做到打开一个页面,过几分钟自动转到另一页面
2007/04/20 Javascript
最简单的js图片切换效果实现代码
2011/09/24 Javascript
js简易namespace管理器 实例代码
2013/06/21 Javascript
Extjs grid panel自带滚动条失效的解决方法
2014/09/11 Javascript
jQuery解析XML与传统JavaScript方法的差别实例分析
2015/03/05 Javascript
JavaScript修改作用域外变量的方法
2016/03/25 Javascript
Vue组件tree实现树形菜单
2017/04/13 Javascript
基于javascript中的typeof和类型判断(详解)
2017/10/27 Javascript
vue实现重置表单信息为空的方法
2018/09/29 Javascript
nodejs基础之常用工具模块util用法分析
2018/12/26 NodeJs
js嵌套的数组扁平化:将多维数组变成一维数组以及push()与concat()区别的讲解
2019/01/19 Javascript
JS对象属性的检测与获取操作实例分析
2020/03/17 Javascript
[37:29]完美世界DOTA2联赛PWL S2 LBZS vs Forest 第二场 11.19
2020/11/19 DOTA
Python中文编码那些事
2014/06/25 Python
Python实现matplotlib显示中文的方法详解
2018/02/06 Python
使用DataFrame删除行和列的实例讲解
2018/04/08 Python
如何教少儿学习Python编程
2020/07/10 Python
Python QTimer实现多线程及QSS应用过程解析
2020/07/11 Python
Python之字典对象的几种创建方法
2020/09/30 Python
pycharm如何设置官方中文(如何汉化)
2020/12/29 Python
家庭睡衣和家庭用品:Little Blue House
2018/03/18 全球购物
BannerBuzz加拿大:在线定制横幅印刷、广告和标志
2020/03/10 全球购物
项目采购员岗位职责
2014/04/15 职场文书
排查整治工作方案
2014/06/09 职场文书
三年级学生评语大全
2014/12/26 职场文书
介绍信如何写
2015/01/31 职场文书
Vue实现动态查询规则生成组件
2021/05/27 Vue.js