之前看了一個(gè)月左右的資料,包括官方文檔及簡單的C++教程,輔助做一些Demo練習(xí),感覺再這么看下去也效果不佳,索性按著以前工作時(shí)的思路,先想好要做什么,再一一去想法實(shí)現(xiàn)。
要做什么
首先要有一個(gè)主場景,作為其他關(guān)卡的總?cè)肟凇?br> 構(gòu)建這一場景時(shí),能夠想到的需要實(shí)現(xiàn)的基本操作如下:

雖然這些操作官方示例里都有實(shí)現(xiàn),但是要想看懂并且變成自己的還是需要親身實(shí)踐、加深理解。
參考資料
這方面資料并不多但基本夠用,總的來說還是英文的靠譜些(我英文不好哇),沒入門時(shí)會(huì)覺得有點(diǎn)摸不著頭腦,再回過頭來看時(shí)思路會(huì)清晰不少。
文檔
- Setting up UE4 to work with SteamVR - 設(shè)置 UE4,以便使用 SteamVR
- Virtual Reality Best Practices - 虛擬現(xiàn)實(shí)最佳實(shí)踐
- Motion Controller Component Setup - 運(yùn)動(dòng)控制器組件設(shè)置
- VR Camera Refactor - VR 攝像機(jī)重構(gòu)
視頻
Unreal Engine的官方視頻,在 YouTube 上的比較全一些,優(yōu)酷上也有一些。
與VR相關(guān)的可參見這兩個(gè)系列:
還可以參考下YouTube上的這兩塊資源:
示例
在引擎中新建一個(gè)“Virtual Reality”項(xiàng)目,即可看到示例。
我需要的功能可以說示例里都已實(shí)現(xiàn),本來看示例對(duì)于基礎(chǔ)好的人來說是最方便的了,但是對(duì)于像我這種剛?cè)腴T的來說,藍(lán)圖多了看起來著實(shí)讓人頭疼,我目前階段策略就是萬不得已才去研究示例、找解決方法。

實(shí)踐經(jīng)驗(yàn)
創(chuàng)建場景
第一步就掉坑里了且好久才爬上來,只因?yàn)槠鸩降?a target="_blank" rel="nofollow">Setting up UE4 to work with SteamVR中英文檔有差異,糾結(jié)了小半天,壓根沒想著文檔本身就有問題。
糾結(jié)的重點(diǎn)是中文版文末特意強(qiáng)調(diào):

可是設(shè)為(0,0,0)就是Bad Size,運(yùn)行時(shí)玩家壓根不在指定點(diǎn)生成(自動(dòng)跑到世界原點(diǎn)生成了),而且從HMD看到的相對(duì)高度也不對(duì),它為啥還特意這么寫呢???
按英文文檔的思路來就對(duì)了,而且邏輯也清晰了很多,主要是從第9步開始的相關(guān)設(shè)置。
雖然很多時(shí)候,中文文檔的頂部都會(huì)有說明,但大多時(shí)候都被忽略,潛意識(shí)里總覺得不會(huì)差太多,就算少東西但總不至于錯(cuò),這次算是領(lǐng)教了。
接入手柄
Motion Controller Component Setup基本都講到了,總的來說就是通過MotionControllerComponent、StaticMeshComponent來實(shí)現(xiàn)接入,再擴(kuò)展講一下使用現(xiàn)成的手柄素材。
文中是使用了一個(gè)椎體來表現(xiàn)手柄,其實(shí)在Engine Content有現(xiàn)成的手柄素材。
要想看到并使用Engine Content資源,需要勾選 **Content Browser -> View Options -> Show Engine Content **選項(xiàng)。

然后在選擇Static Mesh時(shí)搜索“vive”就能找到對(duì)應(yīng)的素材了。

當(dāng)然還有其他設(shè)備資源可供選擇:

位置瞬移
Teleport in Unreal Engine - HTC VIVE ,能找到的講解教程基本都是這個(gè)思路,但我還是遇到了問題。
按教程,看上去能夠?qū)崿F(xiàn)瞬移了就以為大功告成了,但是在做下一步時(shí),才發(fā)現(xiàn)移動(dòng)的位置并不準(zhǔn)確,才又反過頭來研究。
經(jīng)過觀察發(fā)現(xiàn),SetActorLocation方法(包括Teleport方法)實(shí)際改變的是HMD中心點(diǎn)的世界坐標(biāo)。

直接用LineTraceByChannel的目標(biāo)點(diǎn)去設(shè)置的話只是將中心點(diǎn)移動(dòng)到指定位置(即能看到代表中心點(diǎn)的藍(lán)圈到了那個(gè)位置),但是沒有考慮到人與中心點(diǎn)的偏移,人如果不在中心點(diǎn)的話,始終是到不了指定點(diǎn)的。
至少我沒有找到任何資料提到類似的問題,也不確定這個(gè)問題是普遍存在的呢還是我個(gè)人的問題,所以只好靜下心來看示例咯,畢竟人家是實(shí)現(xiàn)了準(zhǔn)確無誤的嘛。
有了目標(biāo)看起藍(lán)圖來也輕松一些,還真讓我發(fā)現(xiàn)示例里是有一步轉(zhuǎn)換再設(shè)置的,只不過它還考慮了移動(dòng)角度。

我們只需要關(guān)注Location那條轉(zhuǎn)換,同理遷移到自己的設(shè)置里,這下瞬移位置才算是準(zhǔn)確了。

區(qū)域控制
UE4 - Simple Teleportation Mechanic 視頻的前半部分也是在講Teleport,后邊一部分講到了通過使用NavMeshBoundsVolume來實(shí)現(xiàn)區(qū)域控制,設(shè)置好體積區(qū)域后主要是通過ProjectPointtoNavigation方法來判斷然后再進(jìn)行處理的。

如果對(duì)NavMesh等概念和使用不太清楚的,可以參見這兩個(gè)視頻:
WTF Is? Volume - Nav Mesh Bounds in Unreal Engine 4
WTF Is? Volume - Nav Modifier in Unreal Engine 4
拾取物體
UE4下實(shí)現(xiàn)Vive手柄拾取物品
UE4 將actor acttach to 另一個(gè)actor需要注意的
結(jié)合這兩篇文章和理解,實(shí)現(xiàn)拾取應(yīng)該就不難了。
階段總結(jié)
基本功能倒是都實(shí)現(xiàn)了,但是感覺要想再做更復(fù)雜的功能還是有不少困難。
所以結(jié)合這兩周的實(shí)踐經(jīng)驗(yàn),下階段應(yīng)該:
- 強(qiáng)化英語
- 補(bǔ)習(xí)數(shù)學(xué)
- 多實(shí)踐、勤總結(jié)
歡迎一起學(xué)習(xí)交流!
