AngularJS中使用three.js的實(shí)例詳解
AngularJS中使用three.js的實(shí)例詳解
一、軌跡球的引入問(wèn)題
一開(kāi)始我是用下面的方式引如軌跡球,但是會(huì)報(bào)Trackballcontrols is undefined的錯(cuò)。
import * as THREE from 'three'; import * as Trackballcontrols from 'three';
但其實(shí)我是能夠在node_module下的threejs的包中找到Trackballcontrols的文件的,我一開(kāi)始以為是引用的路徑?jīng)]對(duì)然后修改路徑到對(duì)應(yīng)包下Trackballcontrols.js所在的位置。嘗試后發(fā)現(xiàn)錯(cuò)誤依然在。google后發(fā)現(xiàn)有類似的問(wèn)題但是他用的是另一個(gè)控制器,解決的方案依然是修改引用方式。修改為required的引用,但實(shí)際上這種方式還是沒(méi)有效果。
最后我發(fā)現(xiàn)Trackballcontrols其實(shí)是有專門(mén)的一個(gè)包的,npm安裝對(duì)應(yīng)的包之后如下引用即可解決問(wèn)題
import * as THREE from 'three'; import * as Trackballcontrols from 'three-trackballcontrols';
二、將renderer.domElement放到對(duì)應(yīng)的dom中
其實(shí)放domElement的方法很簡(jiǎn)單就是找到對(duì)應(yīng)的dom將domElement添加進(jìn)去就好,因?yàn)镹G里對(duì)Dom的直接操作比較少所以有的時(shí)候可能會(huì)覺(jué)得比較麻煩,我一開(kāi)始也考慮過(guò)用JQ或者原生去獲取這個(gè)對(duì)象,但是后面發(fā)現(xiàn)直接用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的問(wèn)題
在NG中如果像平時(shí)一樣通過(guò)下面這種方式進(jìn)行畫(huà)面的render,會(huì)因?yàn)閠his的指向問(wèn)題報(bào)錯(cuò)。
requestAnimationFrame(this.doRender());
而如果用下面這樣的setInterval來(lái)執(zhí)行render畫(huà)面其實(shí)是不穩(wěn)定的,更大的問(wèn)題是,在你離開(kāi)頁(yè)面在返回時(shí),瀏覽器會(huì)一次性執(zhí)行離開(kāi)的這段時(shí)間內(nèi)所有的setInterval中的事件,瀏覽器可能就直接卡死了。
setInterval(()=>{this.doRender()}, 1000/60);
解決這個(gè)問(wèn)題還是得用requestAnimationFrame,既然我們已經(jīng)知道是this指向?qū)е碌膯?wèn)題,那么其實(shí)綁定下this就可以,因?yàn)閞equestAnimationFrame的參數(shù)類型限制,所以我們需要對(duì)renderer用箭頭函數(shù)做一下處理就能滿足正常效果了。
requestAnimationFrame(()=>{return this.doRender()});
四、軌跡球角度改變的流暢性
做完上面三個(gè)步奏后我們就能看見(jiàn)和之前我那篇博客提到的一樣的模型效果了,但能夠顧很明顯的發(fā)現(xiàn)角度變換的時(shí)候流暢性變差了。一開(kāi)始我認(rèn)為是框架的問(wèn)題會(huì)造成渲染一次的周期變長(zhǎng),有點(diǎn)楞逼不知道這下怎么改了。結(jié)果在看軌跡球源碼找解決方案的時(shí)候發(fā)現(xiàn)其實(shí)特別簡(jiǎn)單,改一下屬性就可以了,把軌跡球的rotateSpeed屬性寫(xiě)大點(diǎn)就好了。
五、在three.js中如何通過(guò)鼠標(biāo)位置獲取想要選擇的Object
其實(shí)這個(gè)看起來(lái)好像很難其實(shí)Three.js的開(kāi)發(fā)指南里面已經(jīng)有對(duì)應(yīng)的例子和方法了,代碼如下:
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])//這個(gè)就是點(diǎn)中的對(duì)象
}
}
//綁定事件
$(this.renderer.domElement).on('mousedown', (e)=>{});
里面的邏輯我就不詳細(xì)解釋了。
以上就是關(guān)于 AngularJS中使用three.js的使用注意事項(xiàng)及實(shí)例,大家如有疑問(wèn)請(qǐng)留言,感謝閱讀,希望能幫助到大家,謝謝大家對(duì)本站的支持!
- Angularjs 事件指令詳細(xì)整理
- 詳解angularjs獲取元素以及angular.element()用法
- 使用AngularJS編寫(xiě)多選按鈕選中時(shí)觸發(fā)指定方法的指令代碼詳解
- AngularJS實(shí)現(xiàn)的JSONP跨域訪問(wèn)數(shù)據(jù)傳輸功能詳解
- 詳解使用angularjs的ng-options時(shí)如何設(shè)置默認(rèn)值(初始值)
- 使用AngularJS對(duì)表單提交內(nèi)容進(jìn)行驗(yàn)證的操作方法
- 詳細(xì)AngularJs4的圖片剪裁組件的實(shí)例
- Angularjs的鍵盤(pán)事件的綁定
相關(guān)文章
使用JavaScript的AngularJS庫(kù)編寫(xiě)hello world的方法
這篇文章主要介紹了使用JavaScript的AngularJS庫(kù)編寫(xiě)hello world的方法,AngularJS是一款高人氣的JavaScript庫(kù),需要的朋友可以參考下2015-06-06
Angular5整合富文本編輯器TinyMCE的方法(漢化+上傳)
TinyMCE是一個(gè)輕量級(jí)的富文本編輯器,相對(duì)于CK編輯器更加精簡(jiǎn),但必須滿足絕大部分場(chǎng)景的需要。這篇文章主要介紹了Angular5整合富文本編輯器TinyMCE(漢化+上傳)的相關(guān)知識(shí),需要的朋友可以參考下2020-05-05
Angular模版驅(qū)動(dòng)表單的使用總結(jié)
這篇文章主要介紹了Angular模版驅(qū)動(dòng)表單的使用總結(jié),本文實(shí)現(xiàn)了Angular支持表單的雙向數(shù)據(jù)綁定,校驗(yàn),狀態(tài)管理,非常具有實(shí)用價(jià)值,需要的朋友可以參考下2018-05-05
AngularJS入門(mén)教程之表格實(shí)例詳解
本文主要介紹AngularJS 表格,這里給大家整理了相關(guān)知識(shí),并附代碼實(shí)例,有需要的小伙伴可以參考下2016-07-07
angular2+node.js express打包部署的實(shí)戰(zhàn)
本篇文章主要介紹了angular2+node.js express打包部署的實(shí)戰(zhàn),小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-07-07
Angular2使用Augury來(lái)調(diào)試Angular2程序
這篇文章主要介紹了Angular2使用Augury來(lái)調(diào)試Angular2程序,非常具有實(shí)用價(jià)值,需要的朋友可以參考下2017-05-05
AngularJS折疊菜單實(shí)現(xiàn)方法示例
這篇文章主要介紹了AngularJS折疊菜單實(shí)現(xiàn)方法,結(jié)合完整實(shí)例形式分析了AngularJS實(shí)現(xiàn)折疊菜單的具體步驟與相關(guān)操作技巧,需要的朋友可以參考下2017-05-05
AngularJS動(dòng)態(tài)加載模塊和依賴的方法分析
這篇文章主要介紹了AngularJS動(dòng)態(tài)加載模塊和依賴的方法,結(jié)合實(shí)例形式分析了AngularJS使用ocLazyLoad實(shí)現(xiàn)動(dòng)態(tài)加載的相關(guān)操作技巧,需要的朋友可以參考下2016-11-11

