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 相关文章推荐
用jquery存取照片的具体实现方法
Jun 30 Javascript
JsRender for index循环索引用法详解
Oct 31 Javascript
jQuery实现ichat在线客服插件
Dec 29 Javascript
实例讲解javascript注册事件处理函数
Jan 09 Javascript
JS中Json数据的处理和解析JSON数据的方法详解
Jun 29 Javascript
bootstrap Validator 模态框、jsp、表单验证 Ajax提交功能
Feb 17 Javascript
JavaScript实现计数器基础方法
Oct 10 Javascript
js读取本地文件的实例
Dec 22 Javascript
搭建基于express框架运行环境的方法步骤
Nov 15 Javascript
vue中监听返回键问题
Aug 28 Javascript
vue 指令和过滤器的基本使用(品牌管理案例)
Nov 04 Javascript
原生JS实现多条件筛选
Aug 19 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学习教程之第2天
2008/06/15 PHP
php 使用post,get的一种简洁方式
2010/04/25 PHP
PHPAnalysis中文分词类详解
2014/06/13 PHP
在第一个input框内输入内容.textarea自动得到第一个文件框的值的javascript代码
2007/04/20 Javascript
多浏览器兼容性比较好的复制到剪贴板的js代码
2011/10/09 Javascript
js控制表单操作的常用代码小结
2013/08/15 Javascript
js获取IFRAME当前的URL的方法
2013/11/13 Javascript
JavaScript 常见安全漏洞和自动化检测技术
2015/08/21 Javascript
jquery对复选框(checkbox)的操作汇总
2016/01/13 Javascript
AngularJS 单元测试(二)详解
2016/09/21 Javascript
使用Angular.js开发的注意事项
2016/10/19 Javascript
js实现数组去重方法及效率?Ρ? target=
2017/02/14 Javascript
ECMAScript6 新特性范例大全
2017/03/24 Javascript
微信小程序支付功能 php后台对接完整代码分享
2018/06/12 Javascript
详解vue中移动端自适应方案
2019/05/05 Javascript
react实现移动端下拉菜单的示例代码
2020/01/16 Javascript
Vue Cli3 打包配置并自动忽略console.log语句的方法
2020/04/23 Javascript
Javascript执行上下文顺序的深入讲解
2020/11/04 Javascript
JavaScript setTimeout()基本用法有哪些
2020/11/04 Javascript
python合并文本文件示例
2014/02/07 Python
详解python实现识别手写MNIST数字集的程序
2018/08/03 Python
Python实现的合并两个有序数组算法示例
2019/03/04 Python
使用matplotlib中scatter方法画散点图
2019/03/19 Python
python框架flask表单实现详解
2019/11/04 Python
python 遍历pd.Series的index和value
2019/11/26 Python
使用keras实现densenet和Xception的模型融合
2020/05/23 Python
使用CSS3实现SVG路径描边动画效果入门教程
2019/10/21 HTML / CSS
英国豪华针织品牌John Smedley的在线销售商:The Outlet by John Smedley
2018/04/08 全球购物
英国排名第一的LED灯泡网站:LED Bulbs
2019/09/03 全球购物
什么是WEB控件?使用WEB控件有哪些优势?
2012/01/21 面试题
介绍一下Java中标识符的命名规则
2014/02/03 面试题
物流管理专业应届生求职信
2013/11/21 职场文书
《赵州桥》教学反思
2014/02/17 职场文书
大学应届生的自我评价
2014/03/06 职场文书
技能培训通讯稿
2015/07/18 职场文书
springboot集成springCloud中gateway时启动报错的解决
2021/07/16 Java/Android