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 相关文章推荐
jQuery EasyUI 中文API Layout(Tabs)
Apr 27 Javascript
bgsound 背景音乐 的一些常用方法及特殊用法小结
May 11 Javascript
javascript 使用 NodeList需要注意的问题
Mar 04 Javascript
js取消单选按钮选中并判断对象是否为空
Nov 14 Javascript
JS 仿腾讯发表微博的效果代码
Dec 25 Javascript
使用js画图之正弦曲线
Jan 12 Javascript
javascript实现控制的多级下拉菜单
Jul 05 Javascript
javascript原型继承工作原理和实例详解
Apr 07 Javascript
ros::spin() 和 ros::spinOnce()函数的区别及详解
Oct 01 Javascript
总结Javascript中数组各种去重的方法
Oct 04 Javascript
微信小程序开发之路由切换页面重定向问题
Sep 18 Javascript
js实现盒子拖拽动画效果
Aug 09 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
一个简单的自动发送邮件系统(二)
2006/10/09 PHP
PHP编程函数安全篇
2013/01/08 PHP
mac下Apache + MySql + PHP搭建网站开发环境
2014/06/02 PHP
PHP翻页跳转功能实现方法
2020/11/30 PHP
smarty高级特性之对象的使用方法
2015/12/25 PHP
利用PHP抓取百度阅读的方法示例
2016/12/18 PHP
thinkphp5框架调用其它控制器方法 实现自定义跳转界面功能示例
2019/07/03 PHP
DD_belatedPNG,IE6下PNG透明解决方案(国外)
2010/12/06 Javascript
javascript作用域容易记错的两个地方分析
2012/06/22 Javascript
javascript jscroll模拟html元素滚动条
2012/12/18 Javascript
一些常用弹出窗口/拖放/异步文件上传等实用代码
2013/01/06 Javascript
D3.js 从P元素的创建开始(显示可加载数据)
2014/10/30 Javascript
JS点击链接后慢慢展开隐藏着图片的方法
2015/02/17 Javascript
基于javascript实现图片左右切换效果
2016/01/25 Javascript
JavaScript中Number对象的toFixed() 方法详解
2016/09/02 Javascript
JS图片放大效果简单实现代码
2016/09/08 Javascript
原生JS京东轮播图代码
2017/03/22 Javascript
vue如何在自定义组件中使用v-model
2018/05/14 Javascript
Vue组件之极简的地址选择器的实现
2018/05/31 Javascript
vue中在vuex的actions中请求数据实例
2019/11/08 Javascript
40行代码把Vue3的响应式集成进React做状态管理
2020/05/20 Javascript
python 控制语句
2011/11/03 Python
Python网络爬虫神器PyQuery的基本使用教程
2018/02/03 Python
Python cookbook(数据结构与算法)从序列中移除重复项且保持元素间顺序不变的方法
2018/03/13 Python
对python插入数据库和生成插入sql的示例讲解
2018/11/14 Python
利用Python小工具实现3秒钟将视频转换为音频
2019/10/29 Python
浅析pip安装第三方库及pycharm中导入第三方库的问题
2020/03/10 Python
html5构建触屏网站之touch事件介绍
2013/01/07 HTML / CSS
快速创建 HTML5 Canvas 电信网络拓扑图的示例代码
2018/03/21 HTML / CSS
美国生鲜及杂货电商:FreshDirect
2018/01/29 全球购物
中软国际Java程序员笔试题
2014/07/19 面试题
自立自强的名人事例
2014/02/10 职场文书
元旦联欢会感言
2014/03/04 职场文书
2015年林业工作总结
2015/05/14 职场文书
python 实现定时任务的四种方式
2021/04/01 Python
Windows7下FTP搭建图文教程
2022/08/05 Servers