本篇VR筆記由“萌貓娘巧克力”撰寫,文明觀賞,請勿轉載,謝謝合作
該VR筆記的來源是 蠻牛教育 上的課程【HTC VIVE 開發實例教程】
——————————————————————
觀看前的一些提醒:
Unity版本 5.6.0f3
VRTK版本:3.2.1
SteamVR版本:1.2.2
另外提醒一下:SteamVR版本一定不能高過1.2.2,因爲高過了會使得 手柄 無法顯示
——————————————————————
初識HTC VIVE
HTC
宏達國際電子股份有限公司成立於1997年5月15日,簡稱宏達電,亦稱HTC,是一家位於臺灣的手機與平板電腦製造商。是全球最大的Windows Mobile智能手機生產廠商,全球最大的智能手機代工和生產廠商。
全球第一款安卓手機HTC G1由HTC在2008年9月推出。
在2015年3月的MWC2015上發佈了與Valve聯合開發的VR虛擬現實頭盔產品HTC Vive。
VIVE
Valve是Valve Software(維爾福軟件公司)的簡稱,1996年成立於華盛頓州西雅圖市,是一家專門開發電子遊戲的公司,代表作品有半條命,反恐精英,求生之路,DOTA2等。
HTC Vive 是由HTC與Valve聯合開發的一款VR頭顯(虛擬現實頭戴式顯示器)產品,於2015年3月在MWC2015(巴塞羅拉世界移動通信大會)上發佈。由於有Valve的SteamVR提供的技術支持,因此在Steam平臺上已經可以體驗利用Vive功能的虛擬現實遊戲。2016年6月,HTC推出了面向企業用戶的Vive虛擬現實頭盔套裝—Vive BE(即商業版),其中包括專門的客戶支持服務。
2016年11月,HTC Vive頭戴式設備榮登2016中國泛娛樂指數盛典“中國VR產品關注度榜top10”。
AR 網址
HTC VIEW 交互設計開發
關於凝視效果
- 通過跟蹤頭部移動,設置一個代表光標的準星,當停留在某處足夠長時間以後,激發選中邏輯
- 類似 Kinect 自然語言交互
- 多用於移動VR,如 Cardboard、GearVR等
- VIVE 平臺使用凝視效果可增強用戶體驗
實現原理
- 基於射線原理,通過Raycast 判斷擊中的物體,在Update 裏面進行邏輯帕努單
- 準星或十字線基於UGUI ,設置爲相機的子物體,等待操作過程一般爲圓環逐漸填充動畫或者進度條動畫
- 被凝視的物體可以是UI也可以是3D物體
- 如果在一段時間內擊中的物體是用一個物體,則認爲該元素被選中,在此邏輯內撰寫相應處理函數,入消失,變換材質,縮放等
- 元素一般分爲三個狀態相應:準星進入、準星退出、準星停留時間
對於工具的學習:
SteamVR工具
使用Interaction System 實現與物體的交互
Unity腳本上的一個小技巧,當我們想在添加這個腳本的時候,還需要哪些組件支持,就可以使用RequireComponent,進行強制添加上去,以免發生不必要的小問題
使用ItemPackage 實現配套物體的同時抓取
Linear Drive 與 Circular Drive 的使用
LinearMapping是一個百分比
傳統UI 和 VR UI 是 《屏幕座標系》 和 《世界座標系》的區別
VR中的UI一般構建步驟
Interaction System 中的UI交互
在3D物體上面掛在 Interactable 腳本用於3D物體交互,
而在UI上面要交互的話,要掛在UIElement腳本
使用 Sourcetree 從 Github 克隆項目並保持更新
VRTK與SteamVR的集成
VRTK的配置
VRTK手柄指針配置
VRTK_Controller Events
VRTK_Pointer —— 定義指針交互
指針渲染有兩種【VRTK_BezierPointerRenderer】 和 【VRTK_StraightPointerRenderer】
VRTK_StraightPointerRenderer —— 定義指針外觀
早期VRTK
早期直接使用 Simple Pointer是可以進行操作的,但是現版本不允許這麼使用了
設計思想:
開始指定SDK,指定相關模型,跟相關控制腳本發生鏈接,在控制器上掛載最核心的Controller Events,把事件掛載到控制器上,將相關的屬性進行設置,
VRTK瞬移機制:
瞬移是基於 碰撞器 之上的,所以想瞬移的話,就得加上碰撞器組件
將射線照射在箱子上,他目前不會站在箱子上,
這裏就涉及到了【自適應高度】問題,
將Basic替換成Height腳本即可解決問題
VRTK_Height Adjust Teleport 和 VRTK_Basic Teleport 只能添加一個
讓指針的末端附着在物體的表面上,
就像凝視效果的光標,和物體的法線方向保持一致
VRTK的快速瞬移:
之前的瞬移是從一個點快速 變 到了另一個點,中間沒有過程只是加了閃屏
VRTK_Dash Teleport 快速瞬移
中間的移動過程是可見的,並且,它自帶高度自適應的效果
瞬移區域限制:
有種辦法就是,把不想讓玩家進行瞬移的位置進行 碰撞器 的消除,但是這樣的話,太麻煩
VRTK,就爲我們提供了 3 種限定瞬移區域機制
第一種方式:
無論Basic 、Height 還是 Dash Teleport ,都有
它設定了排除的規則,它需要腳本類型是【VRTK_Policy List】
【包含3個Tag的遊戲物體】
忽略 Tag 爲 NoTeleport 遊戲物體,不參與進行瞬移
此時,第三個箱子就無法瞬移到上面了
以上是VRTK_Policy List方式
第二種方式:
那三個瞬移組件,也有這個NavMeshLimitDistance,
【這個圖可能無法看清烘焙範圍,後面有張烘焙後的圖】
Nav Mesh Limit Distance
要注意一個問題,那就是這個 Nav Mesh Limit Distance 是 烘焙縮進,如果是0的話,那就絕對不可以往Nav Mesh範圍外進行瞬移,
如果設置了0.5的話,它就可以往 Nav Mesh 範圍外0.5的位置進行微瞬移(可以往外面一點)
視頻解釋:往NavMesh以外,往外走0.5米,也是可以進行瞬移的
注意下,填寫正整數的話,就會往NavMesh外多少多少米進行微瞬移,填寫0的話,就會不考慮 導航 瞬移
第三種方式:
類似於 Interaction System 的 Teleport Point,
給他設定一個點
VRTK -> Prefabs -> DestinationPoint
最初它的樣子是一個膠囊體[瞬移點]
但是,我們可以將它變成一個橢圓片[瞬移區域]
還要注意一點的就是,它們的 碰撞器大小 !!!!拖成 橢圓片 之後,要更改碰撞器
自定義指針:
我們得了解,它們分別的名字
Custom Cursor 是 指針與碰撞體 交界的光標.
Custon Tracer 是 構成曲線的元素 【 默認用Sphere構成的點狀曲線 】
Tracer Density 是 曲線密度,越大越密集
根據長短,自動縮放
【看組件名】
將物體改成條形的話,遊戲物體就只掛載Transform 和 Line Renderer
設置 Width 、不要World Space 、 Positions Element2 Z軸改成2
我們可以在Tracer上做很多設置,例如添加粒子特效
【試想一下,當按下Touch Pad,就會有煙花火星產生,那個場景,這就是添加了粒子特效做出來的效果】
使用VRTK實現與物體的交互
VRTK中與物體交互的三種類型:Touch、Grab、Use
使用VRTK實現與物體的交互
給 想進行交互的物體 添加一個VRTK_Interactable Object腳本
【物體上要添加這個腳本 和 碰撞器】
三種方式與物體進行交互
[手柄上,要添加VRTK_Interactable Grab]
【視頻此處太模糊了,因爲,VRTK版本過舊,而且有些地方不一樣了,所以沒有貼圖】
在手柄上,添加上Grab,也可以添加上Use
需求:抓起劍的時候,實現手柄消失
被物體添加 VRTK_InteractController Appearance
看見Hide Controller On Grab了吧,它的意思就是當抓起來的時候,隱藏手柄
現在給 手柄 添加一個振動:
手柄振動的反饋是,給物體交互配置過程進行設置的,所以,我們只需要給物體添加一個腳本,VRTK_Interact Haptics
另一種配置物體可交互的手段:
【強烈推薦,根本不需要記憶該添加哪些腳本自動完成添加腳本】
基於圖形化配置
每個物體的交互是不一樣的,
門 和 劍,它們的交互方式是不一樣的
Precision Grab是精準抓取的意思,不勾選的話,它是和手柄的座標保持一致,只有吸附的效果
如果勾選上的話,碰到什麼地方,就從那裏抓取起來,
這個屬性,有利於抓取點沒有特殊要求的物體
設置 吸附點 Handler非常有利於吸附的方式
它的旋轉朝向的設置,就是被抓取的物體,在被抓取以後在原有的基礎上,將要在各個軸向上進行旋轉的一個增量,它是一個增量而不是一個具體要達到的數值
另外一種抓取機制,將被抓取的物體作爲一個被攀爬的點
VRTK抓取機制:關節點相關機制【視頻中講的特別難受】
這種效果,就是類似於攀巖的效果
當我抓取這個節點的時候,節點還是和手柄在一起,只不過這個節點不在相對於世界做一個運動,而是移動我們的身體,通過不停的拖拽從而移動體驗者的位置
在某個組件上添加Player Climb即可攀爬
【該圖中,我們正在攀爬梯子】
另一種抓取機制:
Rotator Track ,要配合【Hinge Joint】組件,
它可以被理解爲門的合葉,它是圍繞一個點進行旋轉,最恰當的例子
這裏有個黃色的箭頭,這就是要圍繞旋轉的軸向
【VRTK 3.2.1版本】配置,早期這個筆記寫出來的時候上面的配置 並非 使用3.2.1的配置方式,但是,在之前配置的時候,我已經調整了筆記的順序,所以,看到這裏可以再往上翻一翻我寫過的配置方式
【在這裏就放一張圖,看看大家能不能回想起來,如何配置】
VRTK中的高亮和振動
控制器高亮:
想讓 控制器 進行高亮,我們需要去自己寫腳本來進行控制
課時27,講解了一個二級聯動的一個BUG,可以看一看!!!!
【有興趣的各位,可以看看視頻,這裏就不做贅述了】
VRTK中與UI的三種交互方式
我們想近距離觸碰一個UI並且觸發它
在Canvas上,掛在一個 VRTK_UI Canvas腳本,有個Auto Active Within Distance
它的意思是,距離多少的時候,就激活這個UI面板 ;;;;【並且手柄要添加一個Touch組件和 UI Pointer,這樣才能響應UI上的事件】
現在,我們要弄一個頭部控制的這麼一個東西,因此,
然後再在HeadSet【頭部控制器】上,添加一個組件【VRTK_Transform Follow】
這個組件是 它可以讓一個物體跟隨另一個物體,包括位置旋轉以保證當前這個粒子,讓HeadSet跟蹤頭部來發送射線以指定它的位置
【
補充一句,這個Interact With Object是後面講到的東西,我弄混了
它是用激光和物體進行交互
】
還有一步,就是別忘了添加渲染上去
【將渲染拖上去,要記得】
總結一下:
人爲定義一個可以發送射線的物體 配置 Pointer 、 它的Pointer Renderer 和 與UI進行交互的UI Pointer,再添加一個進行跟隨Transform Follow,讓它指定到頭盔上,以確定,它是以眼睛的方位進行發送射線,然後跟UI碰撞
使用激光指針與物體進行交互
用激光對物體進行交互,需要進行配置
在兩個手柄上,添加一個腳本【VRTK_Interact Use】
然後Pointer腳本上,勾選上Interact With Object
選中的目的,就是讓這個激光與物體實現交互,而不是簡單實現手柄
這時候,就實現了激光指針跟手柄與物體實現選中效果,
但是,到目前爲止,我們並沒有告訴VRTK,我們在選中它之後,要做什麼,
它僅僅是接受到了事件,僅僅知道我用鼠標進行點擊,並不知道點擊之後要做什麼
這裏有兩種方法可以進行配置
第一種,用Unity的自帶東西:
在手柄上添加一個【VRTK_InteractUse_UnityEvents】
添加了之後,它上面有事件函數
兩個函數的意思是:
當控制器使用了可交互的物體
使用完畢之後
這是開始去抓取的設置
這裏要注意下,分別去設置左手和右手
現在有個問題,那就是抓取了武器之後,任然能進行瞬移,這是我們不想要的,
所以,我們得對Pointer進行一個設置,在抓取的時候不允許它去射線
把 VRTK_Pointer 也拖進去,找到它的一個Toggle屬性,設置爲false , 不允許它射線從而達到無法瞬移
這樣設置來設置去,顯然特別麻煩,因此,我們要通過手動寫代碼的形式去進行配置
第二種,用 手動寫代碼 的方式進行配置Use:
源代碼:
這個代碼是出自 第19個 案例
它自己寫了一個代碼,不過這個代碼是繼承自 VRTK_InteractableObject 所以本質上還是掛載了InteractableObject腳本
唯一要關注的地方就是 它重寫了 StartUsing 和 StopUsing 這兩個方法:
StartUsing函數描述:
VRTK_InteractableObject.StartUsing(GameObject currentUsingObject)` has been replaced with `VRTK_InteractableObject.StartUsing(VRTK_InteractUse currentUsingObject)`. This method will be removed in a future version of VRTK.
public virtual void StartUsing(GameObject currentUsingObject)
{
StartUsing((currentUsingObject != null ? currentUsingObject.GetComponent<VRTK_InteractUse>() : null));
}
這個函數已經過時了,形參列表由原先的GameObject被改成了VRTK_InteractUse
StopUsing也是如此
所以,我們要實現更復雜的邏輯,就需要繼承自 VRTK_InteractableObject ,自己來進行開發
當自己寫的腳本繼承自了 VRTK_InteractableObject , 它就會有它的東西可以進行設定
之前我們設置的射線抓取是被吸附到手柄上,然後再抓取,位置移動了!
我們可以設置一下,以達到一個目的,那就是吸附在光標上
因爲不要吸附點這樣就可以不讓它直接吸到手柄上
把這個打開,它就會被吸附到 光標 上
這就是實現的效果
注意事項:
勾選了這個,它可以把激光當做手柄的延伸進行一個操作
這是介紹了Use使用方法,它是基於事件的處理函數
關閉了這個,同樣是可以遠程抓取,就不是在激光頂點
自定義手柄 – 將手柄定義爲手的樣子
用腳本的方式實現自動抓取
在兩個控制器上,添加一個Auto Grab腳本
現在,我們不希望它顯示默認控制器的模型了,所以,左手右手添加一個Controller Appearance
兩個都選上 隱藏控制器 在抓取上
如果不勾選,會呈現出這樣的效果
手柄與模型有旋轉的偏移
我們要在抓取點上設置手柄與物體的朝向
【實現效果,按下後完全按下(播放動畫)】
接下來就是有個需求,我想實現一個按下10%,它也是隻做一個握10%的動作
這就是按下百分比動畫的代碼展示
視頻中,說了一個問題,我們手柄是被替換掉了,但是抓取物體時出現了問題,抓取的話會脫離手柄
雙手模型上拖上我們之前寫的Hand腳本上去,再把Controller也拖上去
能觸碰到,但是,無法進行抓取
這是因爲,我們左右手控制器上,沒有RigidBody
所以,我們要在 拖出來手模型 的下面放置一個 空物體帶上剛體組件
好了,至此爲止,本人的VR筆記就到此爲止了,介紹了它的配置,如何抓取東西,抓取機制,Handler的使用
最後再次申明,本篇VR筆記最終解釋權由 “萌貓娘巧克力” 持有
歡迎大家來觀看與指出瑕疵