萌貓娘巧克力 的 VR筆記

本篇VR筆記由“萌貓娘巧克力”撰寫,文明觀賞,請勿轉載,謝謝合作

該VR筆記的來源是 蠻牛教育 上的課程【HTC VIVE 開發實例教程】

——————————————————————

觀看前的一些提醒:

Unity版本 5.6.0f3

VRTK版本:3.2.1

SteamVR版本:1.2.2

另外提醒一下:SteamVR版本一定不能高過1.2.2,因爲高過了會使得  手柄  無法顯示
——————————————————————

初識HTC VIVE

HTC

宏達國際電子股份有限公司成立於1997515日,簡稱宏達電,亦稱HTC,是一家位於臺灣的手機與平板電腦製造商。是全球最大的Windows Mobile智能手機生產廠商,全球最大的智能手機代工和生產廠商。

全球第一款安卓手機HTC G1HTC20089月推出。

20153月的MWC2015上發佈了與Valve聯合開發的VR虛擬現實頭盔產品HTC Vive

VIVE

ValveValve Software(維爾福軟件公司)的簡稱,1996年成立於華盛頓州西雅圖市,是一家專門開發電子遊戲的公司,代表作品有半條命,反恐精英,求生之路,DOTA2等。

 

 

HTC Vive 是由HTCValve聯合開發的一款VR頭顯(虛擬現實頭戴式顯示器)產品,於2015年3月在MWC2015(巴塞羅拉世界移動通信大會)上發佈。由於有Valve的SteamVR提供的技術支持,因此在Steam平臺上已經可以體驗利用Vive功能的虛擬現實遊戲。2016年6月,HTC推出了面向企業用戶的Vive虛擬現實頭盔套裝—Vive BE(即商業版),其中包括專門的客戶支持服務。

2016年11月,HTC Vive頭戴式設備榮登2016中國泛娛樂指數盛典“中國VR產品關注度榜top10”。

AR 網址

HTC VIEW 交互設計開發

關於凝視效果

  1. 通過跟蹤頭部移動,設置一個代表光標的準星,當停留在某處足夠長時間以後,激發選中邏輯
  2. 類似 Kinect 自然語言交互
  3. 多用於移動VR,如 Cardboard、GearVR
  4. VIVE 平臺使用凝視效果可增強用戶體驗

實現原理

  1. 基於射線原理,通過Raycast 判斷擊中的物體,在Update 裏面進行邏輯帕努單
  2. 準星或十字線基於UGUI ,設置爲相機的子物體,等待操作過程一般爲圓環逐漸填充動畫或者進度條動畫
  3. 被凝視的物體可以是UI也可以是3D物體
  4. 如果在一段時間內擊中的物體是用一個物體,則認爲該元素被選中,在此邏輯內撰寫相應處理函數,入消失,變換材質,縮放等
  5. 元素一般分爲三個狀態相應:準星進入、準星退出、準星停留時間

 

 

 

對於工具的學習:

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 克隆項目並保持更新

VRTKSteamVR的集成

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筆記最終解釋權由 “萌貓娘巧克力” 持有

歡迎大家來觀看與指出瑕疵

 

 

 

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章