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 相关文章推荐
JavaScript 序列化对象实现代码
Dec 18 Javascript
jquery实现控制表格行高亮实例
Jun 05 Javascript
JS:window.onload的使用介绍
Nov 13 Javascript
JS小功能(checkbox实现全选和全取消)实例代码
Nov 28 Javascript
jQuery实现响应鼠标滚动的动感菜单效果
Sep 21 Javascript
Bootstrap与KnockoutJs相结合实现分页效果实例详解
May 03 Javascript
JavaScript必知必会(二) null 和undefined
Jun 08 Javascript
js实现自定义进度条效果
Mar 15 Javascript
微信小程序实现点击返回顶层的方法
Jul 12 Javascript
纯js实现页面返回顶部的动画(超简单)
Aug 10 Javascript
laydate日历控件使用方法详解
Nov 20 Javascript
Vue实现自定义下拉菜单功能
Jul 16 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
使用sockets:从新闻组中获取文章(二)
2006/10/09 PHP
mysql 的 like 问题,超强毕杀记!!!
2007/01/18 PHP
基于HTTP长连接的&quot;服务器推&quot;技术的php 简易聊天室
2009/10/31 PHP
PHP获取windows登录用户名的方法
2014/06/24 PHP
PHP接收json 并将接收数据插入数据库的实现代码
2015/12/01 PHP
php使用正则表达式去掉html中的注释方法
2016/11/03 PHP
Yii框架ACF(accessController)简单权限控制操作示例
2019/04/26 PHP
简单的php购物车代码
2020/06/05 PHP
网页里控制图片大小的相关代码
2006/06/13 Javascript
用javascript父窗口控制只弹出一个子窗口
2007/04/10 Javascript
chrome不支持form.submit的解决方案
2015/04/28 Javascript
jquery实现简洁文件上传表单样式
2015/11/02 Javascript
Bootstrap CSS布局之表单
2016/12/17 Javascript
简单好用的nodejs 爬虫框架分享
2017/03/26 NodeJs
nodejs处理图片的中间件node-images详解
2017/05/08 NodeJs
浅谈JavaScript find 方法不支持IE的问题
2017/09/28 Javascript
nodejs使用http模块发送get与post请求的方法示例
2018/01/08 NodeJs
JavaScript中var、let、const区别浅析
2018/06/24 Javascript
深入探索VueJS Scoped CSS 实现原理
2019/09/23 Javascript
关于layui时间回显问题的解决方法
2019/09/24 Javascript
微信小程序批量监听输入框对按钮样式进行控制的实现代码
2019/10/12 Javascript
Vue实现商品飞入购物车效果(电商项目)
2019/11/26 Javascript
跟老齐学Python之集成开发环境(IDE)
2014/09/12 Python
python将unicode转为str的方法
2017/06/21 Python
python与C互相调用的方法详解
2017/07/14 Python
Python实现破解12306图片验证码的方法分析
2017/12/29 Python
解决Python2.7中IDLE启动没有反应的问题
2018/11/30 Python
Python编程深度学习计算库之numpy
2018/12/28 Python
Python Django view 两种return的实现方式
2020/03/16 Python
Python csv文件记录流程代码解析
2020/07/16 Python
详解淘宝H5 sign加密算法
2020/08/25 HTML / CSS
明星员工获奖感言
2014/08/14 职场文书
城市轨道交通工程职业生涯规划书范文
2014/09/16 职场文书
2014党员整改措施思想汇报
2014/10/07 职场文书
2016父亲节感恩话语
2015/12/09 职场文书
Spring中的@Transactional的工作原理
2022/06/05 Java/Android