消防VR演練滅火功能的實現
主要使用VRTK實現手柄拾取滅火器,然后扣下手柄扳機噴射粒子系統滅火的一個過程。
主要學習了VRTK里面【021_Controller_CustomObjectsWithJoints】:該場景演示了如何抓取、使用帶關節的可交互對象。
VRTK simulator使用說明:

所有的按鍵映射可以在SDK_InputSimulator中找到也可以修改成自己習慣的按鍵觸發。
1.導入滅火器模型和噴射效果粒子系統
調整大小角度,查看噴射效果:

為被拾取的物體添加組件【VRTK_Interactable Object】組件:
點選被拾取的物體,依次點開選擇菜單【Windows】—>【VRTK】—>【Setup Interactable Object】,在彈出的對話框,勾選Hold Button to Grab,點擊下方setup selected object按鈕,這樣,滅火器就添加上了相關組件,使它能成為,Touch Hightlight color可設置被拾取時高亮的顏色。
為被拾取的物體添加剛體組件【Rigibody】和碰撞器(被拾取的必要條件)


至于添加什么碰撞器視物體的形狀自行決定,調整碰撞器范圍。
2.為左右控制器添加可拾取物體的組件
【VRTK_Interact Touch】(手柄可觸摸物體)
【VRTK_Interact Grab】(手柄可抓取物體)
【VRTK_Controller Events】(前面以添加)

Grab Button設置拾取的按鍵,默認是手柄的側鍵。
模擬器測試一下:按alt切換到右手模式下,移動位置到滅火器附近,按ctrl調整手柄上下高度,觸摸到滅火器高亮

按住鼠標左鍵可拾取滅火器并可移動它:

3.利用粒子碰撞實現滅火交互功能
這里的滅火原理是:根據滅火器噴射粒子在一定時間內與火焰對象發生碰撞的累計次數更新火焰對象的滅火系數,用戶噴得越準則滅火系數越大,只要滅火系數大于恢復系數,即可使火勢變小。
這里提供一個思路:當滅火器噴射出的滅火粒子與火焰對象“fire”的碰撞器發生碰撞時,會觸發粒子碰撞事件,可以在碰撞事件的回調函數中統計本次事件中與火焰對象發生碰撞的粒子數量,并將該數量傳遞給火焰對象的“fireControl”腳本,為此修改

為其添加接收粒子碰撞數量的函數,在該函數中根據一定時間內粒子碰撞累計數量計算出熄滅系數的最新值,同時,每隔一定時間清空粒子碰撞累計數和熄滅系數。
為fireControl類添加相關變量:

添加供發生粒子碰撞時可以調用的公開函數:

添加用于指定時間內清空粒子碰撞計數以及滅火系數的協程函數:

協程函數ResetPCC()放在start函數里啟動。

創建粒子碰撞腳本類ParticleCollision并加載到噴射粒子對象上:

!!!(注意:需要將噴射粒子對象上的“ParticleSystem”組件中的“Type”設置為World,"Send Collison Message"屬性設置為“true”(勾選狀態)),因為是3d世界下,所有這是粒子碰撞觸發的必要條件,不設置的話,粒子無法碰撞觸發相關事件!!!

基于VRTK下監聽手柄按鈕事件:
新建腳本,基于VRTK的側鍵按下,扳機鍵按下事件


掛載到右手柄上:

拖拽噴射粒子和噴射音效給組件。
好了,基本完成了,測試一下看:

模擬器狀態下,鍵盤上按ctrl調整手柄位置觸碰到滅火器,按鼠標左鍵拾取,鼠標右鍵發射滅火粒子,對準火勢噴射即可滅火成功。

沒有設備模擬器調試不好截圖,但在控制臺可以看到,粒子在不斷發生碰撞,火勢慢慢變小直至熄滅。
原文鏈接:https://blog.csdn.net/qq_42437783/article/details/115705905