混合现实的应用,会将holograms(全息图)放置在你的世界中,让他们看起来和听起来像是真实的物体,这是坐标系统的核心功能。这包含了对于用户有意义的,精确位置和朝向,无论所在的世界是物理世界还是你创建的虚拟区域。在确定你的holograms位置和朝向,或者其他的几何位置信息如射线或手的位置时,Windows会提供各种各样的真实世界坐标系统,来表示这些几何信息,我们称之为“spatial coordinate systems”(空间坐标系统)
1、设备支持
特性 | Hololens | Immersive headsets |
Stationary frame of reference(固定参照系) | 支持 | 支持 |
Attached frame of reference(动态参照系) | 支持 | 支持 |
Stage frame of reference(场地参照系) | 尚未支持 | 支持 |
Spatial anchors(空间锚点) | 支持 | 支持 |
Spatial mapping(空间映射) | 支持 |
|
2、混合现实体验的不同级别
混合现实应用能够设计出不同级别的用户体验,从360度视频播放器只需要头显朝向,到需要空间映射和空间锚点的完整世界级别应用和游戏:
体验级别 | 要求 | 例子 |
Orientation-only(仅朝向) | 头显朝向(根据重力) | 360度视频播放器 |
Seated-scale(坐姿级别) | 同上,加上头显与0点的位置 | Elite: Dangerous |
Standing-scale(站立级别) | 同上,加上场景地面原点 | Obduction |
Room-scale(房间级别,小范围移动) | 同上,加上场景边界多边形扫描 | Fantastic Contraption |
World-scale(世界范围) | 空间锚点(和代表性的空间映射) | RoboRaid |
这些体验级别遵循“nesting dolls”(嵌套玩具)模型。Windows混合现实的一个关键设计原则是,一个支持特定高级别体验应用的头显,也支持较低级别:
6DOF tracking | Floor defined | 360째 tracking | Bounds defined | Spatial anchors | Max experience |
No | - | - | - | - | Orientation-only |
Yes | No | - | - | - | Seated |
Yes | Yes | No | - | - | Standing - Forward |
Yes | Yes | Yes | No | - | Standing - 360째 |
Yes | Yes | Yes | Yes | No | Room |
Yes | Yes | Yes | Yes | Yes | World |
需要注意,hololens目前还不支持场地参照系。一个房间级别的hololens应用目前需要使用空间映射来确认用户的地板和墙壁位置。
3、(spatial coordinate systems)空间坐标系统
所有的3D图形应用都使用“笛卡尔坐标系”来确定它们渲染在虚拟世界中物体的位置和朝向。这样的坐标系统建立3个相互垂直的坐标轴X,Y和Z来确定物体位置。
在混合现实中,你的应用将同时确定虚拟和物理坐标系统。Windows将在物理世界有实际意义的坐标系统,称为空间坐标系统。
空间坐标系统的单位是米。这意味着,在X,Y或Z轴上相距2单位的物体,在混合现实中是相距2米。这让你可以轻易地根据真实世界尺寸渲染物体和环境。
通常来说,笛卡尔坐标系有左手与右手两种。Windows的空间坐标系总是右手坐标系,也就是说X轴正方向向右,Y轴正方向向上(根据重力确定)而Z轴正方向指向你自己。
在这两种坐标系中,X,Y的方向是相同的。不同的是Z轴正方向是指向你还是远离你。请记住,摊开你的左手或右手,手指指向X轴正方向,再向Y轴的正方向弯曲,作竖大拇指状,大拇指的朝向就是对应坐标系下Z轴的正方向。
4、创建一个orientation-only或seated-scale的体验
全息影像渲染的关键是,当用户四处移动时,根据预测的头部运动,改变应用对全息影像的视角。使用固定参照系,你可以创建一个识别用户头部位置和朝向的seated-scale体验。
有些内容必须忽略头部位置变化,并时刻保持固定在一个选择的朝向和距离。最主要的例子就是360度视频:因为视频是在一个单独的固定视角拍摄的,视窗的位置根据内容移动会破坏观影,而视窗的朝向要跟着用户四处观看而转动。使用动态参照系,你可以创建一个orientation-only体验。
4.1、固定参照系
固定参照系提供的坐标系统,会保持用户附近物体根据世界得到的位置,反映出用户头部位置的变化。
对于seated-scale体验,在如UNITY的游戏引擎中,固定参照系定义了引擎的“世界原点”。
位于特定世界坐标的物体,使用固定参照系来定义它们在真实世界中相同坐标。即使用户四处走动,这些内容也固定在世界中,称之为world-locked内容
应用会启动时创建一个固定参照系,并在整个生命周期中使用它的坐标系。作为UNITY的应用开发者,你可以根据用户的起始位置和朝向确定原点,来放置你的内容。如果用户移动到新的位置并想继续他们的seated-scale体验,你能够根据新的位置重新定位世界原点。
应用运行一段时间后,系统会识别到更多用户周围环境的信息,会修正真实世界中的两个点的距离为更长或更短。如果hololens中的应用使用固定参照系来渲染全息影像,而用户在5米的范围内移动,你可能会观察到全息影像观察位置的漂移。所以如果你的应用需要用户在超过5米范围移动,你可以创建一个world-scale体验,这会要求额外的技术来保持全息影像稳定,详见下文。
4.2、动态参照系
动态参照系会跟着用户移动,它会在参照系刚创建时确定一个固定的朝向。这使得用户在观看参照第下确定位置的内容时很舒服。根据用户确定渲染的内容我们称为body-locked内容。
当头显无法确定它在世界中的位置时,动态参照系提供了唯一的坐标系统来渲染全息影像。当设备无法找到它在世界中位置时,我们推荐显示相关的UI来提示用户。Seated-scale或更高级别的应用,必须有orientation-only的备案来帮助用户在应用中进行下去,可以使用类似于Mixed Readity home中UI。
5、创建一个standing-scale或room-scale体验
在Immersive headset上提供比seated-scale更高的体验时,你可以使用场地参照系。
为了提供room-scale体验,让用户能够在他们预先设定的5米范围边界内移动,你也可以通过确认场地边界
5.1、场地参照系
用户在第一次设置immersive headset时,会设置一片场地,它代表了他们体验混合现实的房间。场地最小限度地定义了场地原点,用户选择地板的某个位置和他们使用设备时的朝向。在这个场地坐标系下,将内容放置在Y=0的地板平面上,你可以确保你的全息影像在用户站立时显示得很自然,这就是standing-scale体验。
5.2、场地边界
用户也可以选择定义场地边界,这指的是房间中的一块移除掉家具,用来在混合现实中移动的区域。这样的话,我们可以创建一个room-scale体验,使用边界来确保全息影像在用户可及的范围内。
因为场地参照系使用单一固定坐标系来显示依赖于地板的内容,它很容易用来移植VR头显上的standing-scale和room-scale体验。但是,在这些VR平台上,单一坐标系只能在5米直径内显示稳定内容,超出则容易因为放大效应在系统调整看到可见的漂移。为了移动超过5米,我们需要空间锚点。
6、创建一个world-scale体验
Hololens允许用户移动超过5米,这是真正的world-scale体验。创建一个world-scale的应用,要使用比room-scale体验更多的技术。
6.1为什么一个单一精确坐标系在超过5米时使用
现今在游戏、数据可视化或VR应用中,传统的做法是建立一个固定的绝对世界坐标系,所有的坐标都准确地映射到。在这种环境下,世界中的两个物体总是能找到一个稳定的变换关系。如果你不移动物体,它们之间的变换关系会保持不变。这种全局坐标系统在提前知道所有几何信息的纯虚拟世界中可以很好地动作。Room-scale VR应用就是采用这种经典做法。
相对的,像hololens的无约束混合现实设备,使用动态的传感驱动来感知世界,用户在大楼的楼层漫游时,它会持续地修正它的数据。在world-scale体验里,如果你根据单一精确坐标系来显示全息影像,这些内容会总是漂移,无论是他们与世界之间还是彼此之间。
例如,头显一开始认为两个点之间距离4米,一段时间后修正为3.9米。如果全息影像初始将两点根据单一精确坐标系设定为4米远,这时其中一个会在真实世界中移动0.1米。
6.2 空间锚点
Windows混合现实允许你创建空间锚点来解决问题,也就是世界中有有全息影像的重要点。一个空间锚点代表了世界中一个必须时间追踪的重要点。当设备获得更多空间数据时,空间锚点在需要时会根据另一个锚点来调整位置,以保证每一个锚点保持在真实世界中精确的位置。通过在用户显示全息影像的位置设置空间锚点,并根据锚点确定影像位置,你可以保证全息影像有最佳的稳定性,即使用户漫游了几十米。
空间锚点会持续地根据其他的锚点调整,这是它与固定参照系的关键不同:
根据固定参照系显示的全息影像,会跟其他的保持严格的位置关系。但是当用户移动长距离后,该参照系的坐标系统可能会漂移来保证用户附近的全息影像显示稳定。
根据场地参照系显示的全息影像,也会跟其他的保持严格的位置关系。相比于固定参照系,场地参照系总是保持与设定的物理原点固定。但是,场地坐标系下渲染的内容,在用户在边界内时,只会渲染5米范围内的。
根据空间锚点显示的全息影像,可能会根据另一个空间锚点产生漂移。这使得Windows能提升它对各个锚点位置的认识,即使是在一个锚点需要向左移动,另一个需要向右移动的情况。
相比于固定参照系总是优化用户附近的稳定性,场地参照系和空间锚点保证它们原点附近的稳定性。这有利于全息影像在运行过程中保持在准确的位置,但也意味着越远离原点的影像会受到越大的放大效应影响。这是因为场地或锚点上微小的调整会依据与原点的距离等比例放大。一个好的准则是,保证你根据空间锚点渲染的所有物体在原点的3米内。对于附近的场地原点,渲染远处的内容是没问题的,因为在用户的视角里,任何位置错误只会在很小局部里漂移很小的位置。
6.3 空间锚点的持续化
空间锚点也可以让你的应用记住一个重要的点,即使是你的应用挂起或设备关闭。
你可以把你的应用创建的空间锚点保存在硬盘中,并在下一次中加载进来,它们保存在你应用的“spatial anchor store”。保存和加载锚点时,你需要提供一个对你应用有意义的关键词,用于唯一标识锚点。可以把这些关键词理解为锚点的文件名。如果你想把其他的数据和锚点联系起来,例如用户放置在该位置的3D模型,把这些数据保存在你应用的本地存储并把它和你的关键词关联起来。
通过将锚点保存起来持续化,你的用户可以放置单独的全息影像或在周围设置工作空间,将全息影像放置在各处,并在后续的使用中找到它们。
6.4 空间锚点的分享
你的应用可以和其他的设备分享你的锚点。通过从一个hololens到另一个传输一个空间锚点以及与它相关的环境识别和传感数据,两个设备能识别到同一个位置。使用分享的空间锚点渲染的同一全息影像,两边的用户会看到全息影像在真实世界的同一位置。
7、避免head-locked内容
我们强烈建议避免渲染head-locked这种固定在视野某个位置的内容(像一个显示器那样),通常来说head-locked内容对用户很不舒服,而且不像是他们世界里的一部分。
Head-locked内容通常应该和与用户相关或世界相关的全息影像一起显示。例如,指针通常应该放置到世界中,=自然地缩放来反应用户目光注射物体的位置和距离。
8、处理位置追踪的错误
在一些如走廊的昏暗环境中,头显可能不能正确地利用inside-out追踪定位它在世界中的位置。在遇到错误时,可能会导致全息影像无法显示或显示在错误位置。现在我们来讨论问题发生的条件,对用户体验的影响和处理问题的建议。
8.1 头显因为传感数据不足而无法追踪
有时头显的传感器会无法确认头显的位置。房间昏暗时,或者传感器被头发或手遮盖时,或者环境纹理的表面不足以感知时,会发生这种问题。
问题发生时,头显无法得到足够精确的位置来渲染world-locked全息影像。你会无法确认空间锚点、依赖于设备的固定参照系,但你仍旧可以用动态参照系来渲染body-locked内容。你的应用应该告诉用户怎么重新获得位置追踪,通过显示一些预备的body-locked内容来提示用户,例如不要遮盖传感器或打开更多的灯。
8.2 因为环境的变化,头显追踪错误
有时,当你在一个经过大量变化(例如家具移动,分隔的帘子)的环境中使用头显时,有些全息影像可以会漂移。早先渲染的影像可能会在用户在新的空间中移动时大幅跳动。这是因为系统对你环境的认识不适用,同时它试图重新调整房间的特征来重新识别环境。在这种情况下,我们建议让用户遇到显示不符合预期时,重新放置他们固定在世界中的全息影像。
8.3 因为环境中相同的空间,头显追踪错误
有时,一间房子或其他地方可能会有两片相同的区域。例如两个相同的会议室,两个相同的角落,两张相同而占据整个设备视野的海报。在这种情况下,设备有时可能会混淆相同的两部分,把他们认为是相同的东西。这可能会导致某个地方的全息影像显示在另一个位置。如果环境的内部特征被破坏了,设备可能会经常性地丢失追踪。这种情况下,我们建议重置系统对环境的识别。请注意,重置会导致全部空间锚点位置的丢失。重置后设备在新的环境中会追踪得很好,但是,如果设备再次遇到相同的区域时,问题可能会再次发生。
9、相关
· GDC 2017 presentation on spatial coordinate systems and holographic rendering
· Coordinate systems in DirectX
· Shared experiences in mixed reality
· Case study - Looking through holes in your reality