網(wǎng)站開發(fā)即時聊天源碼百度搜索指數(shù)排行榜
目錄
一.概述
二.功能實現(xiàn)
? 1.模型抓取
? ? ?1)基礎抓取腳本? ? ? ??
? ? ?2)抓取物體在手柄上的角度
? 2.模型放置區(qū)域高亮并吸附
? ? ? ?1)VRTK_SnapDropZone
? ? ? ?2)VRTK_PolicyList
? ? ? ?3)VRTK_SnapDropZone_UnityEvents
? 3.交互滑動條
? 4.交互旋轉模型
? 5.設置手柄半透明
三.其他
一.概述
? ? ? ?此篇記錄在開發(fā)過程中所使用到的VR功能,不針對VRTK或SteamVR的插件進行解釋,或導入等等基礎內容的說明,如正在開發(fā)VR項目或許可以借鑒本篇中解釋的相關功能~
二.功能實現(xiàn)
? 1.模型抓取
? ? ?1)基礎抓取腳本? ? ? ??
? ? ? ?給需要被手柄抓取的模型添加圖例腳本,必須添加的有VRTK_InteractableObject、VRTK_SwapControllerGrabAction?
? ? ? ?再給手柄添加這些腳本即可,不需要單獨去記,因為筆者犯懶,也是直接從VRTK的預制體直接拖拽到場景中的,程序和人有一個能跑就行不是嗎~
? ? ?2)抓取物體在手柄上的角度
? ? ? ?通常,在抓取到物體的時候,被抓取的物體只是相對于手柄當時的抓取位置被吸附到手柄上,但一般在做項目,比如使用放大鏡的時候肯定要保證抓起放大鏡的時候保持鏡面在最上面,主要是用戶體驗感上的功能。
? ? ? ?給需要被抓取的物體(筆者這里叫氣鉆)添加VRTK_TrackObjectGrabAttach,在需要被抓取的物體下創(chuàng)建一個空物體(SnapPoint),給這個空物體添加VRTK_SDKTransformModify。
? ? ? ?在新建的這個空物體下的腳本組件VRTK_SDKTransformModify—Sdk Overrides—Element0—Transform Override Settings中設置位置信息和旋轉信息,這里設置的信息會直接覆蓋掉被抓取物體相對于手柄的局部位置、局部旋轉的信息,建議在運行起來將物體抓到手柄上去調這個參數(shù),最后結束運行復制出來,因為在非運行狀態(tài)下這個信息很難調。
? ? ? ? 最后就是需要將攜帶VRTK_SDKTransformModify的這個空物體添加到需要被抓取的物體(父物體)的VRTK_TrackObjectGrabAttach—Right Snap Handle中,這個只是代表右手手柄抓起來之后會使用這個空間信息,需要根據(jù)項目要求自行選擇添加到左手柄還是右手柄。
? 2.模型放置區(qū)域高亮并吸附
? ? ? ?這個功能主要是使用手柄拾取模型后,需要將這個模型放置到特定的位置上。比如有一條直線,需要用到尺子去測量這條直線的長度,那么在拾取這個尺子在直線附近釋放的時候直接將直尺完美貼合到直線上。
? ? ? ?首先在Project文件夾下直接搜索SnapDropZone,將預制體拖拽到場景中。
? ? ? ?可以看到這個預制體上默認攜帶了碰撞器、剛體、VRTK_SnapDropZone.cs組件,但這些組件還不足以實現(xiàn)高亮和吸附的功能,需要再給這個預制體(SnapDropZone)添加兩個腳本,分別為VRTK_PolicyList、VRTK_MaterialColorSwapHighlighter。
? ? ? ?1)VRTK_SnapDropZone
? ? ? ?VRTK_SnapDropZone的作用主要是高亮和吸附的腳本的集成和控制,先主要對兩個參數(shù)進行修改,分別是Highlight Object Prefab、Highlight Color。
- Highlight Object Prefab用于在當前區(qū)域繪制高亮,類型是GameObject,就是說你他的高亮信息就是你往這個參數(shù)里拖拽的任何物體,如果是空物體那什么也沒有,如果有網(wǎng)格那就對網(wǎng)格高亮。
- Highlight Color高亮顏色,類型是Color,直接設置成自己喜歡的高亮顏色就行了。
? ? ? ?關于高亮顏色也可以添加VRTK_MaterialColorSwapHighlighter腳本,在這個腳本上添加材質球會直接覆蓋掉VRTK_SnapDropZone的Highlight Color參數(shù)。因為項目中可能會有大量的VRTK_SnapDropZone腳本,那么如果策劃說高亮顏色需要從藍色調整為黃色就得一個個去調整了,所以添加統(tǒng)一的顏色管理對于筆者而言還是很有必要的~
? ? ? ?2)VRTK_PolicyList
? ? ? ?在說VRTK_PolicyList前先要說一下這個物體上的碰撞器的作用,在這里碰撞器的大小就是用于判斷哪些物體被放置到這個檢測范圍之內。
? ? ? ?VRTK_PolicyList的作用主要是設置高亮的目標,設置哪些物體進入到這個區(qū)域(也就是碰撞器區(qū)域)的時候觸發(fā)高亮,主要判斷依據(jù)是碰撞器+標簽,碰撞器主要檢測物體是否進入到這個區(qū)域,標簽主要檢測是哪個物體進入到了這個區(qū)域,兩者結合在開發(fā)起來其實還是比較舒服的,而這個腳本主要就是標簽的設置。
? ? ? ?首先給需要進入到這個區(qū)域的物體(我這里是氣鉆)添加并設置一個標簽(我這里是Module_3_Qizuan),再給VRTK_PolicyList下的Size—Element0設置一致的標簽,最后把它自身給拖拽到VRTK_SnapDropZone組件的Valid Object List Policy中。
? ? ? ?到此,就可以把拖拽物體放置到高亮區(qū)域進行高亮的顯示了,但實際做項目的時候肯定不能是把這個物體放置到位之后就萬事大吉了,所以還需要添加一個將物體放上去之后的事件VRTK_SnapDropZone_UnityEvents,這個添加方式和給Button添加事件沒有區(qū)別,自己公開一個方法添加即可。
? ? ? ?3)VRTK_SnapDropZone_UnityEvents
? ? ? ?給高亮檢測物體添加事件監(jiān)聽腳本VRTK_SnapDropZone_UnityEvents。
- ObjectEnteredSnapDropZone:對象進入捕捉放置區(qū)域
- ObjectExitedSnapDropZone:對象退出捕捉區(qū)域
- ObjectSnappedToDropZone:捕捉到放置區(qū)域的對象
- ObjectUnsnappedFromDropZone:從放置區(qū)域取消捕捉的對象
? ? ? ?一般給ObjectSnappedToDropZone添加事件即可,這個將物體放下吸附上之后會調用,比如我要拿直尺去測量一條直線的長度,那么我的直尺放下之后就會調用具體測量的邏輯代碼。
? 3.交互滑動條
???????使用VRTK腳本VRTK_ArtificialSlider.cs,需要設置的重要參數(shù)分別為滑動軸和最大長度,滑動軸用于控制XYZ三個方向的拖拽,
????????最大長度用于限制和觸發(fā)拖拽到終點的事件,這里設置為0.2和0.01,既代表該物體限制x:0.01—0.2之間。
????????通過VRTK_BaseControllable.cs腳本給物體添加滑動到最小值和最大值的事件。
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using VRTK.Controllables;public class TestSlider : MonoBehaviour
{public VRTK_BaseControllable _Controllable;private void OnEnable(){_Controllable.MaxLimitReached += MaxLimitReached;_Controllable.MinLimitReached += MinLimitReached;}protected virtual void MaxLimitReached(object sender, ControllableEventArgs e){Debug.Log("滑動到最大值");}protected virtual void MinLimitReached(object sender, ControllableEventArgs e){Debug.Log("滑動到最小值");}}
? 4.交互旋轉模型
????????需要用到VRTK的腳本為VRTK_ArtificialRotator.cs,需要設置的內容為旋轉方向和旋轉最小最大值,比交互滑動條需要多設置一個Hinge Point(鉸鏈點),可以理解為需要被旋轉的物體是基于這個鉸鏈點的位置信息進行軸的旋轉,這個可以幫助我們做一些不規(guī)則物體(見下圖)的正常旋轉(畢竟不能啥玩意都像老年健身區(qū)的轉盤那樣直溜溜的轉)
????????VRTK_ArtificialRotator的重要參數(shù)
???????通過VRTK_BaseControllable.cs腳本給物體添加旋轉到最小值和最大值的事件。因為代碼寫的太爛大家自行參考自帶案例025_Controls_Overview,只對這個功能的實現(xiàn)邏輯大概說一下,是通過VRTK_Control_UnityEvents.cs的OnValueChanged獲取旋轉量,通過VRTK_BaseControllable來處理旋轉量。
? 5.設置手柄半透明
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using VRTK;public class _Device : MonoBehaviour
{public GameObject 傳入右手物體RightController;public GameObject 傳入左手物體LeftController;IEnumerator Start(){yield return new WaitForSeconds(1);VRTK_ObjectAppearance.SetOpacity(VRTK_DeviceFinder.GetModelAliasController(傳入右手物體RightController), 0.5f);VRTK_ObjectAppearance.SetOpacity(VRTK_DeviceFinder.GetModelAliasController(傳入左手物體LeftController), 0.5f);}}
三.其他
????????這里記錄使用VR開發(fā)遇到的一些問題
????????1.因為需求是左手柄有UI持續(xù)跟隨懸浮,所以在左手柄的子物體列表下添加了可交互UI,而右手柄無法對UI進行交互,左手柄本身做一些嘗試可以進行交互,解決方案是通過Update持續(xù)更新UI的位置在左手柄下。
????????2.手柄半透明的腳本因為寫在了Start下,在啟動軟件的時候剛好手柄丟失定位的情況下會導致手柄的半透明設置失效,我這里寫了協(xié)程延遲Start一秒,邏輯不嚴謹建議不要照搬。
????????3.盡量不要做UI持續(xù)在相機上的功能,因為體驗感極差....如果非要做的話盡量讓UI往屏幕下方下調一些。如果為了第三者在屏幕觀看效果的話盡量讓UI向上調,另外在屏幕上觀看只能看到右眼的畫面,和頭盔左右眼結合的畫面稍有偏離,可以通過SteamVR來調出“顯示VR視圖—左上角菜單—雙眼-xxxxx”的功能。