【虚幻引擎】UE4 - VR入门经验
之前看了一个月左右的资料,包括官方文档及简单的C++教程,辅助做一些Demo练习,感觉再这么看下去也效果不佳,索性按着以前工作时的思路,先想好要做什么,再一一去想法实现。
要做什么
首先要有一个主场景,作为其他关卡的总入口。
构建这一场景时,能够想到的需要实现的基本操作如下:
虽然这些操作官方示例里都有实现,但是要想看懂并且变成自己的还是需要亲身实践、加深理解。
参考资料
这方面资料并不多但基本够用,总的来说还是英文的靠谱些(我英文不好哇),没入门时会觉得有点摸不着头脑,再回过头来看时思路会清晰不少。
文档
- Setting up UE4 to work with SteamVR - 设置 UE4,以便使用 SteamVR
- Virtual Reality Best Practices - 虚拟现实最佳实践
- Motion Controller Component Setup - 运动控制器组件设置
- VR Camera Refactor - VR 摄像机重构
视频
Unreal Engine的官方视频,在 YouTube 上的比较全一些,优酷上也有一些。
与VR相关的可参见这两个系列:
还可以参考下YouTube上的这两块资源:
示例
在引擎中新建一个“Virtual Reality”项目,即可看到示例。
我需要的功能可以说示例里都已实现,本来看示例对于基础好的人来说是最方便的了,但是对于像我这种刚入门的来说,蓝图多了看起来着实让人头疼,我目前阶段策略就是万不得已才去研究示例、找解决方法。
实践经验
创建场景
第一步就掉坑里了且好久才爬上来,只因为起步的Setting up UE4 to work with SteamVR中英文档有差异,纠结了小半天,压根没想着文档本身就有问题。
纠结的重点是中文版文末特意强调:
可是设为(0,0,0)就是Bad Size,运行时玩家压根不在指定点生成(自动跑到世界原点生成了),而且从HMD看到的相对高度也不对,它为啥还特意这么写呢!?
按英文文档的思路来就对了,而且逻辑也清晰了很多,主要是从第9步开始的相关设置。
虽然很多时候,中文文档的顶部都会有说明,但大多时候都被忽略,潜意识里总觉得不会差太多,就算少东西但总不至于错,这次算是领教了。
接入手柄
Motion Controller Component Setup基本都讲到了,总的来说就是通过MotionControllerComponent、StaticMeshComponent来实现接入,再扩展讲一下使用现成的手柄素材。
文中是使用了一个椎体来表现手柄,其实在Engine Content有现成的手柄素材。
要想看到并使用Engine Content资源,需要勾选 **Content Browser -> View Options -> Show Engine Content **选项。
然后在选择Static Mesh时搜索“vive”就能找到对应的素材了。
当然还有其他设备资源可供选择:
位置瞬移
Teleport in Unreal Engine - HTC VIVE ,能找到的讲解教程基本都是这个思路,但我还是遇到了问题。
按教程,看上去能够实现瞬移了就以为大功告成了,但是在做下一步时,才发现移动的位置并不准确,才又反过头来研究。
经过观察发现,SetActorLocation方法(包括Teleport方法)实际改变的是HMD中心点的世界坐标。
直接用LineTraceByChannel的目标点去设置的话只是将中心点移动到指定位置(即能看到代表中心点的蓝圈到了那个位置),但是没有考虑到人与中心点的偏移,人如果不在中心点的话,始终是到不了指定点的。
至少我没有找到任何资料提到类似的问题,也不确定这个问题是普遍存在的呢还是我个人的问题,所以只好静下心来看示例咯,毕竟人家是实现了准确无误的嘛。
有了目标看起蓝图来也轻松一些,还真让我发现示例里是有一步转换再设置的,只不过它还考虑了移动角度。
我们只需要关注Location那条转换,同理迁移到自己的设置里,这下瞬移位置才算是准确了。
区域控制
UE4 - Simple Teleportation Mechanic 视频的前半部分也是在讲Teleport,后边一部分讲到了通过使用NavMeshBoundsVolume来实现区域控制,设置好体积区域后主要是通过ProjectPointtoNavigation方法来判断然后再进行处理的。
如果对NavMesh等概念和使用不太清楚的,可以参见这两个视频:
WTF Is? Volume - Nav Mesh Bounds in Unreal Engine 4
WTF Is? Volume - Nav Modifier in Unreal Engine 4
拾取物体
UE4下实现Vive手柄拾取物品
UE4 将actor acttach to 另一个actor需要注意的
结合这两篇文章和理解,实现拾取应该就不难了。
阶段总结
基本功能倒是都实现了,但是感觉要想再做更复杂的功能还是有不少困难。
所以结合这两周的实践经验,下阶段应该:
- 强化英语
- 补习数学
- 多实践、勤总结
欢迎一起学习交流!