国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > JavaScript > 正文

AngularJS中使用three.js的實例詳解

2019-11-19 16:01:39
字體:
來源:轉載
供稿:網友

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的使用注意事項及實例,大家如有疑問請留言,感謝閱讀,希望能幫助到大家,謝謝大家對本站的支持!

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 云和县| 四会市| 鹤山市| 镇康县| 临海市| 牡丹江市| 新民市| 永川市| 韶山市| 获嘉县| 奈曼旗| 盘锦市| 肥西县| 积石山| 宜宾县| 平顶山市| 淮阳县| 河间市| 韶关市| 台湾省| 资兴市| 杭州市| 璧山县| 西昌市| 武安市| 福鼎市| 灵山县| 新乡县| 荥阳市| 郎溪县| 丹阳市| 庐江县| 宁陕县| 浏阳市| 蛟河市| 浙江省| 朝阳县| 竹北市| 绵阳市| 钦州市| 合肥市|