2019年02月14日 22:21:19 VRunSoftYanlz 阅读数:562
《SteamVR2.0开发指南》 |
版本 |
作者 |
参与者 |
完成日期 |
备注 |
SteamVR2.0_Guide_V01_1.0 |
严立钻 |
|
2019.01.23 |
|
|
|
|
|
|
【XR游戏开发:】
《SteamVR2.0开发指南》发布说明:
++++“SteamVR2.0开发指南”:是对“SteamVR2.0”的入门指导;(2019年度的重点技术突破点确立为:“SteamVR”)
++++“SteamVR2.0开发指南”:定位在熟悉SteamVR框架;
++++OpenVR的Github:https://github.com/ValveSoftware/openvr
++++OpenXR官网:https://www.khronos.org/openxr
++++SteamVR的Github:https://github.com/ValveSoftware/steamvr_unity_plugin
《SteamVR2.0开发指南》目录
#第一篇:网络杂谈篇
#第二篇:视频杂谈篇
#第三篇:文档杂谈篇
#第四篇:项目杂谈篇
#第一篇:网络杂谈篇
#第一篇:网络杂谈篇 |
#第一篇:网络杂谈篇
++++立钻哥哥:“网络杂谈篇”是对SteamVR2.0知识的全网搜索,利用“SteamVR2.0”关键字百度整理;
++++A.1、SteamVR2.0插件使用指南
++++A.2、
++++A.3、
++++A.4、
++++A.5、
A.1、SteamVR2.0插件使用指南
A.1、SteamVR2.0插件使用指南 |
++A.1、SteamVR2.0插件使用指南
++++立钻哥哥:随着VR生态的日益增长,以及Valve Knuckles控制器的逐渐完善,SteamVR未来能够提供给用户更多的交互方式,比如手指跟踪和力反馈;
++++近期,Valve在Unity资源商店中将SteamVR插件更新到了2.0版:
++概述
++++立钻哥哥:三年前(2015年),SteamVR SDK for Unity插件的第一个版本在Unity资源商店发布,在以后的时间里,VR生态发生了很多变化,比较显著的是出现了很多不同类型的控制器,如下图:
++重要更新:Input System
++++立钻哥哥:SteamVR2.0的重要更新是加入了[Input System];
++++推出[Input System]的目的,是为了更加符合OpenXR标准,以及配合即将正式推出的Knuckles控制器;
++++目前多数主流VR平台均加入了OpenXR开放标准:
++++[Input System]与之前处理用户输入有显著的不同,使用[SteamVR Input System],开发人员可以在应用程序之外定义默认的动作并与按键进行绑定,而不需要将输入视为某一特定设备的特定按键;这样新的设备可以快速适配应用程序,无需更改代码;
++++比如:当开发者检测玩家是否抓取某个物体的时候,不是检测Vive等控制器的Trigger键或Oculus Touch控制器的Grip键是否被按下,而是检测预定义的“Grab”动作是否为True即可;(作为开发者,可以在SteamVR中为Grab动作设置默认按键和阈值,当程序运行时,也可修改这些数值以满足玩家的个人偏好);基于这种机制,不光能够解决控制器碎片化的问题,也可以快速适配未来发布的设备;
++动作(Actions)
++++立钻哥哥:[Input System]的核心概念是动作(Action),基于动作的输入系统对于游戏引擎来说更有意义,Unreal一直在沿用这种方案,而Unity目前在开发中的输入系统也将遵循这一原则;
++++开发中需要放弃之前关于“按下某个按键发生什么事情”的思想,取而代之的是使用“做出某个动作发生什么事情”的思想;
++++SteamVR2.0将动作抽象为以下6种类型:Boolean、Single、Vector2、Vector3、Pose、Skeleton等类型;
++++[Boolean]类型的动作代表只有两种状态的动作:True或False,比如抓取(Grab)动作,只有抓取或未抓取两种状态,不存在中间状态;(在Unity中对应类为:SteamVR_Action_Boolean);
++++[Single]类型的动作能够返回0~1之间的数值,比如Trigger键按下到松开的过程;(在Unity中对应类为:SteamVR_Action_Single);
++++[Vector2]类型动作能够返回二维数,比如Touchpad上的触摸或手柄摇杆;使用这样的数值能够控制物体在四个方向的运动,典型的应用是使用Touchpad控制无人机或小车的运动;(在Unity中对应类为:SteamVR_Action_Vector2);
++++[Vector3]类型的动作能够返回三维数值;(在Unity中对应类为SteamVR_Action_Vector3);
++++[Pose]类型的动作表示三维空间中的位置和旋转,一般用于跟踪VR控制器;(在Unity中对应类为SteamVR_Action_Pose);
++++[Skeleton]类型的动作能够获取用户在持握手柄控制器时的手指关节数据,通过返回数据,结合手部渲染模型,能够更加真实的呈现手部在虚拟世界的姿态,虽然不及像Leap Motion等设备获取手指输入那样精确,但是足以获得良好的沉浸感;(在Unity中对应类为:SteamVR_Action_Skeleton);
++SteamVR2.0目录结构
++++立钻哥哥:首先来利用Xmind看一下目录结构:
++SteamVR2.0更新说明
++++A.1.1、概述
++++A.1.2、重要更新:[Input System]
++++A.1.3、动作(Actions)
++++A.1.4、动作集(Action Sets)
++++A.1.5、SteamVR Input窗口
++++A.1.6、测试动作
++++A.1.7、动作绑定
++++A.1.8、在代码中使用动作
++++A.1.9、[Interaction System]的变化
++++A.1.10、VRTK是否能够继续结合SteamVR2.0使用
A.1.1、概述
A.1.1、概述 |
++A.1.1、概述
++++立钻哥哥:随着越来越多的VR设备推出,控制器类型逐渐趋向于碎片化;每当有新的控制器发布,都会给开发者带来一些额外的工作量:游戏项目需要修改交互代码以适配新的设备;
++++从开发层面上来看,不同的控制器具有不同的键值映射,所以,当现有VR应用程序移植到另外一个VR平台的时候,需要针对目标平台进行交互适配;鉴于此,Valve为Unity开发者推出了SteamVR Unity Plugin2.0(简称SteamVR2.0),能够使开发者在编程中专注于用户的动作,而不是具体的控制器按键;
A.1.2、重要更新:[Input System]
A.1.2、重要更新:[Input System] |
++A.1.2、重要更新:[Input System]
++++立钻哥哥:SteamVR2.0的重要更新是加入了[Input System];
++++推出[Input System]的目的,是为了更加符合OpenXR标准,以及配合即将正式推出的Knuckles控制器;
++++目前多数主流VR平台均加入了OpenXR开放标准:
++++[Input System]与之前处理用户输入有显著的不同,使用[SteamVR Input System],开发人员可以在应用程序之外定义默认的动作并与按键进行绑定,而不需要将输入视为某一特定设备的特定按键;这样新的设备可以快速适配应用程序,无需更改代码;
++++比如:当开发者检测玩家是否抓取某个物体的时候,不是检测Vive等控制器的Trigger键或Oculus Touch控制器的Grip键是否被按下,而是检测预定义的“Grab”动作是否为True即可;(作为开发者,可以在SteamVR中为Grab动作设置默认按键和阈值,当程序运行时,也可修改这些数值以满足玩家的个人偏好);基于这种机制,不光能够解决控制器碎片化的问题,也可以快速适配未来发布的设备;
A.1.3、动作(Actions)
A.1.3、动作(Actions) |
++A.1.3、动作(Actions)
++++A.1.3.1、骨骼输入
++++A.1.3.2、振动输出
++++立钻哥哥:[Input System]的核心概念是动作(Action),基于动作的输入系统对于游戏引擎来说更有意义,Unreal一直在沿用这种方案,而Unity目前在开发中的输入系统也将遵循这一原则;
++++开发中需要放弃之前关于“按下某个按键发生什么事情”的思想,取而代之的是使用“做出某个动作发生什么事情”的思想;
++++SteamVR2.0将动作抽象为以下6种类型:Boolean、Single、Vector2、Vector3、Pose、Skeleton等类型;
++++[Boolean]类型的动作代表只有两种状态的动作:True或False,比如抓取(Grab)动作,只有抓取或未抓取两种状态,不存在中间状态;(在Unity中对应类为:SteamVR_Action_Boolean);
++++[Single]类型的动作能够返回0~1之间的数值,比如Trigger键按下到松开的过程;(在Unity中对应类为:SteamVR_Action_Single);
++++[Vector2]类型动作能够返回二维数,比如Touchpad上的触摸或手柄摇杆;使用这样的数值能够控制物体在四个方向的运动,典型的应用是使用Touchpad控制无人机或小车的运动;(在Unity中对应类为:SteamVR_Action_Vector2);
++++[Vector3]类型的动作能够返回三维数值;(在Unity中对应类为SteamVR_Action_Vector3);
++++[Pose]类型的动作表示三维空间中的位置和旋转,一般用于跟踪VR控制器;(在Unity中对应类为SteamVR_Action_Pose);
++++[Skeleton]类型的动作能够获取用户在持握手柄控制器时的手指关节数据,通过返回数据,结合手部渲染模型,能够更加真实的呈现手部在虚拟世界的姿态,虽然不及像Leap Motion等设备获取手指输入那样精确,但是足以获得良好的沉浸感;(在Unity中对应类为:SteamVR_Action_Skeleton);
++A.1.3.1、骨骼输入
++++立钻哥哥:对于骨骼输入,Knuckles控制器为SteamVR体验带来了手指跟踪功能,能够估算用户手指的位置,然后将数据传递给驱动程序,驱动程序将其对应解析到手部模型的31块骨骼上,从而给用户带来更好的沉浸式体验;
++++该功能并不是Knuckles所独有,SteamVR还能够为HTC Vive和Oculus Touch这样的设备提供手指状态估算,比如判断手部是否打开,手指是否放置在Touchpad上;
++++同时Valve公司还将与Microsoft展开合作,以增加对Windows MR控制器的支持;
++++默认情况下,运行[Interaction System]示例场景中能够同时看到手部和控制器模型,此外,还有一个辅助组件[SteamVR_Behaviour_Skeleton],如下图所示:
++SteamVR/Input/SteamVR_Action_Skeleton.cs
++++立钻哥哥:\Assets\SteamVR\Input\SteamVR_Action_Skeleton.cs
using UnityEngine; using System.Collections; using System; using System.Runtime.InteropServices; using System.Collections.Generic;
namespace Valve.VR{ //Skeleton Actions are our best approximation of where your hands are while holding vr controllers and pressing buttons. We give you 31 bones to help you animate hand models. For more information check out this blog past:https://steamcommunity.com/games//announcements/detail/ (立钻哥哥:当你手持vr控制器并按下按钮时,骨架动作是你的手的最佳近似值。我们给你31块骨头来帮助你制作手的动画模型。想了解更多信息,请访问这个博客:https://steamcommunity.com/games//announcements/detail/) public class SteamVR_Action_Skeleton : SteamVR_Action_Pose{ public const int numBones = 31;
[NonSerialized] protected List<Vector3[]> bonePositions = new List<Vector3[]>();
[NonSerialized] protected List<Quaternion[]> boneRotations = new List<Quaternion[]>();
[NonSerialized] protected List<Vector3[]> lastBonePositions = new List<Vector3[]>();
[NonSerialized] protected List<Quaternion[]> lastBoneRotations = new List<Quaternion[]>();
[NonSerialized] protected Dictionary<SteamVR_Input_Sources, EVRSkeletalMotionRange> rangeOfMotion = new Dictionary<SteamVR_Input_Sources, EVRSKeletalMotionRange>(newSteamVR_Input_Sources_Comparer());
[NonSerialized] protected VRBoneTransform_t tempBoneTransforms = newVRBoneTransform_t[numBones];
[NonSerialized] protected InputSkeletalActionData_t tempSkeletorActionData = newInputSkeletalActionData_t();
[NonSerialized] protected uint skeletonActionData_size = 0;
[NonSerialized] protected Dictionary<SteamVR_Input_Sources, EVRSkelealTransformSpace> skeletalTransformSpace = new Dictionary<SteamVR_Input_Sources, EVRSkeletalTransformSpace>(new SteamVR_Input_Sources_Comparer());
public override void Initialize(){} protected override void InitializeDictionaries(SteamVR_Input_Sources source){} public override void UpdateValue(SteamVR_Input_Sources inputSource){} public override void UpdateValue(SteamVR_Input_Sources inputSource, boolskipStateAndEventUpdates){}
public Vector3[] GetBonePositions(SteamVR_Input_Sources inputSource){} public Quaternion[] GetBoneRotations(SteamVR_Input_Sources inputSource){} public Vector3[] GetLastBonePositions(SteamVR_Input_Sources inputSource){} public Quaternion[] GetLastBoneRotations(SteamVR_Input_Sources inputSource){}
//Set the range of the motion of the bones in this skeleton. Options are “With Controller” as if your hand is holding your VR controller. Or “Without Controller” as if your hand is empty.(立钻哥哥:设定骨骼运动的范围。选项是“With Controller”,就像你的手握着VR控制器一样。或者“没有控制器”,就好像你的手是空的。) public void SetRangeOfMotion(SteamVR_Input_Sources inputSource, EVRSkeletalMotionRange range){}
//Sets the space that you’ll get bone data back in. Options are relative to the Model, relative to the Parent bone, and Additive.(立钻哥哥:设置你会得到骨头数据的空间。选项是相对于模型、相对于父骨骼和附加的。) public void SetSkeletalTransformSpace(SteamVR_Input_Sources inputSource, EVRSkeletalTransformSpace space){}
} //立钻哥哥:public class SteamVR_Action_Skeleton:SteamVR_Action_Pose{}
//The change in range of the motion of the bones in the skeleton. Options are “With Controller” as if your hand is holding your VR controller. Or “Without Controller” as if your hand is empty.(立钻哥哥:骨骼运动范围的变化。选项是“With Controller”,就像你的手握着VR控制器一样。或者“没有控制器”,就好像你的手是空的。) public enum SkeletalMotionRangeChange{ None = -1, WithController = 0, WithoutController = 1, } //立钻哥哥:public enum SkeletalMotionRangeChange{}
} //立钻哥哥:namespace Valve.VR{} |
++A.1.3.2、振动输出
++++立钻哥哥:目前还有一种输出动作:振动,用于触发VR控制器上的触觉反馈,调用方法如下:
SteamVR_Input._default.outActions.Haptic.Execute(float secondsFromNow, float durationSeconds, float frequency, float amplitude, SteamVR_Input_Sources inputSource); |
++SteamVR/Input/SteamVR_Action_Out.cs
++++立钻哥哥:\Assets\SteamVR\Input\SteamVR_Action_Out.cs
using UnityEngine; using System.Collections; using System; using Valve.VR; using System.Runtime.InteropServices;
namespace Valve.VR{ //There is currently only one output type action - vibration. But there may be more in the future.(立钻哥哥:目前只有一种输出类型的动作-振动。但未来可能会有更多。) public abstract class SteamVR_Action_Out : SteamVR_Action{ } //立钻哥哥:public abstract class SteamVR_Action_Out:SteamVR_Action{} } //立钻哥哥:namespace Valve.VR{} |
A.1.4、动作集(Action Sets)
A.1.4、动作集(Action Sets) |
++A.1.4、动作集(Action Sets)
++++立钻哥哥:动作通过动作集进行逻辑上的分组,以方便进行组织和管理,在Unity中对应的类为SteamVR_ActionSet;
++++在不同的场景或应用程序之间可以切换使用不同的动作集,比如,应用程序中有一个场景是在地球上拾取并投掷物体,而另一个场景则是在太空中飞行,那么这两个场景可以使用不同的动作集;
++++同时,当针对新设备进行交互适配时,开发者只需对动作进行配置,而不必修改项目代码;(比如,使用Vive控制器时,定义了一个Fire动作,当需要支持Rift Touch时,只需通过配置Touch控制器上符合Fire动作的键值即可)
++++SteamVR插件默认包含了三套动作集:default、platformer、buggy,开发者也可以在[SteamVR Input]窗口中自行添加或删除动作集;
++++使用组件[SteamVR_ActivateActionSetOnLoad]可以在场景中自动激活和停用指定的动作集;对应激活和停用的方法是在Start()和OnDestroy()中实现;
++SteamVR/Input/SteamVR_ActivateActionSetOnLoad.cs
++++立钻哥哥:\Assets\SteamVR\Input\SteamVR_ActivateActionSetOnLoad.cs
using UnityEngine; using System.Collections;
namespace Valve.VR{ //Automatically activates an action set on Start() and deactivates the set on OnDestroy(). Optionally deactivating all other sets as well.(立钻哥哥:自动激活Start()和OnDestroy()上的设置。也可以选择停用所有其他设置。) public class SteamVR_ActivateActionSetOnLoad : MonoBehaviour{ [SteamVR_DefaultActionSet(“default”)] public SteamVR_ActionSet actionSet;
public bool disableAllOtherActionSets = false; public bool activateOnStart = ture; public bool deactivateOnDestroy = true;
private void Start(){} private void OnDestroy(){}
} //立钻哥哥:public class SteamVR_ActivateSetOnLoad:MonoBehaviour{} } //立钻哥哥:namespace Valve.VR{} |
++图解SteamVR Input(Actions)
++++立钻哥哥:好吧,我们图解一下Input中相关Actions对话框:
A.1.5、SteamVR Input窗口
A.1.5、SteamVR Input窗口 |
++立钻哥哥推荐的拓展学习链接(Link_Url):
立钻哥哥推荐的拓展学习链接(Link_Url) |
++++立钻哥哥Unity 学习空间: SteamVR2.0开发指南
++++HTC_VIVE开发基础:SteamVR2.0开发指南
++++Oculus杂谈:SteamVR2.0开发指南
++++Oculus安装使用:SteamVR2.0开发指南
++++SteamVR简介:SteamVR2.0开发指南
++++SteamVR脚本功能分析:SteamVR2.0开发指南
++++SteamVR2.0开发指南:SteamVR2.0开发指南
++++SteamVR/Extras:SteamVR2.0开发指南
++++SteamVR/Input:SteamVR2.0开发指南
++++OpenXR简介:SteamVR2.0开发指南
++++VRTK杂谈:SteamVR2.0开发指南
++++VRTK快速入门(杂谈):SteamVR2.0开发指南
++++VRTK官方示例(目录):SteamVR2.0开发指南
++++VRTK代码结构(目录):SteamVR2.0开发指南
++++VRTK(SceneResources):SteamVR2.0开发指南
++++VRTK_ControllerEvents:SteamVR2.0开发指南
++++VRTK_InteractTouch:SteamVR2.0开发指南
++++VR实验:以太网帧的构成:SteamVR2.0开发指南
++++FrameVR示例V0913:SteamVR2.0开发指南
++++FrameVR示例V1003:SteamVR2.0开发指南
++++SwitchMachineV1022:SteamVR2.0开发指南
++++PlaySceneManagerV1022:SteamVR2.0开发指南
++++Unity5.x用户手册:SteamVR2.0开发指南
++++Unity面试题ABC:SteamVR2.0开发指南
++++Unity面试题D:SteamVR2.0开发指南
++++Unity面试题E:SteamVR2.0开发指南
++++Unity面试题F:SteamVR2.0开发指南
++++Cocos2dx面试题:SteamVR2.0开发指南
++++禅道[zentao]:SteamVR2.0开发指南
++++Lua快速入门篇(Xlua拓展):SteamVR2.0开发指南
++++Lua快速入门篇(XLua教程):SteamVR2.0开发指南
++++Lua快速入门篇(基础概述):SteamVR2.0开发指南
++++框架知识点:SteamVR2.0开发指南
++++游戏框架(UI框架夯实篇):SteamVR2.0开发指南
++++游戏框架(初探篇):SteamVR2.0开发指南
++++设计模式简单整理:SteamVR2.0开发指南
++++专题:设计模式(精华篇):SteamVR2.0开发指南
++++U3D小项目参考:SteamVR2.0开发指南
++++Unity案例(Vehicle):SteamVR2.0开发指南
++++UML类图:SteamVR2.0开发指南
++++PowerDesigner简介:SteamVR2.0开发指南
++++Unity知识点0001:SteamVR2.0开发指南
++++Unity知识点0008:SteamVR2.0开发指南
++++U3D_Shader编程(第一篇:快速入门篇):SteamVR2.0开发指南
++++U3D_Shader编程(第二篇:基础夯实篇):SteamVR2.0开发指南
++++Unity引擎基础:SteamVR2.0开发指南
++++Unity面向组件开发:SteamVR2.0开发指南
++++Unity物理系统:SteamVR2.0开发指南
++++Unity2D平台开发:SteamVR2.0开发指南
++++UGUI基础:SteamVR2.0开发指南
++++UGUI进阶:SteamVR2.0开发指南
++++UGUI综合:SteamVR2.0开发指南
++++Unity动画系统基础:SteamVR2.0开发指南
++++Unity动画系统进阶:SteamVR2.0开发指南
++++Navigation导航系统:SteamVR2.0开发指南
++++Unity特效渲染:SteamVR2.0开发指南
++++Unity数据存储:SteamVR2.0开发指南
++++Unity中Sqlite数据库:SteamVR2.0开发指南
++++WWW类和协程:SteamVR2.0开发指南
++++Unity网络:SteamVR2.0开发指南
++++C#事件:SteamVR2.0开发指南
++++C#委托:SteamVR2.0开发指南
++++C#集合:SteamVR2.0开发指南
++++C#泛型:SteamVR2.0开发指南
++++C#接口:SteamVR2.0开发指南
++++C#静态类:SteamVR2.0开发指南
++++C#中System.String类:SteamVR2.0开发指南
++++C#数据类型:SteamVR2.0开发指南
++++Unity3D默认的快捷键:SteamVR2.0开发指南
++++游戏相关缩写:SteamVR2.0开发指南
++++UnityAPI.Rigidbody刚体:SteamVR2.0开发指南
++++UnityAPI.Material材质:SteamVR2.0开发指南
++++UnityAPI.Android安卓:SteamVR2.0开发指南
++++UnityAPI.AndroidJNI安卓JNI:SteamVR2.0开发指南
++++UnityAPI.Transform变换:SteamVR2.0开发指南
++++UnityAPI.WheelCollider轮碰撞器:SteamVR2.0开发指南
++++UnityAPI.Resources资源:SteamVR2.0开发指南
++++JSON数据结构:SteamVR2.0开发指南
++++CocosStudio快速入门:SteamVR2.0开发指南
++++Unity企业内训(目录):SteamVR2.0开发指南
++++Unity企业内训(第1讲):SteamVR2.0开发指南
++++Unity企业内训(第2讲):SteamVR2.0开发指南
++++Unity企业内训(第3讲):SteamVR2.0开发指南
++++Unity企业内训(第4讲):SteamVR2.0开发指南
++++Unity企业内训(第5讲):SteamVR2.0开发指南
++++Unity企业内训(第6讲):SteamVR2.0开发指南
++++插件<Obi Rope>:SteamVR2.0开发指南
++++计算机组成原理(教材篇):SteamVR2.0开发指南
++++立钻哥哥Unity 学习空间: SteamVR2.0开发指南
--_--VRunSoft:lovezuanzuan--_--
转载自:SteamVR2.0开发指南
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:https://sigusoft.com/datagrip/3216.html