【Oculus Interaction SDK】(六)實體按鈕 && 按壓互動

千葉Christa發表於2023-02-10

前言

這篇文章是【Oculus Interaction SDK】系列的一部分,如果發現有對不上的對方,可以回去翻看我之前釋出的文章,或在評論區留言。如果文章的內容已經不適用於新版本了,也可以直接聯絡我,我會持續更新文章內容。

當前適用版本:

  • Unity 版本:2021.3.7f1c1
  • Oculus Interaction SDK 版本:47.0

文章最近更新日期:2023.02.10

 


新增按壓互動互動器

實現按壓互動需要在控制器和手的互動器列表中新增對應的 PokeInteractor

我們使用的 OculusInteractionSampleRig 中自帶有該互動器。如果你的互動器列表中沒有此物體,請自行新增,新增的方法在之前的文章中有過描述

【Oculus Interaction SDK】(一)設定 VR 相機與控制器 && 實現簡單的抓取功能 - 千葉Christa - 部落格園 (cnblogs.com)

【Oculus Interaction SDK】(六)實體按鈕 && 按壓互動

 

實現按壓互動

新建一個 Cube,命名為 3D Button,為其新增 Poke Interactable 元件

給 3D Button 建立一個空的子物體 Proximity Field,新增對應的 Proximity Field 元件(根據不同形狀選擇對應的元件即可)

【Oculus Interaction SDK】(六)實體按鈕 && 按壓互動

 

引用一下自己的 Transform

【Oculus Interaction SDK】(六)實體按鈕 && 按壓互動

 

可以看到我們的方塊上出現了一個藍色的包圍盒

【Oculus Interaction SDK】(六)實體按鈕 && 按壓互動

 

在 3D Button 下繼續建立空的子物體,命名為 Surface 並新增元件 Plane Surface

建立一個子物體,命名為 Surface,新增元件 Plane Surface,調整一下 Transform > Rotation,使其方向與圖中保持一致

這個平面的位置就是 Select 事件的觸發位置

【Oculus Interaction SDK】(六)實體按鈕 && 按壓互動

 

回到 3D Button,對 Poke Interactable 進行賦值

【Oculus Interaction SDK】(六)實體按鈕 && 按壓互動

 

完成之後可以看到這個藍色的標記,這個圓點標記了按壓的方向和按壓動作開始的檢測位置

【Oculus Interaction SDK】(六)實體按鈕 && 按壓互動

 

圓點和平面之間的距離是 Hover 事件觸發的距離

【Oculus Interaction SDK】(六)實體按鈕 && 按壓互動

 

透過調整 Pose Interactable 的引數 Max Distance,讓檢測面位於立方體表面

【Oculus Interaction SDK】(六)實體按鈕 && 按壓互動

 

為了更加直觀,我們透過一個新元件來視覺化按動觸發的效果,新增 Interactable Debug Visual 元件

【Oculus Interaction SDK】(六)實體按鈕 && 按壓互動

 

這樣按壓的互動就完成了

【Oculus Interaction SDK】(六)實體按鈕 && 按壓互動

 

製作實體按鈕

雖然實現了按壓互動,但是按鈕並沒有跟隨手指被按下去,這並不是我想要的效果

我希望按鈕可以在 Hover 這段區域內跟隨手指移動,但現在控制 Hover 範圍的 Surface 是按鈕的子物體,一旦按鈕移動 Surface 也會一起移動,這顯然是不對的

所以,我需要把按鈕獨立出來,讓按鈕的移動不影響設定好的按壓範圍

 

首先,刪除 3D Button 的 Mesh Filter、Mesh Renderer 和 Box Collider

建立一個空的子物體 Button Visual,在 Button Visual 下建立一個 Cube 子物體作為按鈕

並將 3D Button 的 Interactable Debug Visual 元件的引數 Renderer 的引用改為 Cube,使 Cube 依舊能夠給出反饋(當然也可以不要)

【Oculus Interaction SDK】(六)實體按鈕 && 按壓互動

 

給 Button Visual 新增 Poke Interactable Visual 元件,這個元件能夠實現按鈕按下的效果

【Oculus Interaction SDK】(六)實體按鈕 && 按壓互動

 

這個元件在發生互動時,會將自身(Button Visual)的 Y 軸位置從原位置變為 0,在這個區域內的物體才會受到影響

所以,這裡需要將 Button Visual 的 Y 軸位置修改為 0.5(與圓點位置保持一致),將 Cube 的 Y 軸位置修改為 -0.5(與原外觀保持一致)

現在可以簡單看一下效果了

【Oculus Interaction SDK】(六)實體按鈕 && 按壓互動

 

再給按鈕套上一個外殼,大功告成!

【Oculus Interaction SDK】(六)實體按鈕 && 按壓互動

 

限制手的按壓位置

在上面的效果圖中,我們可以看到手會穿透按鈕,這樣的效果並不是很好,我希望手在按壓到按鈕底部時可以被限制在按鈕表面

接下來就來解決這個問題!

 

在 Project 視窗中搜尋 HandSynthetic,找到 OVRLeftHandSynthetic / OVRRightHandSynthetic 使其成為 LeftHand / RightHand 的子物體

(在第五章有同樣的步驟,已經新增過的就不用新增了)

【Oculus Interaction SDK】(六)實體按鈕 && 按壓互動

 

給 HandSynthetic 新增 Hand Poke Limiter Visual 元件,並進行賦值(此步開始左右手類似,只描述一隻手的設定方法)

【Oculus Interaction SDK】(六)實體按鈕 && 按壓互動

 

因為 HandSynthetic 的子物體中也有 Hand Visual 元件,而我們只需要一個,在這裡需要禁用 LeftHandVisual

【Oculus Interaction SDK】(六)實體按鈕 && 按壓互動

 

現在來看看最終效果吧!

【Oculus Interaction SDK】(六)實體按鈕 && 按壓互動

 


參考資料

https://www.youtube.com/watch?v=IDE3eYDadig

相關文章