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