在VR开发中,用户将以第一人称的视角进入虚拟世界,即用户同时身处两个坐标系:1. 现实世界坐标系(如房间的坐标系),用户的身体处于这个坐标系 2. VR世界坐标系,用户的感官处于这个坐标系,即用户觉得我处于这里。

  而如何同步这两个坐标系HTC VIVE已经帮我们解决了。由HTC VIVE开发的应用,在应用刚初始运行阶段,将用户所处的现实世界的位置和VR世界里的位置进行一次匹配,然后以此为基准来同步两者的关系,将现实中的移动通过空间定位映射到VR空间里的移动。

  但是这也产生了一个问题。在传统的二维屏幕的游戏中,一旦游戏角色走到墙体,可以用碰撞体挡住,不让其继续穿墙运动。而VR应用却不能阻挡用户的穿墙行动,原因是VR空间里的移动是根据人在现实世界里的走动来同步,只要我的房间够大,我就可以一直朝着一个方向走下去,而VR世界里的摄像机也将一直朝一个方向运动,这样势不可免将造成穿墙等问题,这并不是我们想要的结果。

那么要如何解决这个问题呢?

这里有两个想法:

一、软硬件结合。现实也造一堵和虚拟世界对应的墙,但这基本不符合实际(Haha~),Pass掉。

二、强行阻止VR虚拟角色继续前行。

而第二种方法又有两种解决方式:

1. 位移补偿: 虚拟角色在碰撞到墙时还继续往前走时控制其进行反向位移补偿或者将整个场景都往其运动方向进行移动补偿。

2. 碰撞体。和传统的游戏一样采用碰撞体阻止其继续前行,但碰撞体的强行插入将可能造成抖动。

这两个办法其实就是强行让两个世界坐标的位移映射失效。虽然可以达到不穿墙的效果,但是又会带来新的问题。

1. 用户的感受:什么鬼?为什么我在原地踏步?周围的东西为什么有种轻飘飘的感觉?看来我一定是要升天了~

2. 两个世界坐标系的原点产生偏移。

那么为什么会产生偏移呢?

下面用一张图来解释:

  这个问题在一般情况下可能不大,但当处于一个较小的房间而又频繁撞墙时,由于误差的积累,问题就产生了。我人已经在墙边了,需要交互的物体却还在离墙更远的地方,这可叫我如何是好?

综上:如何不让用户穿墙又可以规避缺陷:

1. 在有穿墙限制的同时提供手柄的瞬移功能,就不存在坐标系偏移造成的无法交互的后果。但仍然难以解决用户原地踏步感觉不良的问题。

2. 没有穿墙限制,在接近墙继续向前走时,通过UI或其他方式对用户进行提示:禁止继续往前走。在墙外布置一些空的场景,若用户执意要穿墙,走出去看不到什么新鲜的东西,也不会再尝试了,应该不会有人这么无聊吧,haha~

其实我是比较倾向使用第二种的,毕竟用户体验更自然、连贯性更好!具体采用哪种就要根据实际项目需求了。

  换个思路想,阻止不了穿墙也未必是件坏事,因为我们可以利用它来放置一些彩蛋,比如在一个无法打开的木桶里放置一些意外的惊喜,说不定用户感觉会更好~如果我把头探出墙外突然看到一个鬼脸对我说:"Catch you!"”那我一定会很“惊喜”的。

            

关于VR开发中的穿墙问题随想的更多相关文章

  1. VR开发中性能问题—OculusWaitForGPU

    http://blog.csdn.net/cartzhang/article/details/50788894 VR开发中性能问题-OculusWaitForGPU 本文章由cartzhang编写,转 ...

  2. VR开发的烦恼——范围限制

    本文章由cartzhang编写,转载请注明出处. 所有权利保留. 文章链接:http://blog.csdn.net/cartzhang/article/details/52230865 作者:car ...

  3. UE4关于Oculus Rift (VR)开发忠告

    转自:http://blog.csdn.net/cartzhang/article/details/42493843 UE4虚拟现实 实现的注意事项 https://docs.unrealengine ...

  4. 使用Unity5.1进行VR开发的配置(最新的未必是最好的!!!)

    随着Unity5.1的发布,之前的Oculus Rift和Gear VR 开发流程发生了巨大的变化,这也算是小白鼠们必须付出的代价了~ 那么Unity5.1和Oculus的整合究竟发生了哪些变化,对开 ...

  5. VR开发2015年终总结

    本文章由cartzhang编写,转载请注明出处. 所有权利保留. 文章链接:http://blog.csdn.net/cartzhang/article/details/50617605 作者:car ...

  6. TDD在Unity3D游戏项目开发中的实践

    0x00 前言 关于TDD测试驱动开发的文章已经有很多了,但是在游戏开发尤其是使用Unity3D开发游戏时,却听不到特别多关于TDD的声音.那么本文就来简单聊一聊TDD如何在U3D项目中使用以及如何使 ...

  7. React在开发中的常用结构以及功能详解

    一.React什么算法,什么虚拟DOM,什么核心内容网上一大堆,请自行google. 但是能把算法说清楚,虚拟DOM说清楚的聊聊无几.对开发又没卵用,还不如来点干货看看咋用. 二.结构如下: impo ...

  8. Android学习探索之Java 8 在Android 开发中的应用

    前言: Java 8推出已经将近2年多了,引入很多革命性变化,加入了函数式编程的特征,使基于行为的编程成为可能,同时减化了各种设计模式的实现方式,是Java有史以来最重要的更新.但是Android上, ...

  9. Java开发中的23种设计模式详解

    [放弃了原文访问者模式的Demo,自己写了一个新使用场景的Demo,加上了自己的理解] [源码地址:https://github.com/leon66666/DesignPattern] 一.设计模式 ...

随机推荐

  1. Java Web项目(Extjs)报错一

    1.Java Web(Extjs)项目报错一 usage: java org.apache.catalina.startup.Catalina [ -config {pathname} ] [ -no ...

  2. SecurityError:Error #2048:安全沙箱冲突

    1.错误描述 SecurityError:Error #2048:安全沙箱冲突:http://localhost:8080/YHD/flash/YHD.swf 不能从 http://123.89.45 ...

  3. Python实现常用的数据结构

    Python中的数据结构   #巧用Python列表特性实现特定数据结构 #栈实现stack = []stack.push(x)stack.pop()stack[-1] #队列实现from colle ...

  4. linux下直接拷贝新版本R

      如果要使用新版本的R,除了直接安装,也可以直接拷贝R的文件夹.这样既可以保留原始的R版本和R包,也可以使用新版本的R和R包,R包存放在R目录下的library文件夹. 文件放路径 R: /usr/ ...

  5. freemarker中的split字符串分割(十六)

    1.简易说明 split分割:用来根据另外一个字符串的出现将原字符串分割成字符串序列 2.举例说明 <#--freemarker中的split字符串分割--> <#list &quo ...

  6. 异常-----web.xml文件报错 Multiple annotations found at this line: - cvc-complex-type.2.4.b: The content of element 'welcome-file-list' is not complete. One of '{"http://java.sun.c

    1,检查抬头是不是有问题. <?xml version="1.0" encoding="UTF-8"?><web-app version=&q ...

  7. 【NFS】nfs安装调优

    nfs [root@flymaster ~]# rpm -qa nfs-utils rpcbindnfs-utils-1.2.3-75.el6.x86_64rpcbind-0.2.0-13.el6_9 ...

  8. 【BZOJ1901】【Luogu2617】Dynamic Ranking(主席树,树状数组)

    [BZOJ1901][Luogu2617]Dynamic Ranking(主席树,树状数组) 题面 神TM BZOJ权限题 Luogu真良心 题解 如果不考虑修改 很容易的主席树区间第K大 考虑修改 ...

  9. 【CJOJ1090】【洛谷1967】【NOIP2013】货车运输

    题面 Description A 国有 n 座城市,编号从 1 到 n,城市之间有 m 条双向道路.每一条道路对车辆都有重量限制,简称限重.现在有 q 辆货车在运输货物,司机们想知道每辆车在不超过车辆 ...

  10. 【noip模拟】2048

     Time limit: 1000ms         Memory limits: 256MB Description 2048曾经是一款风靡全球的小游戏.今天,我们换一种方式来玩这个小游戏.现在, ...