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 相关文章推荐
你的编程语言可以这样做吗?
Sep 07 Javascript
jquery常用技巧及常用方法列表集合
Apr 06 Javascript
javascript设计模式 封装和信息隐藏(上)
Jul 24 Javascript
获取offsetTop和offsetLeft值的js代码(兼容)
Apr 16 Javascript
13 款最热门的 jQuery 图像 360 度旋转插件推荐
Dec 09 Javascript
JS弹出可拖拽可关闭的div层完整实例
Feb 13 Javascript
JS实现环形进度条(从0到100%)效果
Jul 05 Javascript
详解Node.Js如何处理post数据
Sep 19 Javascript
angular中实现控制器之间传递参数的方式
Apr 24 Javascript
bootstrap table合并行数据并居中对齐效果
Oct 17 Javascript
浅谈JS的原型和继承
May 08 Javascript
JavaScript享元模式原理与用法实例详解
Mar 09 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中操作ini配置文件的方法
2013/04/25 PHP
php使用pdo连接mssql server数据库实例
2014/12/25 PHP
kindeditor 加入七牛云上传的实例讲解
2017/11/12 PHP
JS 获取span标签中的值的代码 支持ie与firefox
2009/08/24 Javascript
jquery 表格分页等操作实现代码(pagedown,pageup)
2010/04/11 Javascript
javascript 当前日期转化为中文的实现代码
2010/05/13 Javascript
html向js方法传递参数具体实现
2013/08/08 Javascript
如何设置一定时间内只能发送一次请求
2014/02/28 Javascript
JS 获取鼠标左右键的键值方法
2014/10/11 Javascript
node.js中的fs.createWriteStream方法使用说明
2014/12/17 Javascript
JavaScript中几种排序算法的简单实现
2015/07/29 Javascript
jQuery设置单选按钮radio选中/不可用的实例代码
2016/06/24 Javascript
基于JS分页控件实现简单美观仿淘宝分页按钮效果
2016/11/07 Javascript
js正则表达式最长匹配(贪婪匹配)和最短匹配(懒惰匹配)用法分析
2016/12/27 Javascript
JS中Array数组学习总结
2017/01/18 Javascript
微信小程序上传图片到服务器实例代码
2017/11/07 Javascript
vue实现前进刷新后退不刷新效果
2018/01/26 Javascript
mui js控制开关状态、修改switch开关的值方法
2019/09/03 Javascript
vue获取data数据改变前后的值方法
2019/11/07 Javascript
ES6的异步操作之promise用法和async函数的具体使用
2019/12/06 Javascript
antd vue table跨行合并单元格,并且自定义内容实例
2020/10/28 Javascript
Python科学画图代码分享
2017/11/29 Python
Python简单生成随机数的方法示例
2018/03/31 Python
caffe binaryproto 与 npy相互转换的实例讲解
2018/07/09 Python
Python多继承原理与用法示例
2018/08/23 Python
在Python中使用Neo4j的方法
2019/03/14 Python
python读写文件write和flush的实现方式
2020/02/21 Python
python3中datetime库,time库以及pandas中的时间函数区别与详解
2020/04/16 Python
Python matplotlib实时画图案例
2020/04/23 Python
keras做CNN的训练误差loss的下降操作
2020/06/22 Python
Canvas图片分割效果的实现
2019/07/29 HTML / CSS
康帕斯酒店预订:Compass Hospitality(支持中文)
2018/08/23 全球购物
员工拾金不昧表扬信
2014/01/09 职场文书
公司合作意向书
2014/04/01 职场文书
任命书怎么写
2015/03/02 职场文书
导游词之新疆尼雅遗址
2019/10/16 职场文书