AngularJS中使用three.js的实例详解


Posted in Javascript onJuly 21, 2017

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的使用注意事项及实例,大家如有疑问请留言,感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!

Javascript 相关文章推荐
基于逻辑运算的简单权限系统(实现) JS 版
Mar 24 Javascript
33种Javascript 表格排序控件收集
Dec 03 Javascript
jQuery实现表格颜色交替显示的方法
Mar 09 Javascript
jQuery leonaScroll 1.1 自定义滚动条插件(推荐)
Sep 17 Javascript
JavaScript的事件机制详解
Jan 17 Javascript
前端构建工具之gulp的语法教程
Jun 12 Javascript
JS控制鼠标拒绝点击某一按钮的实例
Dec 29 Javascript
jquery+ajaxform+springboot控件实现数据更新功能
Jan 22 jQuery
超详细的5个Shell脚本实例分享(值得收藏)
Aug 15 Javascript
webpack的 rquire.context用法实现工程自动化的方法
Feb 07 Javascript
JS如何在不同平台实现多语言方式
Jul 16 Javascript
k8s node节点重新加入master集群的实现
Feb 22 Javascript
Axios学习笔记之使用方法教程
Jul 21 #Javascript
Vue学习笔记进阶篇之函数化组件解析
Jul 21 #Javascript
用javascript获取任意颜色的更亮或更暗颜色值示例代码
Jul 21 #Javascript
基于JavaScript实现数码时钟效果
Mar 30 #Javascript
bootstrap多层模态框滚动条消失的问题
Jul 21 #Javascript
基于JavaScript实现无缝滚动效果
Jul 21 #Javascript
基于JavaScript实现选项卡效果
Jul 21 #Javascript
You might like
php XMLWriter类的简单示例代码(RSS输出)
2011/09/30 PHP
PHP编码规范的深入探讨
2013/06/06 PHP
php学习笔记之基础知识
2014/11/08 PHP
Yii中srbac权限扩展模块工作原理与用法分析
2016/07/14 PHP
PHP 以POST方式提交XML、获取XML,解析XML详解及实例
2016/10/26 PHP
ZendFramework框架实现连接两个或多个数据库的方法
2016/12/08 PHP
php从数据库读取数据,并以json格式返回数据的方法
2018/08/21 PHP
php微信公众号开发之校园图书馆
2018/10/20 PHP
PHP实现笛卡尔积算法的实例讲解
2019/12/22 PHP
自动检查并替换文本框内的字符
2006/06/30 Javascript
javascript实现在某个元素上阻止鼠标右键事件的方法和实例
2014/08/12 Javascript
JavaScript获取网页支持表单字符集的方法
2015/04/02 Javascript
详解JavaScript的流程控制语句
2015/11/30 Javascript
ztree获取选中节点时不能进入可视区域出现BUG如何解决
2015/12/03 Javascript
javascript实现在网页中运行本地程序的方法
2016/02/03 Javascript
node模块机制与异步处理详解
2016/03/13 Javascript
Vue.js 60分钟快速入门教程
2017/03/28 Javascript
详解vue微信网页授权最终解决方案
2019/06/16 Javascript
layui 富文本图片上传接口与普通按钮 文件上传接口的例子
2019/09/23 Javascript
vue项目创建步骤及路由router
2020/01/14 Javascript
vue瀑布流组件实现上拉加载更多
2020/03/10 Javascript
JS监听组合按键思路及实现过程
2020/04/17 Javascript
angular组件间传值测试的方法详解
2020/05/07 Javascript
js实现特别简单的钟表效果
2020/09/14 Javascript
Python的Urllib库的基本使用教程
2015/04/30 Python
python各种语言间时间的转化实现代码
2016/03/23 Python
浅析Python中return和finally共同挖的坑
2017/08/18 Python
12个步骤教你理解Python装饰器
2019/07/01 Python
Python字符串格式化输出代码实例
2019/11/22 Python
中秋节超市促销方案
2014/01/30 职场文书
冰淇淋店的创业计划书
2014/02/07 职场文书
3.15国际消费者权益日主题活动活动总结
2014/03/16 职场文书
2015年学校远程教育工作总结
2015/07/20 职场文书
海弦WR-800F
2022/04/05 无线电
SQL Server #{}可以防止SQL注入
2022/05/11 SQL Server
Python实现仓库管理系统
2022/05/30 Python