999精品在线视频,手机成人午夜在线视频,久久不卡国产精品无码,中日无码在线观看,成人av手机在线观看,日韩精品亚洲一区中文字幕,亚洲av无码人妻,四虎国产在线观看 ?

基于Three.js的拾取方法的研究

2021-07-20 12:02:24余莉
計算機時代 2021年6期

余莉

摘 ?要: Three.js是一個由JavaScript編寫的WebGL框架,可以調用API直接在瀏覽器中創建和渲染三維場景。與虛擬場景進行交互的最常見方式就是鼠標拾取,點擊對象可顯示所點擊物體信息,或修改物體屬性,或激活動畫。文章先介紹了拾取的基本原理,再分析和實現了組合模型的拾取、外部導入模型的拾取以及拾取多個對象等三個方面的特殊應用,對THREE.Raycaster對象的用法進行了詳盡的介紹,能較全面地滿足拾取在教學和虛擬現實中的應用。

關鍵詞: Three.js; 拾取; THREE.Raycaster對象

中圖分類號:TP37 ? ? ? ? ?文獻標識碼:A ? ? 文章編號:1006-8228(2020)06-61-04

Abstract: Three.js is a WebGL framework written with JavaScript, which can call APIs to create and render 3D scene directly in browser. The most common way to interact with the virtual scene is to pick up by the mouse. Click on object can display the information of the selected object, modify the object attributes, or activate animation. The basic principle of pick-up is introduced in this paper, and three special applications are analyzed and realized, i.e. the pick-up of group model, pick-up of external imported model and pick-up multiple objects, the usage of THREE.Raycaster object is also introduced in detail, which can meet the application of pick-up in teaching and virtual reality more comprehensively.

Key words: Three.js; pick-up; THREE.Raycaster object

0 引言

隨著前端展示技術的發展,HTML5和WebGL技術在虛擬現實領域的應用正逐漸增多。由于瀏覽器原生支持WebGL,所以不需要安裝任何插件,即可觀看3D效果,且具有很好的跨平臺性。電腦、平板、手機等終端,只要安裝有支持HTML5的瀏覽器,即可使用。但是直接使用WebGL編程是十分復雜的,需要扎實的計算機圖形學基礎,學習復雜的著色器語法[1]。Three.js庫是一個由JavaScript編寫的WebGL框架,實現了WebGL的封裝與擴展[2],降低了初學者開發的難度。Three.js庫及其加載器可以很方便地把JSON、OBJ等格式的三維模型加載到網頁中來展示,并進行光照、材質、紋理計算后的實時渲染,用戶可使用鼠標旋轉、平移和縮放,與虛擬場景進行簡單交互[3]。

1 拾取的基本原理

瀏覽器上最常見的交互就是通過鼠標點擊三維物體,檢測實物圖形是否位于鼠標指針的下方[4],即物體的拾取操作。選中的對象會改變顏色、可見性等屬性,如圖1所示,選中的立方體被改為紅色,或者激活對象的動畫。

拾取的過程恰好與實物圖形繪制的過程相反。由于鼠標點擊對應的是瀏覽器的屏幕坐標(X,Y),而three.js畫布是三維場景,所以需要將屏幕點擊的二維坐標轉換為Three.js的三維坐標(X',Y'),以確定點擊的對象模型,如圖2所示,實線坐標系為二維屏幕坐標系,左上角為原點;虛線坐標系為三維世界坐標系,中心點為原點。屏幕坐標轉換成三維場景坐標代碼如下:

var vector=new THREE.Vector3((event.clientX/

window.innerWidth)*2-1,

-(event.clientY/window.innerHeight)*2+1,0.5);

vector=vector.unproject(camera);

坐標拾取的方法涉及復雜的矩陣運算[5],好在Three.js類庫提供了THREE.Raycaster對象用于鼠標拾取,這是一個傳統的面向對象空間的拾取方法[6]。其構造函數為new Raycaster(origin,direction,near,far);其中origin是光線投射的起點向量,就是camera的位置;direction是光線投射的方向向量(被歸一化)。常用方法為.intersectObject(object,recursive);其中object是參與相交檢測的模型集合,返回值為相交模型的集合,該數組按距離排序,最接近視點的排在第一個。求交的偽代碼如下:

var raycaster=new THREE.Raycaster(camera.position,

vector.sub(camera.position).normalize());

var intersects=raycaster.intersectObjects

([參與相交檢測的模型集合]);

if (intersects.length > 0) {

//intersects[0].object為最近的拾取對象

}

//else沒有對象被拾取到

2 特殊的拾取

2.1 組合模型的拾取

⑴ 拾取組合模型的成員

可以通過Three.js自帶的功能來組合或合并已有的幾何體,創建出新的幾何體[7]。如圖3(a)所示的小兔子,就是通過基本的cube、sphere組合成的兔子,可以做局部(耳朵、胳膊、腿等)以及整體的動畫。例如通過點擊兔子的耳朵,讓耳朵變長,如圖3(b)所示。設計代碼如下:

var intersects=raycaster.intersectObjects(rabbit.children);

if (intersects.length>0) {

intersects[0].object.flag=!intersects[0].object.flag;

//單擊一次true,再一次false

}

然后在requestAnimationFrame(render);回調的render()函數中添加if(rabbit.ear1.flag)rabbit.ear1.scale.y*=1.01;語句。

⑵ 拾取組合模型組

但是,使用raycaster射線無法獲取組group,只能獲取組中的元素。如果我們希望點擊兔子,就能讓兔子旋轉,那么必須是點擊兔子的頭、身體或者四肢,即參與相交檢測的模型集合必須是rabbit.children,rabbit本身并不能被拾取到,如圖3(c)所示。偽代碼為:

var intersects=raycaster.intersectObjects(rabbit.children);

if (intersects.length>0) {

if (intersects[0].object.parent==rabbit)

//如果點擊兔子的children

rabbit.flag=!rabbit.flag; //兔子被選中或者取消選中

else

//如果有其他模型被選中時的代碼

}

然后在render()函數中添加if(rabbit.flag==rabbit) rabbit.rotation.y+=0.02;語句。

2.2 外部導入模型的拾取

使用基本幾何體創建模型的工作量較大,通過各種加載器,Three.js可以加載JSON、OBJ、STL等多種格式的模型,降低了模型制作的成本。如圖4(a)中房子的模型是用3DMAX制作的,圖4(b)中火箭是用MAYA制作的。在google chrome瀏覽器的“開發者工具”里,可以使用console.log(rocket.children);來查看火箭模型的成員,如圖4(c)所示,該火箭是由15個部分組成的。圖4(a)中的小房子是只有一個成員的數組,見圖4(d)。外部導入模型的拾取方式偽代碼為:

var intersects=raycaster.intersectObjects([其他拾取模型]

.concat(rocket.children));

if (intersects.length>0) {

if (intersects[0].object.parent==rocket)

//如果點擊火箭的children

rocketflag=!rocketflag; //rocketflag是個全局變量

else

//如果有其他模型被選中時的代碼

}

然后在render()函數中添加if (rocketflag) rocket.position.y+=0.02;語句,火箭就會升空。

2.3 拾取多個對象

通常情況下,拾取是選中離視點最近的那一個三維模型。但某些特殊情況下,用戶希望選中raycaster射線上所有的對象。例如在模擬一個機關槍的掃射效果時,需要選中射程上的所有對象,如圖5(a)中用鼠標表明鼠標拾取位置,并用線框標識射程上的兩個對象;圖5(b)是這兩個對象不可見后的效果。

代碼如下:

var intersects=raycaster.intersectObjects(scene.children,true);

//第二個參數true表明對象的所有后代也參與求交,默認值為false

for (var i=0; i

intersects[i].object.visible=false;

//相交集合中所有元素都不可見

}

3 小結

本文針對于網頁中常見的拾取方式進行設計和實現,闡釋了傳統的基于對象空間的拾取方法的基本原理,并分別實現了對組合模型的拾取、外部導入模型的拾取和拾取多個對象等三方面的特殊應用,能夠很好地滿足教學和虛擬現實中拾取的需求,因此該研究具有一定的應用價值。下一步的工作可考慮虛擬場景漫游中碰撞檢測的快速實現,以及提高實時繪制性能的LOD技術的應用等。

參考文獻(References):

[1] 張文娟,吳瓊,曹欣然.基于WebGL的三維落葉場景仿真[J].計算機技術與發展,2018.28(6):171-175

[2] 趙海鵬,周楊,卞和方.基于Three.js的三維虛擬校園系統設計與實現[J].蘭州交通大學學報,2019.3.

[3] 汪浩,田豐,張文俊.基于WebGL的交互平臺設計與實現[J].電子測量技術,2015.8:119-122

[4] 寧靜.基于WebGL實物交互技術及其實現的研究[D].華中科技大學,2014.

[5] 施珂奕,鄧春健,鄒昆.基于OpenGL的三維模型點坐標拾取方法[J].液晶與顯示,2016.31(7):708-713

[6] 鄒建達,原力,毛力奮.基于Three.js的在仿真中的可視化和拾取研究[J].電腦與信息技術,2019.5.

[7] Jos Dirksen.Three.js開發指南:WebGL的JavaScript 3D庫[M].機械工業出版社,2017.

主站蜘蛛池模板: 亚洲午夜久久久精品电影院| 久久99国产综合精品1| 亚洲AV无码乱码在线观看代蜜桃| 欧美日韩第三页| 免费aa毛片| 26uuu国产精品视频| 小说区 亚洲 自拍 另类| 亚洲欧美一级一级a| 国产乱人免费视频| 一级看片免费视频| 亚洲国内精品自在自线官| 综合五月天网| 欧洲亚洲欧美国产日本高清| 久久婷婷六月| 波多野结衣无码AV在线| 在线看片中文字幕| 色欲不卡无码一区二区| 国产69精品久久久久孕妇大杂乱| 国产成人艳妇AA视频在线| 国产成人精品男人的天堂| 中文字幕人成乱码熟女免费 | 久久婷婷综合色一区二区| 在线观看免费AV网| 亚洲天堂视频网站| 五月天久久综合| 国产免费黄| 福利在线不卡一区| 99这里只有精品免费视频| av在线5g无码天天| jizz亚洲高清在线观看| 2021国产乱人伦在线播放| 日韩精品一区二区三区大桥未久 | 台湾AV国片精品女同性| 在线观看无码av免费不卡网站| 情侣午夜国产在线一区无码| 午夜国产小视频| 99视频全部免费| 2021国产精品自产拍在线观看| 国产日韩丝袜一二三区| JIZZ亚洲国产| 欧美人与性动交a欧美精品| 精品国产成人高清在线| 一级毛片高清| 精品久久香蕉国产线看观看gif| a天堂视频| 久久综合婷婷| 亚洲欧美另类中文字幕| www.91中文字幕| 久久精品国产精品青草app| Aⅴ无码专区在线观看| AV老司机AV天堂| 54pao国产成人免费视频| 韩国自拍偷自拍亚洲精品| 精品国产美女福到在线不卡f| 狠狠综合久久| AV老司机AV天堂| 国产爽妇精品| 亚洲欧美综合在线观看| 亚洲欧美日韩成人在线| 亚洲一级毛片| 2019年国产精品自拍不卡| 国产成人资源| аⅴ资源中文在线天堂| 97se亚洲综合在线韩国专区福利| 亚洲日韩第九十九页| 日韩高清成人| 成人国产一区二区三区| 国产人成乱码视频免费观看 | 久久人人爽人人爽人人片aV东京热 | 国产精品自拍露脸视频| 漂亮人妻被中出中文字幕久久| 日韩精品成人网页视频在线| 国产视频欧美| 国产女人18水真多毛片18精品 | 欧美一级99在线观看国产| 精品国产成人三级在线观看| 亚洲天堂.com| 视频二区中文无码| 亚洲V日韩V无码一区二区| 亚洲欧美精品日韩欧美| 真实国产乱子伦高清| 久久精品国产电影|