查看原文
其他

NewtonVR丨基于真实物理学的Vive VR游戏交互革新(下篇+Github)

2016-06-17 陆于璇 Gad-腾讯游戏开发者平台
导读:因为本文篇幅比较长,我们将分成上中下(三篇)在GAD微信公众号里连续三天推送。
Tomorrow Today实验室正在致力于在Unity中为HTC Vive开发一款未公布的VR游戏。为了设计和开发一种与物体交互的良好方法,我们花费了大量的时间。使用鼠标在屏幕上移动一个物体是一个非常简单直观的过程,你只需考虑两个维度的输入内容。但是,在虚拟现实之中,有三个方向,外加旋转需要考虑,这就需要一种新的物体交互的方法。
目前为止,还有大量神奇的虚拟现实体验等着被创造,我们非常乐意免费公布我们的交互系统(MIT license)去推动这一过程。
Newton VR
我们的系统允许玩家抓取,放下,投掷和使用已持有的物体,在这一过程中,物体本身不会改变它的父对象,也不会被设置为纯运动学状态。这意味着物体无法直接穿过其他物体(刚体),或者周围的环境介质(非刚体)。玩家持有的物体可以在考虑质量的情况下与其他刚体自然地交互作用。
例如,如果你有两个质量相同的盒子,它们可以等量的推动彼此,但一个相对来说质量小得多的气球将无法推动这个盒子。
https://v.qq.com/txp/iframe/player.html?vid=v03032qwpgw&width=500&height=375&auto=0
视频说明:有两个大方块(绿)和一个小方块(红),玩家通过手柄持有小方块,然而即使玩家持手柄穿过大方块,持有的小方块依旧不能穿过大方块,且小方块不能够推动大方块,但是大方块可以用来推动小方块和大方块。
默认情况下,物体被设置为可以从任意角度被抓取,但是,如果你需要在某个固定点抓住物体,它也可被旋转且自我调整到一个预设的方向。这将使你能够在任何角落捡起一个盒子,同时也可以捡起一把枪并使其调整到可抓取的方向。这里,我们仍依据物理学为理论基础来实现重物的抓举,使得物体在调整方向的过程中不会穿出墙壁或者地面。
https://v.qq.com/txp/iframe/player.html?vid=x030305e2f3&width=500&height=375&auto=0
视频说明:视频中有两个方块(绿)和一把手枪,同时存在地板和墙面,玩家通过控制手柄来抓取手枪,在抓取的过程中,手枪无法穿透地板、盒子和墙面,但是可以推动盒子;同时,玩家通过控制手柄可以调节抓取手枪的方向从而以正确的方向握住枪柄。
我们已经创造了一些物理的交互元素来实现基本的布局和菜单式的场景。同时,我们还提供了一种选项,通过按一个按钮动态地让控制器转变为一个物理实体。这可以使你操作手柄控制器就像操作一个物理实体一样,来与虚拟现实世界进行交互操作,这也意味着在这种模式下,它们将不再与你在现实世界中的控制器完全一一对应。也许这目前听起来还只是个粗略的方案,但实际上它非常酷。
https://v.qq.com/txp/iframe/player.html?vid=d0303d0gw4z&width=500&height=375&auto=0
视频说明:玩家手中有一个控制器,通过这个控制器可以开关门,可以转动转盘,调节一个球体光亮,旋转示数,移动物体,按动按钮,打开抽屉,拿出枪并开枪发射。
手柄按钮
是否使用手柄按钮来抓取物体是目前一个备受争议的热点,在这里我们认为使用它是利大于弊的。公布这一系统的代码的好处之一就是如果你不同意这种看法,你可以自行更改这种映射。如果你使用默认的系统,那么,按下手柄按钮你将可以捡起物体,松开按钮可以让你放下(或投掷)物体。
通过使用手柄按钮手持一个物体,可以让Vive控制器的其他按钮闲置出来,这可以让这些闲置的按钮用来操作那些正在持有的物体(例如,在持有一把枪的同时可以按下“扳机”按键来进行射击操作)。如果你的控制器没有悬停在某个可交互的物体的操作范围内,那么当你按下手柄按钮时,你的控制器将会变成一个物理实体,使得你可以用它和虚拟世界进行交互。这个模式可以用于操作一个控制面板上的按键,或者将你面前一些挡路的物体推离开。
具体实现
复制或下载我们的报告:https://github.com/TomorrowTodayLabs/NewtonVR/我们已经包含了SteamVR,因此本项目将会编译,并尽力保持版本更新。项目的主体内容在NewtonVR文件夹下。建议读者直接复制这个内容到本地,然后创建一个符号链接到你的项目,以便于获取自动更新并合并更新内容。
你可以获取桌面版的github客户端:http://desktop.github.com。在windows的系统里,以管理员身份打开命令行并且使用以下命令创建一个链接:mklink /D c:\git\MyProject\Assets\NewtonVR c:\git\NewtonVR\Assets\NewtonVR。第一个参数是你想要放置NewtonVR的文件夹位置,第二个参数是你要放置本地的NewtonVR库的位置。这个参数是推荐设置,并非必须设置。
在获取本项目之后,你也可以查看我们的一些案例场景,在NewtonVR/Example/NVRExampleScene。由于物理引擎PhysX对于大型碰撞体的运算和反馈更加真实,所以我们将所有的物体都放大了十倍。这些案例场景包括以下这些:
NVRInteractableItem
在这个场景中存在一些堆叠的盒子,这些盒子都有NVRInteractableItem组件,在最顶端有一个小盒子,你可以试着用它去推倒堆叠的大盒子从而观察基于质量的系统的工作方式。抽屉中有一把枪被配置了NVRInteractableItem.InteractionPoint属性,当你拿起这把枪的时候,该系统会试着在你手中旋转并调整枪的位置,最终使它保持一个合适的方向。
NVRInteractableRotator
门是有铰链的物体的一种实例,通常它存在于一个静态位置,但是在特定位置进行拖拽,你将可以旋转它。对于门的把手,我们给出了一种交互的脚本,NVRInteractableRotator.Rigidbody用于设置门的刚体部分。你也可以坚持对整个门使用目前的脚本,如果你觉得这样更加合理。为了得到当前选择的角度(从零度的旋转开始),你也可以读取属性NVRInteractableRotator.CurrentAngle。
NVRLetterSpinner
有一种继承于NVRInteractableRotator的文字下拉列表,你可以通过转动和抓取来从中选择一些文字信息。当然,对于VR来说,这并不是最佳的文本输入方法,但是它非常有趣。你可以通过调用NVRLetterSpinner.GetLetter()获取当前选择的文字信息。
NVRSlider
有一个关于滑块的实例,它可以在黑色和黄色之间急速地调节一个球体的颜色。为了获得滑块的值,你可以查看属性NVRSlider.CurrentValue。为了在本实例以外设置滑块,你需要设置NVRSlider.StartPoint到滑块的起始位置,NVRSlider.EndPoint到滑块的结束位置。如同许多用户交互元素一样,我们设计了一个可配置关节(Unity - Manual: Configurable Jointhttp://docs.unity3d.com/Manual/class-ConfigurableJoint.html)与滑块相关联,以此控制其极限范围,并且可以锁定位置或者旋转。
NVRInteractableItem
可交互物体类也可以用于创建一些刻度盘或者把手之类的元素。有一个实例是关于给出门把手的当前角度的,你可以通过访问本地欧拉角属性NVRInteractableItem.transform.localEulerAngles.y来获取当前的旋转角度。
NVRButton
为了和按键进行交互,您需要启用NVRPlayer.PhysicalHands,并且按住手柄按钮,从而使得您的控制器变成实体状态,或者使用其他物体对按键施加压力进行按压。在这一场景中,我们使用的按键有一个脚本NVRExampleSpawner,当按键被按下之后它会产生一个立方体。按键操作是通过NVRButton.DistanceToEngage方法完成的,如果你使一个按钮远离了其初始位置,那么NVRButton.ButtonDown就会在某一帧之中被触发,只要按键一直是按下状态,NVRButton.ButtonIsPushed的值将会保持真实值,之后,当按键回到其初始位置时,NVRButton.ButtonUp和NVRButton.ButtonWasPushed就会触发下一帧。
NVRSwitch
类似于NVRButton,NVRSwitch也需要有物理实体的手或者其他物理实体来与它完成交互。这个开关的实例场景中,该开关可以控制它旁边的一个聚光灯。通过Awake()方法,它可以调整自己的旋转角度来自动匹配NVRSwitch.CurrentState属性的值。
NVRExampleGun
在抽屉中有一把枪,它可以完美的演示如何使用NVRInteractableItem类从某一抓取点拿起物品,同时从这个组件中获取输入信息的功能。你可以通过手柄按钮拿起这把枪,并通过触发器(扳机)进行射击。
基本集成
为了将NewtonVR集成到一个项目中去,你可以使用我们在NewtonVR\NVRCameraRig中包含的预设,这是添加了NewtonVR脚本的SteamVR camerarig的副本。具体来说,有一个NVRPlayer组件在根部,一个NVRHead组件在头部,一个NVRHand组件在手部。你也可以只添加这些组件给你的虚拟现实玩家。需要注意的是,如果你在你的项目中不采用标准的控制器,那么物理双手的选项将无法正常工作。如果你希望可以抓取某个物体,那么只需要给它添加NVRInteractableItem组件。如果你没有给它定义刚体属性或者设置质量,那么还需要给它添加这些属性。如果你希望能够从一个特定的点去抓取这个物体,您可以创建一个新的GameObject,让它成为你当前的物体的父类,并把它调整到你所希望的你的控制器所在的角度和位置,之后,为这个新的对象设置属性NVRInteractableItem.InteractionPoint。
最后
我们希望本系统可以帮助您创造一些酷炫的虚拟现实体验,如果确有帮助,请告知我们。基本上任何人都可以免费实用本系统,包括用于独立游戏,商业游戏,教育应用等的制作。获取更多信息,请查看许可证。
我们现在正在我们自己的游戏中大量的运用本系统,并计划在开发过程中随时保持更新。如果对本系统有任何疑问或者建议,请随时在评论区留下您的信息,也可以在Twitter上@TTLabsVR,或者在Github上创建问题。
NewtonVR开发: Keith Bradner, Nick Abel用户体验设计: Adrienne Hunter
相关阅读:NewtonVR丨基于真实物理学的Vive VR游戏交互革新(上)NewtonVR丨基于真实物理学的Vive VR游戏交互革新(中)
腾讯游戏开发者平台长按,识别二维码,加关注
经验分享丨项目实践项目孵化丨渠道发行做有梦想的游戏人-GAME AND DREAM-

您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存