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 相关文章推荐
关于query Javascript CSS Selector engine
Apr 12 Javascript
正则表达式中特殊符号及正则表达式的几种方法总结(replace,test,search)
Nov 26 Javascript
JS判断字符串长度的5个方法(区分中文和英文)
Mar 18 Javascript
js检查是否关闭浏览器的方法
Aug 02 Javascript
浅谈js中子页面父页面方法 变量相互调用
Aug 04 Javascript
JavaScript中 ES6 generator数据类型详解
Aug 11 Javascript
JS在浏览器中解析Base64编码图像
Feb 09 Javascript
AngularJS 防止页面闪烁的方法
Mar 09 Javascript
vue+iview+less+echarts实战项目总结
Feb 22 Javascript
JS/HTML5游戏常用算法之碰撞检测 包围盒检测算法详解【矩形情况】
Dec 13 Javascript
8 个有用的JS技巧(推荐)
Jul 03 Javascript
vue实现PC端分辨率适配操作
Aug 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数据库编程之MySQL优化策略概述
2017/08/16 PHP
微信公众号之主动给用户发送消息功能
2019/06/22 PHP
PDO实现学生管理系统
2020/03/21 PHP
JavaScript语句可以不以;结尾的烦恼
2007/03/08 Javascript
JQuery从头学起第一讲
2010/07/04 Javascript
学习js在线html(富文本,所见即所得)编辑器
2012/12/18 Javascript
Extjs4 GridPanel的主要配置参数详细介绍
2013/04/18 Javascript
用JavaScript修改CSS属性的代码
2013/05/06 Javascript
学习JavaScript设计模式(多态)
2015/11/25 Javascript
input点击后placeholder中的提示消息消失
2016/01/15 Javascript
JavaScript实现的可变动态数字键盘控件方式实例代码
2017/07/15 Javascript
解决node-sass偶尔安装失败的方法小结
2018/12/05 Javascript
移动端 Vue+Vant 的Uploader 实现上传、压缩、旋转图片功能
2019/06/10 Javascript
简述vue-cli中chainWebpack的使用方法
2019/07/30 Javascript
微信小程序实现3D轮播图效果(非swiper组件)
2019/09/21 Javascript
vue开发移动端底部导航条功能
2020/04/08 Javascript
[01:00]DOTA2 store: Collection of Artisan's Wonders
2015/08/12 DOTA
[02:46]解说DC:感谢430陪伴我们的DOTA2国际邀请赛岁月
2016/06/29 DOTA
Python找出list中最常出现元素的方法
2016/06/14 Python
Python Socket实现简单TCP Server/client功能示例
2017/08/05 Python
python中利用队列asyncio.Queue进行通讯详解
2017/09/10 Python
python 对多个csv文件分别进行处理的方法
2019/01/07 Python
python隐藏类中属性的3种实现方法
2019/12/19 Python
python能开发游戏吗
2020/06/11 Python
ASP.NET Core中的配置详解
2021/02/05 Python
python如何发送带有附件、正文为HTML的邮件
2021/02/27 Python
英国领先的电视购物零售商:Ideal World
2019/03/18 全球购物
施华洛世奇波兰官网:SWAROVSKI波兰
2019/06/18 全球购物
抽象方法、抽象类怎样声明
2014/10/25 面试题
酒店总经理欢迎词
2014/01/08 职场文书
促销活动策划方案
2014/01/12 职场文书
网上快餐厅创业计划书
2014/02/01 职场文书
《一个小村庄的故事》教学反思
2014/04/13 职场文书
2015年全国爱耳日活动总结
2015/02/27 职场文书
2015年万圣节活动总结
2015/03/24 职场文书
2015年幼儿园教研活动总结
2015/03/25 职场文书