博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
VR中运动控制器的传送系统
阅读量:5084 次
发布时间:2019-06-13

本文共 1832 字,大约阅读时间需要 6 分钟。

创建一个VRPawn

  1. 新建一个BluePrint,父类选择Pawn,我们命名为VRPawn,打开它。

    1229599-20190614143257688-1853115256.png

  2. 添加一个Scene命名为CameraRoot
  3. 在CameraRoot节点下添加一个Camera
  4. 在DefaultSceneRoot下添加两个MotionContoller分别对应左手和右手,分别命名为“MotionController_L”和“MotionController_R”同时设置Visualization中的DisplayDeviceModel为True,DisplayModelSource为SteamVR。

    1229599-20190614143331056-1206369165.png

  5. 设置右手的MotionSource为Right。

    1229599-20190614143340141-394241487.png
    1229599-20190614143343790-162557729.png

  6. 将VRPawn拖到场景中,并设置

    1229599-20190614143358439-1912235101.png

添加并设置导航网格物体

首先要添加一个导航网格物体,它允许我们在导航网格物体覆盖的区域四处走动,要添加导航网格物体,先找到“模式”面板,选择“体积”,在下方找到“导航网格边界”(Nav Mesh Bounds Volume),然后将其拖到场景中。

1229599-20190614143407817-1860348749.png

1229599-20190614143415368-1616212248.png

如果看不到绿色的网格那说明你没开启显示

1229599-20190614143421993-323603729.png

在其细节设置中找到“笔刷设置”(Brush Setting),改变其XYZ的值直到覆盖场景区域

1229599-20190614143435253-491368757.png

使用导航网格边界时,所有对象都必须有碰撞组件,这样导航网格才知道哪些区域可以走动。

选中一个物体的静态网格

1229599-20190614143451522-872910541.png

在这里面设置碰撞

1229599-20190614143458914-1870584400.png

如果还有一些区域是不希望用户可以到达的,可以添加“导航网格物体修改器体积”(Nav Mesh Modifier Volume)

1229599-20190614143503787-1630749747.png

会发现它所在的区域会破坏导航网格物体。所以我们可以调整其大小与位置到一些不希望用户过去的地方。

1229599-20190614143513383-1160208657.png

1229599-20190614143519410-1299570407.png

修改VRPawn

新建两个变量

变量名 类型 描述
bTeleport Bool 是否可传送
teleportLoc Vector 要传送的目标坐标

1229599-20190614143529518-132209011.png

新建一个函数

这个函数主要的功能就是传送

函数名 getTPDestination

它需要两个参数

参数名 类型 描述
Position Vector 传送的位置坐标
ForwardVector Vector 朝向

1229599-20190614143537381-934810799.png

连线

右击添加节点,输入并选择“LineTraceByChannel”。

这个节点会从我们所在位置向传送目的地发射出一条射线,用这种方法我们就能在按下某个键时计算出“teleportLocation”的位置。

1229599-20190614143543716-866507063.png

将Postion与Start连接起来。

要得到End需要通过ForwareVector计算:

将Forware*10000后与Position相加。乘的系数即为射线的长度。

1229599-20190614143553986-290602358.png

接下来要计算射线击中的对象

拖动“Out Hit” 并选择“Break Hit Result”来展开结构体。

只要我们击中对象就会得到这些信息,但我们只需要用到其中的一小部分信息。

1229599-20190614143601550-718814987.png

首先要确定“Up的值”,所以我们要用到其中的“Normal”,然后对它使用点积,拖动后,搜索“dot product”:

1229599-20190614143606827-678995738.png

将Z设置为1

1229599-20190614143614607-1606939948.png

接下来把结果和一个浮点数比较一下,判断点积结果是否比浮点数大。

1229599-20190614143620610-1184128462.png

将float设置为0.9

1229599-20190614143626871-766000739.png

把判断结果赋值给"bTeleport"

1229599-20190614143631198-72470921.png

接下来判断是否可以传送

1229599-20190614143642609-14259954.png

从这里开始我们要使用导航网格物体,回到“Break Hit Result”,拖动“Location”,然后搜索“Project”,选择“ProjectPointToNavigation”

1229599-20190614143650041-1715021720.png

添加“teleportLoc”变量,并选择set,如果可以传送,则把ProjectedLocation赋给teleportLoc。

1229599-20190614143656826-183401921.png

最后我们在场景中绘制一个调试圆柱体,方便显示传送点在哪里。在set后面继续添加引脚,输入“Draw Debug Cylinder”,将半径设置为50,设置颜色,把宽度改为2。

1229599-20190614143703384-1541277216.png

1229599-20190614143707032-815325953.png

设置圆柱的高度,回到Break Hit Result”,拖动“Normal”输出引脚,搜索“ *”,它的值决定了圆柱体的高度,我将其设置为10。

1229599-20190614143723506-1452500054.png

1229599-20190614143727108-37460902.png

接下来将这个Vector与“teleportLoc”相加,并连接Start和End。

1229599-20190614143731532-2127559155.png

记住“Draw Debug Cylinder”只能在开发中使用,打包项目时我们需要用一个更正式的对象来代替它,如一个静态网格体。

事件图表调用

最后我们需要在事件图表中调用函数。

找到Event Tick。

这个事件在场景中的每帧都会触发

1229599-20190614143740028-2111040488.png

定义传送函数

1229599-20190614143747469-659459362.png

绑定控制器事件

1229599-20190614143754722-530856703.png

转载于:https://www.cnblogs.com/tchivs/p/11023110.html

你可能感兴趣的文章
轻松学MVC4.0–6 MVC的执行流程
查看>>
redis集群如何清理前缀相同的key
查看>>
Python 集合(Set)、字典(Dictionary)
查看>>
获取元素
查看>>
proxy写监听方法,实现响应式
查看>>
第一阶段冲刺06
查看>>
十个免费的 Web 压力测试工具
查看>>
EOS生产区块:解析插件producer_plugin
查看>>
mysql重置密码
查看>>
jQuery轮 播的封装
查看>>
一天一道算法题--5.30---递归
查看>>
JS取得绝对路径
查看>>
排球积分程序(三)——模型类的设计
查看>>
python numpy sum函数用法
查看>>
php变量什么情况下加大括号{}
查看>>
linux程序设计---序
查看>>
【字符串入门专题1】hdu3613 【一个悲伤的exkmp】
查看>>
C# Linq获取两个List或数组的差集交集
查看>>
HDU 4635 Strongly connected
查看>>
ASP.NET/C#获取文章中图片的地址
查看>>