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 相关文章推荐
Js中sort()方法的用法
Nov 04 Javascript
根据经纬度计算地球上两点之间的距离js实现代码
Mar 05 Javascript
基于JQuery的列表拖动排序实现代码
Oct 01 Javascript
Javascript中的delete操作符详细介绍
Jun 06 Javascript
js上传图片及预览功能实例分析
Apr 24 Javascript
JavaScript常用函数工具集:lao-utils
Mar 01 Javascript
js倒计时显示实例
Dec 11 Javascript
JS判断指定dom元素是否在屏幕内的方法实例
Jan 23 Javascript
Angularjs在360兼容模式下取数据缓存问题的解决办法
Jun 22 Javascript
微信小程序实现跑马灯效果完整代码(附效果图)
May 30 Javascript
Vue+Node实现商品列表的分页、排序、筛选,添加购物车功能详解
Dec 07 Javascript
vue相关配置文件详解及多环境配置详细步骤
May 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中循环语句的用法介绍
2012/01/30 PHP
php实现两表合并成新表并且有序排列的方法
2014/12/05 PHP
详谈symfony window下的安装 安装时候出现的问题以及解决方法
2017/09/28 PHP
网页图片延时加载的js代码
2010/04/22 Javascript
一个网马的tips实现分析
2010/11/28 Javascript
js 通用javascript函数库整理
2011/08/14 Javascript
javascript表单验证使用示例(javascript验证邮箱)
2014/01/07 Javascript
基于jQuery Tipso插件实现消息提示框特效
2016/03/16 Javascript
浅谈Javascript中的12种DOM节点类型
2016/08/19 Javascript
VueJS组件之间通过props交互及验证的方式
2017/09/04 Javascript
node.js中路由,中间件,ge请求和post请求的参数详解
2017/12/26 Javascript
vue.js 实现点击展开收起动画效果
2018/07/07 Javascript
bootstrap实现点击删除按钮弹出确认框的实例代码
2018/08/16 Javascript
ES6 class类链式继承,实例化及react super(props)原理详解
2020/02/15 Javascript
Element PageHeader页头的使用方法
2020/07/26 Javascript
JS typeof fn === 'function' &amp;&amp; fn()详解
2020/08/22 Javascript
详解vue修改elementUI的分页组件视图没更新问题
2020/11/13 Javascript
Python yield 使用浅析
2015/05/28 Python
python监控文件或目录变化
2016/06/07 Python
python生成1行四列全2矩阵的方法
2018/08/04 Python
Python从数据库读取大量数据批量写入文件的方法
2018/12/10 Python
Django框架视图层URL映射与反向解析实例分析
2019/07/29 Python
Canvas 像素处理之改变透明度的实现代码
2019/01/08 HTML / CSS
英国领先的葡萄酒专家:Majestic Wine
2017/05/30 全球购物
Java如何格式化日期
2012/08/07 面试题
求职信格式范本
2013/11/15 职场文书
大二学期个人自我评价
2014/01/13 职场文书
入学生会自荐书范文
2014/02/05 职场文书
学雷锋标兵事迹材料
2014/08/18 职场文书
精神文明建设先进个人事迹材料
2014/12/24 职场文书
团队合作精神学习心得体会
2016/01/19 职场文书
MYSQL 运算符总结
2021/11/11 MySQL
2007年老电脑安装win11会怎么样? 网友实测win11在老电脑运行良好
2021/11/21 数码科技
JavaScript实现酷炫的鼠标拖尾特效
2022/02/18 Javascript
剧场版《转生恶役只好拔除破灭旗标》公开最新视觉图 2023年上映
2022/04/02 日漫
Nginx 配置 HTTPS的详细过程
2022/05/30 Servers