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下申明对象的几种方法小结
Oct 02 Javascript
巧用jquery解决下拉菜单被Div遮挡的相关问题
Feb 13 Javascript
JS实现div居中示例
Apr 17 Javascript
JavaScript字符串对象toLowerCase方法入门实例(用于把字母转换为小写)
Oct 17 Javascript
基于javascript实现动态显示当前系统时间
Jan 28 Javascript
jQuery实现返回顶部功能
Feb 23 Javascript
node.js实现回调的方法示例
Mar 01 Javascript
xmlplus组件设计系列之选项卡(Tabbar)(5)
May 03 Javascript
基于Bootstrap table组件实现多层表头的实例代码
Sep 07 Javascript
谈谈React中的Render Props模式
Dec 06 Javascript
JS插件amCharts实现绘制柱形图默认显示数值功能示例
Nov 26 Javascript
node.js使用 http-proxy 创建代理服务器操作示例
Feb 10 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表单提交问题的解决方法
2011/04/12 PHP
关于PHP中Object对象的笔记分享
2011/06/28 PHP
PHP的构造方法,析构方法和this关键字详细介绍
2013/10/22 PHP
PHP图片处理之使用imagecopyresampled函数裁剪图片例子
2014/11/19 PHP
PHP不使用内置函数实现字符串转整型的方法示例
2017/07/03 PHP
laravel5.6中的外键约束示例
2019/10/23 PHP
PHP sdk实现在线打包代码示例
2020/12/09 PHP
javascript parseInt 大改造
2009/09/27 Javascript
JavaScript 拾漏补遗
2009/12/27 Javascript
JS获取页面input控件中所有text控件并追加样式属性
2013/02/25 Javascript
js 得到文件后缀(通过正则实现)
2013/07/08 Javascript
javascript 数字格式化输出的实现代码
2013/12/10 Javascript
让input框实现类似百度的搜索提示(基于jquery事件监听)
2014/01/31 Javascript
在myeclipse中如何加入jquery代码提示功能
2014/06/03 Javascript
JavaScript中的fontsize()方法使用详解
2015/06/08 Javascript
jquery html5 视频播放控制代码
2016/11/06 Javascript
关于webpack2和模块打包的新手指南(小结)
2017/08/07 Javascript
如何搭建一个完整的Vue3.0+ts的项目步骤
2020/10/18 Javascript
JavaScript构造函数原理及实现流程解析
2020/11/19 Javascript
Python编码时应该注意的几个情况
2013/03/04 Python
Python2.x与Python3.x的区别
2016/01/14 Python
python中dict字典的查询键值对 遍历 排序 创建 访问 更新 删除基础操作方法
2018/09/13 Python
Python FtpLib模块应用操作详解
2019/12/12 Python
django多种支付、并发订单处理实例代码
2019/12/13 Python
Pytorch 神经网络—自定义数据集上实现教程
2020/01/07 Python
浅谈selenium如何应对网页内容需要鼠标滚动加载的问题
2020/03/14 Python
python怎么对数字进行过滤
2020/07/05 Python
一个基于canvas的移动端图片编辑器的实现
2020/10/28 HTML / CSS
Can a struct inherit from another struct? (结构体能继承结构体吗)
2016/09/25 面试题
财务部绩效考核方案
2014/05/04 职场文书
市场营销专业毕业生求职信
2014/07/21 职场文书
村委会贫困证明范本
2014/09/17 职场文书
社会实践活动报告
2015/02/05 职场文书
社区公民道德宣传日活动总结
2015/03/23 职场文书
员工给公司的建议书
2019/06/24 职场文书
Golang 并发下的问题定位及解决方案
2022/03/16 Golang