HTC Vive小场地与大场景空间的解决方案
本文章由cartzhang编写,转载请注明出处。 所有权利保留。
文章链接:http://blog.csdn.net/cartzhang/article/details/52780621
作者:cartzhang
HTC Vive小场地与大场景空间的解决方案
对于Vive,我们可以正常使用,运动追踪功能是 HTC Vive 的一大亮点,这也让很多适配 HTC Vive 的游戏能够让用户动起来,听起来很酷,体验起来也很酷。在小范围移动1:·1的范围内活动或固定位置的游戏中,定位精确,并且延迟很低,各种优点不一而足。
但是空间问题,让想在小空间大场景的游戏中的玩家排在了门外,HTC官方建议:HTC 建议消费者在至少 20 平米空间使用全套装备,这也意味着你的游戏房要足够大。土豪就不用往下看了!!!
但是对于想要开疆扩土的用户,在实际中场地大小就成为了局限,用户没有恰好游戏场景大小的场地,游戏场地过大,而玩家场地太小,怎么解决呢?
还有就是要是1:1的场地,会有一种游戏场景非常局促,感觉没有走多远就到了边际,让玩家十分不爽。
所以这里给出了变比空间的HTC头盔的移动问题的解决方案。
当然,若你有更好的办法,也欢迎讨论。
我们重点来说,游戏场景过大,而实际场地台较小,需要对位移进行比例加速问题。
我们要解决问题有三个:
1. 边界放大
2. 起点位置平移
3. 游戏空间与场地非等比空间速度缩放
一、边界放大
首先,来看看官方SteamVR给出的预制体的顶视图:
发现没有。
在HTC 头盔的游戏中,玩家总在蓝色框的中间位置。而对于需要从(0,0)作为起点的游戏,需要在房间内到处移动,并且根据游戏剧情,需要空间移动的游戏,这个就只可以用原有场地的1/4的场地了,更造成了场地的浪费。
我们首先解决的就是位置需要偏移问题。
其次,看到蓝色边框的大小了没有。其实蓝色框范围很小,
看代码:
public enum Size
{
Calibrated,
_400x300,
_300x225,
_200x150
}
这个面积小,不满足需求,怎么办呢? 自己来增加啊,搞大场地!!
我就自己做了一个区域标识。
小的蓝色框为它原本的400*300的,大的为我自己缩放的区域。
选择Size为Calibrated这个选项,缩放即可。特地添加了一个父节点,以防止在直接节点上缩放出问题,xz均缩放为4,Y仍旧为1。
这个标识就基本满足游戏中场地大小为9*9米的一个大场地了。
二、起点位置平移
好了。现在回来说,起点的平移问题。
分两部:
一个是视觉上,就是在游戏编辑器模式下,让玩家在蓝色区域的起点角点位置。这个容易,就是还是平移。平移谁呢,平移蓝色区域,把刚才缩放的那个预制体的父节点做了平移,项目中的平移位置为(4.2,0,4.2)即可。
这部分就搞定了。
第二部分,就是比较繁琐一点了。
说这个问题之前,需要稍微说下SteamVR插件的运行时和编辑状态的相机差别。
这个是编辑器模式下的相机状态。
但是在运行时候,相机的层级结构会发生较大的变化。
可以看到eye作为父节点,ears作为子节点,而head则被隐藏了。
具体代码处理是在SteamVR_Camera.cs中的OnEnable中处理。
部分代码:
if (head != t)
{
Expand();
t.parent = origin;
while (head.childCount > 0)
head.GetChild(0).parent = t;
// Keep the head around, but parent to the camera now since it moves with the hmd
// but existing content may still have references to this object.
head.parent = t;
head.localPosition = Vector3.zero;
head.localRotation = Quaternion.identity;
head.localScale = Vector3.one;
head.gameObject.SetActive(false);
_head = t;
}
还有ears的处理代码,设置ears的相机参数:
if (ears == null)
{
var e = transform.GetComponentInChildren<SteamVR_Ears>();
if (e != null)
_ears = e.transform;
}
if (ears != null)
ears.GetComponent<SteamVR_Ears>().vrcam = this;
为什么讲了这么多结构呢?因为它影响到了玩家起点平移的算法和处理。
怎么处理呢?
其实是蛮简单。给相机的父节点在初始化时候,重置一个与相机初始化一个相反的参数。
为什么呢?这正是为了抵消相机在场景中从(0,0)点作为起点的变化啊.
具体代码:
using UnityEngine;
using System.Collections;
public class PlayerPosIntitial : MonoBehaviour
{
private bool bUseOnce = false;
public Transform eye;
private float starttime;
private float delaytime = 4.0f;
// Use this for initialization
void Start ()
{
starttime = Time.time;
}
// Update is called once per frame
void Update ()
{
if (!bUseOnce && (Input.GetMouseButton(0) || Input.GetKey(KeyCode.JoystickButton0) || Time.time - starttime >= delaytime))
{
bUseOnce = true;
if (null != eye)
{
this.transform.localPosition = new Vector3(-eye.transform.localPosition.x,0,-eye.transform.localPosition.z);
Debug.Log ("set player initila position");
}
}
}
}
这个根据自己需要来处理的按键和时间自动开始。可以不这样用按键啥的。
这里顺便说一句:
就是要添加手柄,只需要把手柄脚本放这节点下,然后设置左右手柄即可。
手柄在随后中,并不会由于位移的加速对其造成影响。
三、游戏空间与场地非等比空间速度缩放
好了,说完了平移。
最后,那就是场景为9*9米,而我场地只有三米或5米,怎么办呢?
其实结果已经比较明显了。就是刚才FPSController还有个缩放的父节点。
那有人可能会有异议?直接来控制HTCvive相机的脚本来给得出的相机位置进行修改缩放不就可以了吗?
哎呀,这个方法确实很好啊。但是无法实现。为什么呢?
因为相机无法在脚本层控制。
在编辑器下运行模型下,把所有脚本代码勾选掉,相机的位置旋转均还可以正常使用。
这基本说明,相机的控制在脚本层的机会很少。
但是,我并不死心。下面就开始了各种尝试。
当然是在脚本中,看代码吧。
// 在数据更新层,让他设置为zero.
void Update()
{
transform.position = Vector3.zero;
}
void LateUpdate()
{
transform.position = Vector3.zero;
}
//在渲染层的某个阶段处理,设置为零。
void PreRender()
{
transform.position = Vector3.zero;
}
void OnPostRender()
{
transform.position = Vector3.zero;
}
要说的是:以上代码对与HTC头盔的相机设置下工均没有任何的作用。看清楚是对实际效果有任何作用。
要说有作用,在编辑器模式下,编辑器里面现实为零,但是相机数据仍可以变化,这是由于编辑器的数据显示要先于真实的相机坐标,只是个假象,都是幻觉。
最终的解决方案,给FPSController添加一个父节点,这样就基本搞定了。
UpdatCamera的代码:
using UnityEngine;
using System.Collections;
public class UpdateCamra : MonoBehaviour
{
public Transform ViveCamera;
public float ScaleLength = 0.5f;
// Use this for initialization
void Start ()
{
#if UNITY_EDITOR
#else
ScaleLength = PlayerControl.m_Cfg.MaxDeltaVel;
#endif
}
// Update is called once per frame
void Update ()
{
if (null != ViveCamera)
{
transform.position = new Vector3 (ViveCamera.position.x * ScaleLength, ViveCamera.position.y, ViveCamera.position.z * ScaleLength);
}
}
}
为了便于根据场地的大小和游戏场景的大小调节匹配,缩放参数做了一个配置文件。这里就不过多的详述了。
至此,我们完成了,边界放大,起点位置平移,游戏空间与场地非等比空间速度缩放。
顺便说下,我们游戏场景为9*9而实际测试场地为2.5米左右的时候,缩放系数为0.5,这时候由于场地过小,速度过快有少于不适。而在5*5左右时候,调节参数,整体感觉还是非常舒服的,也没有由于空间的大小而在游戏中感到局促。
参考:
SteamVR Unity官方的插件quikstart.pdf。
—————————-THE———END—————————–
若有问题,请随时联系!!!
非常感谢!!!
昨天天气好,晚上有人看到了两个月亮。
HTC Vive小场地与大场景空间的解决方案的更多相关文章
- HTC Vive 体验的折腾经历
HTC Vive 是个什么东西, 想必我就不用介绍了, 不知道自己百度吧 HTC Vive发布已经有一段时间了, 一直很纠结买还是不买, 这玩意太贵(官网6888),买了还不能直接用, 还要配太高性能 ...
- 头显HTC Vive北美直降100美元,中国区降价活动今日公布
如果你现在想要购买一台VR头显,591ARVR资讯网www.591arvr.com的小编提醒大家可以等一等,在即将到来的年末促销中各种VR设备都将迎来大力度降价.目前北美市场的HTC Vive已经直降 ...
- 如何低成本的打造HTC Vive虚拟演播室直播MR视频?
http://m.toutiao.com/i6298923859378700802/?tt_from=weixin&utm_campaign=client_share&from=gro ...
- Unity 5.4大赞:HTC Vive经典The lab渲染器开源
HTC Vive提供了一个不错的免费VR demo,最近1周仔细体验了一番. 仔细看了其安装文件,竟然是Unity 5.4beta版本(通过查log,知道Valve公司用的是最新的5.4.0b11版本 ...
- HTC Vive的定位技术
Lighthouse空间定位,chaperone系统避免实际障碍物 HTC vive所用的Lighthouse技术属于激光定位技术,Oculus Rift以及索尼PlayStation VR所用的定位 ...
- 如何透过HTC Vive拍摄Mixed Reality (混合现实)影片
https://www.vive.com/cn/forum/1706?extra=page%3D1 也许你是一位开发者,想为自己的HTC Vive游戏制作酷炫的宣传片:或者你是游戏主播,想为观众带来高 ...
- HTC Vive 与Leap Motion 出现位置错误的问题
Leap Motion已经支持VR, 但是官方没有支持HTC Vive的例子. 按照官方的文档, 其实是有问题的: https://developer.leapmotion.com/documenta ...
- Unity正式发布首个“实验性”VR编辑器,支持HTC Vive和Oculus Rift
Unity今天正式推出"实验性"VR编辑器.据悉,EditorVR是Unity游戏引擎中的一个组件,可让开发者在虚拟现实环境中开发游戏.为何要称之为"实验性"? ...
- 用Unity开发HTC VIVE——手柄控制篇
写这篇文章的原因主要是因为现在虚拟现实非常的火爆但目前主流的虚拟现实设备(HTC VIVE)的教程却少的可怜,这个我深有体会.所以,我想将我平时开发中遇到的问题以及解决方法记录下来,分享给大家,若其中 ...
随机推荐
- April 2 2017 Week 14 Sunday
You only live once, but if you do it right, once is enough. 人生只有一次,但如果活对了,一次也就够了. Maybe I am going t ...
- xml 转义特殊字符
写了个request2XML的方法,每当数据中有'<'.'&'符号时,封装的XML就无法解析.发现了XML里的CDATA属性,问题迎刃而解!在XML文档中的所有文本都会被解析器解析. 只 ...
- ubuntu git svn 缺少 subversion-perl
在命令行中输入以下命令:sudo apt-get install subversion-tools等待安装成功即可.
- 【luogu P3378 堆】 模板
题目链接:https://www.luogu.org/problemnew/show/P3378 是堆的模板...我懒,STL da fa is good #include <iostream& ...
- Angularjs实例应用
<!DOCTYPE html><html><head><meta http-equiv="Content-Type" content=&q ...
- Linux中软件使用笔记
刚刚接触Linux的小白,难免会碰到各种小问题,不要灰心,总有办法的... 1.搜狗输入法崩溃,打不出中文?都是乱码?一招制敌! 在Terminal中输入下面命令后重启电脑即可重生- 还有,是Sogo ...
- Restframework框架总结及restful规范
1. django rest framework框架的作用? 帮助开发者可以快速开发出遵循restful规范的API 2. django rest framework框架都有哪些组件(10)? -版本 ...
- 使用RMAN对数据文件进行恢复
(1)备份数据库 在使用RMAN进行数据库恢复之前,先用RMAN进行全库备份 [oracle@redhat6 ~]$ rman target / Recovery Manager: Release : ...
- 关于Mobius反演
欧拉函数 \(\varphi\) \(\varphi(n)=\)表示不超过 \(n\) 且与 \(n\) 互质的正整数的个数 \[\varphi(n)=n\cdot \prod_{i=1}^{s}(1 ...
- [NOI2002]荒岛野人(exgcd,枚举)
题目描述 克里特岛以野人群居而著称.岛上有排列成环行的M个山洞.这些山洞顺时针编号为1,2,…,M.岛上住着N个野人,一开始依次住在山洞C1,C2,…,CN中,以后每年,第i个野人会沿顺时针向前走Pi ...