扫二维码与项目经理沟通
我们在微信上24小时期待你的声音
解答本文疑问/技术咨询/运营咨询/技术建议/互联网交流
小编给大家分享一下AngularJS中如何使用three.js,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!
创新互联建站长期为上千家客户提供的网站建设服务,团队从业经验10年,关注不同地域、不同群体,并针对不同对象提供差异化的产品和服务;打造开放共赢平台,与合作伙伴共同营造健康的互联网生态环境。为潮州企业提供专业的成都做网站、成都网站设计,潮州网站改版等技术服务。拥有十年丰富建站经验和众多成功案例,为您定制开发。AngularJS中使用three.js的实例详解
一、轨迹球的引入问题
一开始我是用下面的方式引如轨迹球,但是会报Trackballcontrols is undefined的错。
import * as THREE from 'three'; import * as Trackballcontrols from 'three';
但其实我是能够在node_module下的threejs的包中找到Trackballcontrols的文件的,我一开始以为是引用的路径没对然后修改路径到对应包下Trackballcontrols.js所在的位置。尝试后发现错误依然在。google后发现有类似的问题但是他用的是另一个控制器,解决的方案依然是修改引用方式。修改为required的引用,但实际上这种方式还是没有效果。
最后我发现Trackballcontrols其实是有专门的一个包的,npm安装对应的包之后如下引用即可解决问题
import * as THREE from 'three'; import * as Trackballcontrols from 'three-trackballcontrols';
二、将renderer.domElement放到对应的dom中
其实放domElement的方法很简单就是找到对应的dom将domElement添加进去就好,因为NG里对Dom的直接操作比较少所以有的时候可能会觉得比较麻烦,我一开始也考虑过用JQ或者原生去获取这个对象,但是后面发现直接用NG的方法就可以了,代码如下
import { Component, ElementRef, OnInit, OnDestroy, ViewChild } from '@angular/core'; @ViewChild('MapGL') mapGL: ElementRef; initRenderer(){ this.renderer = new THREE.WebGLRenderer(); this.renderer.setSize(1000, 800); this.renderer.setClearColor(0xFFFFFF); this.mapGL.nativeElement.append(this.renderer.domElement); }
三、setInterval和requestAnimationFrame的问题
在NG中如果像平时一样通过下面这种方式进行画面的render,会因为this的指向问题报错。
requestAnimationFrame(this.doRender());
而如果用下面这样的setInterval来执行render画面其实是不稳定的,更大的问题是,在你离开页面在返回时,浏览器会一次性执行离开的这段时间内所有的setInterval中的事件,浏览器可能就直接卡死了。
setInterval(()=>{this.doRender()}, 1000/60);
解决这个问题还是得用requestAnimationFrame,既然我们已经知道是this指向导致的问题,那么其实绑定下this就可以,因为requestAnimationFrame的参数类型限制,所以我们需要对renderer用箭头函数做一下处理就能满足正常效果了。
requestAnimationFrame(()=>{return this.doRender()});
四、轨迹球角度改变的流畅性
做完上面三个步奏后我们就能看见和之前我那篇博客提到的一样的模型效果了,但能够顾很明显的发现角度变换的时候流畅性变差了。一开始我认为是框架的问题会造成渲染一次的周期变长,有点楞逼不知道这下怎么改了。结果在看轨迹球源码找解决方案的时候发现其实特别简单,改一下属性就可以了,把轨迹球的rotateSpeed属性写大点就好了。
五、在three.js中如何通过鼠标位置获取想要选择的Object
其实这个看起来好像很难其实Three.js的开发指南里面已经有对应的例子和方法了,代码如下:
onDocumentMouseDown(event) { event.preventDefault(); let vector = new THREE.Vector3(( event.clientX / window.innerWidth ) * 2 - 1, -( event.clientY / window.innerHeight ) * 2 + 1, 0.5); vector = vector.unproject(this.camera); let raycaster = new THREE.Raycaster(this.camera.position, vector.sub(this.camera.position).normalize()); let intersects = raycaster.intersectObjects(this.scene.children); if (intersects.length > 0) { console.log(intersects[0])//这个就是点中的对象 } } //绑定事件 $(this.renderer.domElement).on('mousedown', (e)=>{});
里面的逻辑我就不详细解释了。
以上是“AngularJS中如何使用three.js”这篇文章的所有内容,感谢各位的阅读!相信大家都有了一定的了解,希望分享的内容对大家有所帮助,如果还想学习更多知识,欢迎关注创新互联网站建设公司行业资讯频道!
另外有需要云服务器可以了解下创新互联建站www.cdcxhl.com,海内外云服务器15元起步,三天无理由+7*72小时售后在线,公司持有idc许可证,提供“云服务器、裸金属服务器、高防服务器、香港服务器、美国服务器、虚拟主机、免备案服务器”等云主机租用服务以及企业上云的综合解决方案,具有“安全稳定、简单易用、服务可用性高、性价比高”等特点与优势,专为企业上云打造定制,能够满足用户丰富、多元化的应用场景需求。
我们在微信上24小时期待你的声音
解答本文疑问/技术咨询/运营咨询/技术建议/互联网交流