成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

WebVR開發(fā)教程——交互事件(二)使用Gamepad API

pubdreamcc / 1514人閱讀

摘要:返回的位置矩陣返回的方向矩陣返回軸每秒的角加速度返回軸每秒的角速度返回軸每秒的線性加速度返回軸的線性速度與只有的如和的只包含方向矩陣,因此為而為而的如和由于和兼具,因此和都為。


上期 WebVR開發(fā)教程——交互事件(一)頭顯與手柄 從頭顯和手柄兩個(gè)層面對(duì)VR交互事件進(jìn)行介紹,前者使用的是WebVR API,而后者則需用到Gamepad API,本期將對(duì)Gamepad API展開介紹。

Gamepad API

Gamepad API是一個(gè)HTML5接口,讓開發(fā)者可以通過js訪問游戲手柄,使用Gamepad API的第一步是獲取gamepad實(shí)例。


一個(gè)典型的gamepad一般都會(huì)有button按鈕和axes control控制單元,而VR gamepad則是在前兩者的基礎(chǔ)上,加上對(duì)傳感器的支持。

Gamepad

屬性|說明
:------------:|:------------:
id|string類型,包含手柄的標(biāo)識(shí)信息。
connected|bool類型,反映手柄是否處于連接狀態(tài)
buttons|返回GampadButton對(duì)象數(shù)組,即手柄上的所有可用按鈕
axes|返回double類型數(shù)組,數(shù)組元素為手柄控制元件上各軸向數(shù)值
pose| 返回一個(gè)GamepadPose對(duì)象,包含手柄的方向和位置信息

獲取headset實(shí)例需要調(diào)用navigator.getVRDisplays()方法,同樣,獲取一個(gè)手柄的實(shí)例,則是調(diào)用navigator.getGamepads()方法,它返回一個(gè)gamepads數(shù)組。
一旦有手柄連接上,gamepads數(shù)組將產(chǎn)生有效的gamepad對(duì)象,否則,只能是null。

function getGamepad(id)
  const gamepads = navigator.getGamepads();
  for (let i = 0; i < gamepads.length; ++i) {
    let gamepad = gamepads[i];
    // 只有g(shù)amepad不為null才有效
    if (gamepad && gamepad.id === id)  return gamepad;
  }
}
// 或者寫成這樣: let getGamepad = id => navigator.getGamepads().filter( gamepad => gamepad && gamepad.id === id )[0];
this.gamepad = getGamepad("daydream vr controller"); // 獲取daydream controller手柄

上面實(shí)現(xiàn)的是根據(jù)手柄id獲取單個(gè)gamepad實(shí)例的方法,有些VR手柄如Vive Controller, Oculus Touch等是雙手柄,則需要獲取兩個(gè)gamepad實(shí)例。

接下來,我將針對(duì)gamepad實(shí)例的buttons, axes, pose三個(gè)重要屬性進(jìn)行介紹,它們對(duì)應(yīng)的是手柄按鈕、控制元件、傳感器三類組件,是實(shí)現(xiàn)gamepad交互事件的三大法寶。

Gamepad.buttons

Gamepad.buttons作為gamepad實(shí)例的一個(gè)重要屬性,代表手柄或遙控器上的所有可用按鈕,返回的是由一個(gè)或多個(gè)GamepadButton對(duì)象組成的數(shù)組。

GamepadButton顧名思義指的是gamepad上的按鈕實(shí)例,我們可以該實(shí)例獲取按鈕的狀態(tài),比如是否被點(diǎn)擊。

屬性|類型|說明
:------------:|:------------:|:------------:
id|string類型|按鈕的id名
pressed|bool類型|按鈕是否處于按壓狀態(tài)。
touched|bool類型|按鈕是否處于觸摸狀態(tài)。
value|double類型|反映按鈕被按壓的程度

由于gamepad的構(gòu)造都不盡相同,如果想識(shí)別Gamepad.buttons中確認(rèn)鍵或者返回鍵對(duì)象,可以通過GamepadButton.id的值來判斷。
下面是利用pressed實(shí)現(xiàn)tap事件的代碼,這里定義的tap事件,是指手指按下按鈕瞬間產(chǎn)生的觸發(fā)事件,不按壓或持續(xù)按壓過程不會(huì)產(chǎn)生tap。

update() {
  const button = this.gamepad.buttons[0]; // 確認(rèn)鍵對(duì)象通常位于數(shù)組第一個(gè)
  if (!this._lastPressed && button.pressed) {
    // 處理tap事件
  }
  this._lastPressed = button.pressed;
}

用代碼的語(yǔ)言來說,就是只有滿足:1) 上一幀的button.pressedfalse; 2) 當(dāng)前幀的button.pressedtrue的才會(huì)觸發(fā)tap事件。
于是,我們需要定義一個(gè)_lastPressed來記錄上一幀button是否pressed。
使用gamepad.buttons可以輕松實(shí)現(xiàn)gamepad按鈕的點(diǎn)擊事件,接下來,將介紹另一個(gè)重要屬性gampad.axes,通過它我們可以判斷觸控板手勢(shì)、搖桿朝向等。

Gamepad.axes

Gamepad.axes返回的是gamepad控制元件的軸數(shù)據(jù)集,如手柄上的手搖桿Thumbstick、遙控器上的觸控板Touchpad都是具有雙軸向的元件。
當(dāng)用戶用手指推進(jìn)搖桿或者輕觸觸控板時(shí),都可以用一個(gè)二維笛卡爾坐標(biāo)[x,y]來表示當(dāng)前搖桿或觸控板被觸發(fā)的方位,如下圖,返回一個(gè)-1.0~1.0的double數(shù)值組,一般將按水平、豎直的順序排序,如axes[0]表示x軸位置、axes[1]表示y軸位置。

update() {
  const axes = this.gamepad.axes; // 獲取軸向數(shù)組
  const x = axes[0], y = axes[1], 
  dx = x - this._lastAxes[0], dy = y - this._lastAxes[1];
  // 控制畫廊位移
  gallery.position.x += dx;
  gallery.position.y += dy;
  this._lastAxes = axes; 
}

上面通過計(jì)算兩幀之間搖桿在x軸和y軸的位移,控制畫廊的顯示位置,當(dāng)搖桿向左推時(shí),畫廊也向左移動(dòng)。

GamepadPose

gamepad.pose屬性返回的GamepadPose對(duì)象,與頭顯的VRPose對(duì)象類似,GamepadPose訪問的是VR手柄的傳感器(加速計(jì)和陀螺儀),可以直接獲取gamepad的方向、位置、速度和加速度等信息。

屬性|類型|說明
:------------:|:------------:|:------------:
hasPosition|bool|gamepad是否具有position屬性。
hasOrientation|bool|gamepad是否具有orientation屬性。
position|Float32Array|返回gamepad的位置矩陣
orientation|Float32Array|返回gamepad的方向矩陣
angularAcceleration|Float32Array|返回x, y, z軸每秒的角加速度
angularVelocity |Float32Array|返回x, y, z軸每秒的角速度
linearAcceleration|Float32Array|返回x, y, z軸每秒的線性加速度
linearVelocity |Float32Array|返回x, y, z軸的線性速度

hasPosition與hasOrientation

只有3-DoF的gamepad如Gear VR和Daydream的Controller只包含orientation方向矩陣,因此hasOrientationtruehasPositionfalse
而6-DoF的gamepad如Oculus touch和HTC Vive Controller由于orientationposition兼具,因此hasOrientationhasPosition都為true。

position與orientation

GamepadPose最重要的屬性,通過這兩個(gè)屬性可以將現(xiàn)實(shí)的手柄映射到VR三維世界中,比如當(dāng)用戶使用手柄玩射擊游戲時(shí),就需要獲取每一幀gamepad的oritentation,并賦值給3d場(chǎng)景里的槍支模型。

update() {
    const { orientation, position } = this.gamepad.pose;
    controller.quaternion.fromArray( orientation ); // 將方向矩陣賦值給遙控器模型
    controller.position.fromArray( position ); // 將位置矩陣賦值給遙控器模型
}

Acceleration與Velocity

GamepadPose還提供了一系列運(yùn)動(dòng)屬性:角加速度、角速度、線性速度、線性加速度,我們可以根據(jù)這些屬性進(jìn)行更豐富的物理行為,比如使用加速度×質(zhì)量來計(jì)算物體受力情況,適用于諸如砍殺、擊球等復(fù)雜運(yùn)動(dòng)形式,這里就不展開細(xì)說了。

小結(jié)

至此,WebVR事件開發(fā)基礎(chǔ)已經(jīng)講完,接下來,我將對(duì)各主流VR類型進(jìn)行針對(duì)性實(shí)現(xiàn),根據(jù)交互的復(fù)雜性,將按照Cardboard→Gear VR→Daydream→Oculus Rift 由屌絲到高富帥的路線。

WebVR開發(fā)傳送門:

WebVR開發(fā)教程——交互事件(三)Cardboard與注視
WebVR開發(fā)教程——深度剖析 關(guān)于WebVR的開發(fā)調(diào)試方案以及原理機(jī)制
WebVR開發(fā)教程——標(biāo)準(zhǔn)入門 使用Three.js開發(fā)WebVR場(chǎng)景的入門教程

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/89437.html

相關(guān)文章

  • WebVR開發(fā)教程——交互事件(一)頭顯與手柄

    摘要:交互事件交互根據(jù)自由度可分為和,顯然,所有的頭顯都應(yīng)支持方向的追蹤。交互事件除了,現(xiàn)在大部分還搭配,用戶通過手持手柄可以與虛擬場(chǎng)景進(jìn)行交互。 showImg(https://segmentfault.com/img/remote/1460000011813767?w=880&h=471); 前兩期主要介紹了開發(fā)WebVR應(yīng)用的基本套路,不過開發(fā)出來的場(chǎng)景還只是可遠(yuǎn)觀而不可褻玩,缺乏交互...

    harriszh 評(píng)論0 收藏0
  • WebVR開發(fā)教程——交互事件(三)Cardboard與注視

    摘要:開發(fā)傳送門開發(fā)教程交互事件一頭顯與手柄開發(fā)教程交互事件二使用開發(fā)教程深度剖析關(guān)于的開發(fā)調(diào)試方案以及原理機(jī)制開發(fā)教程標(biāo)準(zhǔn)入門使用開發(fā)場(chǎng)景的入門教程 showImg(https://segmentfault.com/img/remote/1460000011814846?w=1240&h=587); Cardboard可以說是手機(jī)VR頭顯的元老了,狹義上指的是Google推出的一個(gè)帶有雙凸...

    Allen 評(píng)論0 收藏0
  • SegmentFault 技術(shù)周刊 Vol.35 - WebGL:打開網(wǎng)頁(yè)看大片

    摘要:在文末,我會(huì)附上一個(gè)可加載的模型方便學(xué)習(xí)中文藝術(shù)字渲染用原生可以很容易地繪制文字,但是原生提供的文字效果美化功能十分有限。 showImg(https://segmentfault.com/img/bVWYnb?w=900&h=385); WebGL 可以說是 HTML5 技術(shù)生態(tài)鏈中最為令人振奮的標(biāo)準(zhǔn)之一,它把 Web 帶入了 3D 的時(shí)代。 初識(shí) WebGL 先通過幾個(gè)使用 Web...

    objc94 評(píng)論0 收藏0
  • WebVR教程——Web Audio開發(fā)3D音效

    摘要:輸入結(jié)點(diǎn)主要負(fù)責(zé)加載解碼音頻源,比如獲取二進(jìn)制音頻源的獲取音頻源的等處理結(jié)點(diǎn)主要對(duì)音頻數(shù)據(jù)進(jìn)行計(jì)算處理,比如處理音頻振幅的等輸出結(jié)點(diǎn)則將音頻輸出至揚(yáng)聲器或耳機(jī),便是默認(rèn)的輸出節(jié)點(diǎn)。 showImg(https://segmentfault.com/img/remote/1460000012753856); 在VR開發(fā)中,除了圖形視覺渲染,音頻處理是重要的一環(huán),好的音頻處理可以欺騙用戶的...

    youkede 評(píng)論0 收藏0
  • 前端清單第 27 期:React Patent License 回復(fù),Shopify WebVR 購(gòu)

    摘要:新聞熱點(diǎn)國(guó)內(nèi)國(guó)外,前端最新動(dòng)態(tài)就開源許可證風(fēng)波進(jìn)行回復(fù)數(shù)周前,基金會(huì)決定禁止旗下項(xiàng)目使用,因?yàn)槠湓跇?biāo)準(zhǔn)的許可證之外添加了專利聲明此舉引發(fā)了社區(qū)的廣泛討論,希望能夠更新其開源許可證。 showImg(https://segmentfault.com/img/remote/1460000010777089); 前端每周清單第 27 期:React Patent License 回復(fù),Sho...

    jeffrey_up 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

閱讀需要支付1元查看
<