vue.js+THREE.js演示服务端3D模型流程总结
·场景搭建
使用npm或者其他获取安装three,就像npm i three,之后在需要演示模型的vue组件内import * as THREE from 'three',此时我们就可以创建场景scene、灯光light、镜头、几何体等等开始渲染循环了
镜头控制是必要的,我们不会加载一个3D模型只为了看一面的剪影,从官网可以找到许多种控制器,本项目使用的是npm i three-orbitcontrols
import OrbitControls from 'three-orbitcontrols'
create(){ //创建场景
this.renderer = new THREE.WebGLRenderer();
this.camera = new THREE.PerspectiveCamera( 75, window.innerWidth / window.innerHeight, 0.1, 5000 )
this.camera.position.z = 160
this.camera.position.x = 0
this.camera.position.y = 0
this.scene = new THREE.Scene();
this.scene.add(this.camera)
//鼠标控制镜头
this.controls = new OrbitControls(this.camera)
//创建一个环境灯光
var ambientLight = new THREE.AmbientLight( 0xffffff, 0.4 );
this.scene.add( ambientLight );
//创建一个点灯光
var pointLight = new THREE.PointLight( 0xffffff, 0.5 );
//给相机添加光源
this.camera.add( pointLight );
//渲染器样式
this.renderer.setClearColor(new THREE.Color('black'));
this.renderer.setSize(window.innerWidth, window.innerHeight);
this.renderer.domElement.setAttribute("style"," height:100%;width: 100%;")
30 },
现在有了一个有灯光和控制器但没有模型的场景,而且没有挂载到页面
·引入加载器
显然,我们无法使用代码建立所有的模型,尽管three提供了建立多种几何体的强大功能让我们可以以纯代码开发三维场景,但项目中仍需要three提供的多种3D模型文件的Loader.js来帮助我们将建模软件生产的模型加载成可以添加到scene的object
你可能需要展示stl|obj|3ds|3mf|....等等文件类型,我们可以在已安装的three路径 “\node_modules\three\examples\js\loaders” 下找到所有已支持的类型加载器,如果你找到了3MFLoader.js但没有看到3DSLoader.js,可以到threejs的官方示例下查找使用样例,页面右下角查看源代码就会发现3ds加载器叫TDSLoader.js ;P
官方样例统统使用head写法引入js,这不适合vue,除非你的网站就只有这一个组件演示这一类模型(要知道vue大都是单页面网站),按照不同文件类型按需加载对应的加载器js才是效率的使用方式,那么。。使用ES6提供的import()实现运行时加载
例如objloader.js,将文件从node_modules中移到用户可以获取到的路径下(比如static),就可以按如下方式使用了
somefunction:(path){//模型文件url
......
import('@/static/OBJLoader.js').then(module => {
let Loader = new THREE.OBJLoader();
that.loadermashs(Loader,path)
}).catch(err => {
this.message = "加载器获取失败:"+err;
});
}
onProgress( xhr ) {
if ( xhr.lengthComputable ) {
var percentComplete = xhr.loaded / xhr.total * 100;
//message承接加载进度
this.message = Math.round(percentComplete, 2) + '% 已加载' ;
}
},
onError( xhr ) {
this.message = xhr;
},
loadermashs(Loader,path){
let that = this;
Loader.setPath(path);
Loader.load('', function(object) {
that.scene.add(object);
}, that.onProgress, that.onError);
},
注意:需要手动在OBJLoader.js中首行加入:var THREE = require('three')
e.g 编译时warning:"export 'OBJLoader' (imported as 'THREE') was not found in 'three',是因为THREE.OBJLoader()关系是运行时建立的,怎么消除这个warning我也不知道。。
·挂载与卸载
start(){//挂载到页面开始循环
document.getElementById("hello").appendChild(this.renderer.domElement)
this.running = true;
this.animate()
},
animate() {
this.renderer.render(this.scene, this.camera)
if(this.running)
requestAnimationFrame(this.animate)//再次调用animate
}
running作为关闭标识
webGL中,手动卸载是有必要的,按照开发者原意,系统判断哪些资源可以废弃是不可能的:用户可能在某一帧放弃使用某个模型,也可能在下一帧重新启用,因此自动丢弃不被使用的资源是不合理的,而不做手动处理的后果是当你多次打开演示后:
Error: WebGL: Exceeded 16 live WebGL contexts for this principal, losing the least recently used one on...
所以请在关闭演示之前卸载他们:相关api
if(this.running){
let canvas = document.getElementsByTagName('canvas')[0];
if(canvas){
let gl = canvas.getContext('webgl');
canvas.addEventListener('webglcontextlost', function(e) {
//console.log(e);
}, false);
gl.getExtension('WEBGL_lose_context').loseContext();
}
this.running = false
this.renderer.dispose();
this.scene.dispose();
this.controls.dispose();
}
·其他
网页应用的dialog中展示某obj模型,最终演示效果:

此外还有材质加载、贴图、stl格式jzip问题等等。。有的坑我还没踩只是远远的望了一下,如果同为初学者,那么希望能帮到你
如有见解还请大佬指教:D
vue.js+THREE.js演示服务端3D模型流程总结的更多相关文章
- netty服务端客户端启动流程分析
服务端启动流程 我们回顾前面讲解的netty启动流程,服务端这边有两个EventLoopGroup,一个专门用来处理连接,一个用来处理后续的io事件 服务端启动还是跟nio一样,绑定端口进行监听,我们 ...
- udp服务端收发数据流程
1.创建服务端的socket以便开始通讯.2.绑定ip以及端口号,这样客户端才能找到这个程序.3.因为本地网卡不止一个所以尽量不写死,一般用""空来表示所有本地网卡.4.接下来开始 ...
- hadoop rpc协议客户端与服务端的交互流程
尽管这里是hadoop的rpc服务,但是hadoop还是做到了一次连接仅有一次认证.具体的流程待我慢慢道来. 客户端:这里我们假设ConnectionId对应的Connection并不存在.在调用ge ...
- SimpleRpc-客户端与服务端工作模型探讨
前言 本篇文章讲述客户端与服务端的具体设计细节.有细心的小伙伴发现,客户端和服务端的工作方式不一样:服务端是多线程计算模型,利用工作线程完成数据的读取,而客户端是单线程(利用Reactor线程完成数据 ...
- 浏览器与服务端请求响应流程与HTTP协议
浏览器与服务端请求响应流程图: 1.HTTP概要 1.1. 定义 HTTP(HyperText Transfer Protocol,超文本传输协议)最早就是计算机与计算机之间沟通的一种标准协议,这种 ...
- sofa-rpc 服务端源码流程走读
sofa-rpc是阿里开源的一款高性能的rpc框架,这篇文章主要是对sofa-rpc provider启动服务流程的一个代码走读,下面是我简单绘制的一个基本的关系流程图 下面我们根据sofa-rpc代 ...
- Linux下多进程服务端客户端模型二(粘包问题与一种解决方法)
一.Linux发送网络消息的过程 (1) 应用程序调用write()将消息发送到内核中 ( 2)内核中的缓存达到了固定长度数据后,一般是SO_SNDBUF,将发送到TCP协议层 (3)IP层从TCP层 ...
- Linux下多进程服务端客户端模型一(单进程与多进程模型)
本文将会简单介绍Linux下如何利用C库函数与系统调用编写一个完整的.初级可用的C-S模型. 一.基本模型: 1.1 首先服务器调用socket()函数建立一个套接字,然后bind()端口,开始l ...
- js发送请求给服务端
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
随机推荐
- Thread.Sleep线程休眠-小白向
try { Thread.sleep(); } catch (InterruptedException e) { } 首先这段代码的作用是使当前进程沉睡2S,展现给用户的结果就是画面维持两秒,有个“正 ...
- sqlserver数据库批量插入-SqlBulkCopy
当想在数据库中插入大量数据时,使用insert 不仅效率低,而且会导致一系列的数据库性能问题 当使用insert语句进行插入数据时.我使用了两种方式: 每次插入数据时,都只插入一条数据库,这个会导致每 ...
- 办公达人私藏的EXCEL辅助工具,一人抵十人,高效办公就靠它了!
有很多小伙伴在日常工作中都离不开EXCEL的使用,但EXCEL实在是有太多困难.又复杂的操作,时间紧任务重这一天又废柴了,哎! 别担心,今天将为您分享个逆天强大的EXCEL辅助工具,帮大家快速搞定—— ...
- FlowPortal:流程节点定义有误,合流节点"合流"没有对应的聚焦节点
FB版本:6.00c 报错: 流程节点定义有误,合流节点"合流"没有对应的聚焦节点 解决办法:分流和合流之间的节点不能有其他节点汇入.调整如下后,成功保存.
- android只设置部分控件随着软键盘的出现而腾出空间
转载请标明出处:https://www.cnblogs.com/tangZH/p/12013685.html 在项目过程中,出现了一个需求,软键盘要顶起部分控件,而另一部分控件不动. 关于这种需求,我 ...
- 腾讯云推出一站式 DevOps 解决方案 —— CODING DevOps
在产业互联网的大背景下,如何将人工智能.大数据等前沿技术与实体产业相结合,推动传统企业转型升级,已经成为每一个企业不得不思考的问题.落后的软件研发能力已经拖慢了中国大量企业的数字化转型进程. 为了满足 ...
- Python—Celery 框架使用
一.Celery 核心模块 1. Brokers brokers 中文意思为中间人,在这里就是指任务队列本身,接收生产者发来的消息即Task,将任务存入队列.任务的消费者是Worker,Brokers ...
- Java设计模式13:责任链模式
前言 来菜鸟这个大家庭10个月了,总得来说比较融入了环境,同时在忙碌的工作中也深感技术积累不够,在优秀的人身边工作必须更加花时间去提升自己的技术能力.技术视野,所以开一个系列文章,标题就轻松一点叫做最 ...
- Android组件体系之BroadcastReceiver小结
1.常见分类 BroadCastReceiver,按注册方式可以分为静态广播接收器和动态广播接收器. 静态广播接收器:不受程序是否启动的约束,当应用程序关闭之后,还是可以接收到广播(一般广 ...
- vue3.0 本地调试时Invalid Host header
问题场景: vue在开发时只能在本地浏览器里查看效果,我想在手机端真机调试,连接的代码还是本地环境,这样就不用频繁的发布了,于是绑定域名并指向本机的localhost:8080: 但是用域名访问时浏览 ...