创建一个VRPawn

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

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

  5. 设置右手的MotionSource为Right。

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

添加并设置导航网格物体

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

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

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

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

选中一个物体的静态网格

在这里面设置碰撞

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

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

修改VRPawn

新建两个变量

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

新建一个函数

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

函数名 getTPDestination

它需要两个参数

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

连线

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

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

将Postion与Start连接起来。

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

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

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

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

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

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

将Z设置为1

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

将float设置为0.9

把判断结果赋值给"bTeleport"

接下来判断是否可以传送

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

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

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

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


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

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

事件图表调用

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

找到Event Tick。

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

定义传送函数

绑定控制器事件

VR中运动控制器的传送系统的更多相关文章

  1. VR中为什么需要把游戏音频放在聚光灯里?

    VR中为什么需要把游戏音频放在聚光灯里? 本文章由cartzhang编写,转载请注明出处. 所有权利保留. 文章链接:http://blog.csdn.net/cartzhang/article/de ...

  2. VR中的“寻路(wayfinding)”

    虚拟现实(VR)中很重要的一个问题就是Locomotion(用户在VR中的移动).这个Locomotion分为两种,一种是点对点的,如传送门的方式,一种是包含了可以操控的中间过程的,这种被称为“导航( ...

  3. 什么是VR中的Locomotion?

    Locomotion,本文中我称之为移位,是VR研究中最重要的话题之一.因为它属于VR中三大元老级操作(Selection选择,Manipulation操纵物体,Locomotion移位),其中,前两 ...

  4. 什么是VR中的vection?

    Vection是VR领域的一个专有名词,其义指“在虚拟现实中给人带来‘移动’(self-motion)感觉的认知因素”1.也就是说,vection就是指那些给玩家带来“我正在这个虚拟环境中移动”这种感 ...

  5. phpcms中的RBAC权限系统

    PHPCMS中的RBAC权限系统主要用到了4张数据表:管理员表,角色表,菜单表,菜单权限表.先来看看数据库的数据表结构: admin 管理员表 ID 字段 类型 Null 默认 索引 额外 注释 1 ...

  6. MAXIMO系统 java webservice 中PDA移动应用系统开发

    MAXIMO系统 java webservice 中PDA移动应用系统开发  平时经常用的wince PDA手持设备调用c#写的webservice, 当然PDA也可以调用java webservic ...

  7. Win8下在Vmware11中安装使用苹果系统OS X 10.10

    原文:Win8下在Vmware11中安装使用苹果系统OS X 10.10   近来因为需要做 iOS 的项目,所以需要多花一些时间看看敲敲代码.因为自己手头上并没有 Mac(过年为了闲的时候能玩玩游戏 ...

  8. SSIS中Sql Task 获取系统变量

    原文:SSIS中Sql Task 获取系统变量 执行 SQL 任务使用不同的连接类型时,SQL 命令的语法使用不同的参数标记.例如,ADO.NET 连接管理器类型要求 SQL 命令使用格式为 @var ...

  9. wemall doraemon中Android app商城系统工具集合类,包含各种程序中用到的静态方法

    wemall doraemon中Android app商城系统工具集合类,包含各种程序中用到的静态方法,可用于其他商城或者系统的编程参考 package cn.zzu.edu.wemall.utils ...

随机推荐

  1. stdcall、cdecl详解(以及WINAPI和CALLBACK之类的宏对应什么)

    转自:http://blog.csdn.net/huanjieshuijing/article/details/5822942 对_stdcall 的理解在C语言中,假设我们有这样的一个函数:int ...

  2. Hessian 序列化和反序列化实现

    先聊聊 Java的序列化,Java官方的序列化和反序列化的实现被太多人吐槽,这得归于Java官方序列化实现的方式. 1.Java序列化的性能经常被吐槽.2.Java官方的序列化后的数据相对于一些优秀的 ...

  3. meta 标签代码解决IE兼容问题,IE6,IE7,IE8,IE9,IE10(包括360的兼容模式)

    最近做了一个项目,客户反映,在360下布局错位,远程调试了一下,发现客户使用的是360的兼容模式,然而我在自己的电脑上测试的时候是正常的(兼容模式也正常):简单研究了一下360的兼容模式,在360的兼 ...

  4. scanf ---------未完待续

    1.不可读入空格 #include<iostream> #include<stdio.h> using namespace std; int main() { char c[5 ...

  5. 大数据_学习_01_Hadoop 2.x及hbase常用端口及查看方法

    二.参考资料 1.Hadoop 2.x常用端口及查看方法

  6. PHP获取当前日期及本周一是几月几号的方法

    这篇文章主要介绍了PHP获取当前日期及本周一是几月几号的方法,涉及php时间戳.日期转换与运算相关操作技巧,需要的朋友可以参考下 本文实例讲述了PHP获取当前日期及本周一是几月几号的方法.分享给大家供 ...

  7. codeforces 86D D. Powerful array(莫队算法)

    题目链接: D. Powerful array time limit per test 5 seconds memory limit per test 256 megabytes input stan ...

  8. 本机不装Oracle,使用plsql连接远程Oracle的方法

    由于Oracle的庞大,有时候我们需要在只安装Oracle客户端如plsql.toad等的情况下去连接远程数据库,可是没有安装Oracle就没有一切的配置文件去支持.最后终于发现一个很有效的方法,Or ...

  9. Operating System-Process(2)进程表&&中断处理

    上一篇文章阐述了进程的基本信息,本文主要介绍进程的实现,主要内容: 进程表(Process Table or Process Control Blocks) 中断处理(Interrupt) 一.进程表 ...

  10. CF475D:CGCDSSQ

    浅谈\(RMQ\):https://www.cnblogs.com/AKMer/p/10128219.html 题目传送门:https://codeforces.com/problemset/prob ...