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 相关文章推荐
JavaScript asp.net 获取当前超链接中的文本
Apr 14 Javascript
JavaScript 学习笔记(五)
Dec 31 Javascript
javascript getElementsByClassName实现代码
Oct 11 Javascript
VS2008中使用JavaScript调用WebServices
Dec 18 Javascript
究竟什么是Node.js?Node.js有什么好处?
May 29 Javascript
Angularjs过滤器使用详解
May 25 Javascript
jQuery实现邮箱下拉列表自动补全功能
Sep 08 Javascript
bootstrap导航条实现代码
Dec 28 Javascript
浅谈VUE监听窗口变化事件的问题
Feb 24 Javascript
如何从零开始利用js手写一个Promise库详解
Apr 19 Javascript
Vue2 监听属性改变watch的实例代码
Aug 27 Javascript
8 个有用的JS技巧(推荐)
Jul 03 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自动更新新闻DIY
2006/10/09 PHP
phpmyadmin的#1251问题
2006/11/25 PHP
php下清空字符串中的HTML标签的代码
2010/09/06 PHP
php算开始时间到过期时间的相隔的天数
2011/01/12 PHP
php定时计划任务的实现方法详解
2013/06/06 PHP
使用PHP静态变量当缓存的方法
2013/11/13 PHP
php实现上传图片生成缩略图示例
2014/04/13 PHP
php中smarty实现多模版网站的方法
2015/06/11 PHP
ThinkPHP框架分布式数据库连接方法详解
2017/03/14 PHP
PHP实现字符串大小写转函数的功能实例
2019/02/06 PHP
Laravel框架模型的创建及模型对数据操作示例
2019/05/07 PHP
漂亮的提示信息(带箭头)
2007/03/21 Javascript
js AspxButton的客户端操作
2009/06/26 Javascript
Jquery图片滚动与幻灯片的实例代码
2013/04/08 Javascript
javascript实现可改变滚动方向的无缝滚动实例
2013/06/17 Javascript
javascript中的undefined和not defined区别示例介绍
2014/02/26 Javascript
JavaScript基础语法、dom操作树及document对象
2014/12/02 Javascript
一步一步封装自己的HtmlHelper组件BootstrapHelper(三)
2016/09/14 Javascript
微信小程序 两种滑动方式(横向滑动,竖向滑动)详细及实例代码
2017/01/13 Javascript
详谈JS中数组的迭代方法和归并方法
2017/08/11 Javascript
微信小程序可滑动月日历组件使用详解
2019/10/21 Javascript
基于PHP pthreads实现多线程代码实例
2020/06/24 Javascript
解决vue数据不实时更新的问题(数据更改了,但数据不实时更新)
2020/10/27 Javascript
[06:48]DOTA2-DPC中国联赛2月26日Recap集锦
2021/03/11 DOTA
python实现识别相似图片小结
2016/02/22 Python
浅谈Django QuerySet对象(模型.objects)的常用方法
2020/03/28 Python
通过Python扫描代码关键字并进行预警的实现方法
2020/05/24 Python
python爬虫中抓取指数的实例讲解
2020/12/01 Python
Python爬取网站图片并保存的实现示例
2021/02/26 Python
CSS3对背景图片的裁剪及尺寸和位置的设定方法
2016/03/07 HTML / CSS
使用layui实现左侧菜单栏及动态操作tab项的方法
2020/11/10 HTML / CSS
美国Curacao百货连锁店网站:iCuracao.com
2019/07/20 全球购物
明星员工获奖感言
2014/08/14 职场文书
2015年语言文字工作总结
2015/07/23 职场文书
安全生产培训心得体会
2016/01/18 职场文书