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的方法就可以了,代码如下
<div #MapGL class="map clearfix"></div>
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的使用注意事项及实例,大家如有疑问请留言,感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!
# AngularJS
# three.js
# AngularJS中使用three.js注意事项
# AngularJS使用three.js
# Angularjs 事件指令详细整理
# 详解angularjs获取元素以及angular.element()用法
# 使用AngularJS编写多选按钮选中时触发指定方法的指令代码详解
# AngularJS实现的JSONP跨域访问数据传输功能详解
# 详解使用angularjs的ng-options时如何设置默认值(初始值)
# 使用AngularJS对表单提交内容进行验证的操作方法
# 详细AngularJs4的图片剪裁组件的实例
# Angularjs的键盘事件的绑定
# 轨迹球
# 我是
# 就可以
# 就能
# 我一
# 会报
# 流畅性
# 的是
# 我就
# 是有
# 鼠标
# 很难
# 如有
# 死了
# 就好
# 更大
# 这段
# 时间内
# 我认为
# 希望能
相关文章:
如何生成腾讯云建站专用兑换码?
Python路径拼接规范_跨平台处理说明【指导】
淘宝制作网站有哪些,淘宝网官网主页?
微信网站制作公司有哪些,民生银行办理公司开户怎么在微信网页上查询进度?
如何用狗爹虚拟主机快速搭建网站?
制作网站怎么制作,*游戏网站怎么搭建?
学校为何禁止电信移动建设网站?
,在苏州找工作,上哪个网站比较好?
制作旅游网站html,怎样注册旅游网站?
企业网站制作公司网页,推荐几家专业的天津网站制作公司?
建站之星Pro快速搭建教程:模板选择与功能配置指南
Swift中循环语句中的转移语句 break 和 continue
安徽网站建设与外贸建站服务专业定制方案
建站主机功能解析:服务器选择与快速搭建指南
专业制作网站的公司哪家好,建立一个公司网站的费用.有哪些部分,分别要多少钱?
定制建站平台哪家好?企业官网搭建与快速建站方案推荐
如何零成本快速生成个人自助网站?
子杰智能建站系统|零代码开发与AI生成SEO优化指南
如何在建站之星网店版论坛获取技术支持?
如何在Windows服务器上快速搭建网站?
厦门模型网站设计制作公司,厦门航空飞机模型掉色怎么办?
如何在阿里云ECS服务器部署织梦CMS网站?
如何设置并定期更换建站之星安全管理员密码?
香港代理服务器配置指南:高匿IP选择、跨境加速与SEO优化技巧
非常酷的网站设计制作软件,酷培ai教育官方网站?
已有域名和空间如何快速搭建网站?
建站之星代理如何获取技术支持?
建站之星代理如何优化在线客服效率?
如何破解联通资金短缺导致的基站建设难题?
南阳网站制作公司推荐,小学电子版试卷去哪里找资源好?
Bpmn 2.0的XML文件怎么画流程图
贸易公司网站制作流程,出口贸易网站设计怎么做?
已有域名如何快速搭建专属网站?
关于BootStrap modal 在IOS9中不能弹出的解决方法(IOS 9 bootstrap modal ios 9 noticework)
代购小票制作网站有哪些,购物小票的简要说明?
南京做网站制作公司,南京哈发网络有限公司,公司怎么样,做网页美工DIV+CSS待遇怎么样?
建站之家VIP精选网站模板与SEO优化教程整合指南
如何在阿里云通过域名搭建网站?
C++时间戳转换成日期时间的步骤和示例代码
制作农业网站的软件,比较好的农业网站推荐一下?
高性能网站服务器配置指南:安全稳定与高效建站核心方案
如何用手机制作网站和网页,手机移动端的网站能制作成中英双语的吗?
,有什么在线背英语单词效率比较高的网站?
视频网站app制作软件,有什么好的视频聊天网站或者软件?
如何制作算命网站,怎么注册算命网站?
制作网站建设的公司有哪些,网站建设比较好的公司都有哪些?
网站制作哪家好,cc、.co、.cm哪个域名更适合做网站?
济南专业网站制作公司,济南信息工程学校怎么样?
青岛网站建设如何选择本地服务器?
如何在Windows 2008云服务器安全搭建网站?
*请认真填写需求信息,我们会在24小时内与您取得联系。