Vuforia引擎在运行时为报告姿势信息的观测者提供激活的观测器上的姿势状态信息。此信息可以帮助您监视并适应观察员不断变化的跟踪状态。例如,当姿势状态更改时,您可以使用姿势状态和状态信息为用户提供方向和指导。
姿势状态值的可用性取决于“观察者”类型。此外,姿势和状态信息对于不报告姿势信息的观测者不可用,例如条形码行为
.
观察者的姿势信息通过观察报告:如果姿势信息可用,则有关姿势的可用性和可靠性的信息将报告为姿势状态和状态信息。姿势状态描述了观察者在其生命周期内的跟踪状态,报告为6自由度姿势。姿势状态具有关联的姿势状态信息,该信息提供了有关观察者姿势状态的更多信息。
姿势状态和状态信息可通过T获取目标状态()
在Unity C#API中。支持姿势状态信息依赖于当前活动的观测者,例如。,图像目标行为
.
通过选择观察者行为,您可以选择在统一编辑器中跟踪您的行为的姿势状态默认观察者事件处理程序
组件。请参见统一使用设备跟踪了解更多信息。
姿势状态将报告为NO_pose,直到首次检测到观察者。
VuMark、图像、多目标和圆柱体目标的姿势状态和状态信息
类型为“图像目标”、“圆柱体目标”、“多目标”和“VuMark”的观察者上提供的可用姿势状态和状态信息是相同的。下表列出了可用的姿势状态和关联的状态信息值:
|
状态信息
|
否_位置
|
|
没有可用的有效姿势。目标要么尚未被检测到,要么已经失去跟踪。
|
未送达
|
为用户提供视觉帮助,以识别可跟踪的对象。
|
已跟踪
|
|
正在跟踪目标-表示操作正常。
|
正常
|
跟踪工作正常,可以渲染增强。
|
扩展_跟踪
|
|
间接跟踪目标。可以直接跟踪它的外观、遮挡、too-far或too-close,但其姿势由设备姿势行为保持。请参阅设备跟踪了解更多详细信息。
|
正常
|
跟踪工作正常。
|
有限公司
|
|
正在跟踪目标,但精度很低。如果应用程序需要精确的目标对齐,建议放弃目标的有限姿势。如果精确对准不太重要,那么使用有限的姿势可以提供更连续的跟踪体验。
|
重新定位
|
如果需要,激励用户返回目标。
|
模型目标姿势状态和状态信息
A类模型目标行为
包括当检测到模型目标被错误缩放时报告的唯一状态信息:
|
状态信息
|
否_位置
|
|
Vuforia正在尝试检测目标,但姿势尚不可用。
|
未送达
|
报告此状态信息时无需执行任何操作。
|
初始化
|
目标是尚未识别的高级模型目标。如果您有多个目标,我们建议您显示Viewfinder UI,或者对于单个目标显示符号引导视图。
|
建议_指南
|
目标没有高级指南视图。我们建议显示指南视图覆盖,以帮助用户移动到可以开始跟踪的位置。
|
已跟踪
|
|
正在跟踪目标并指示正常操作。
|
正常
|
情况很好,可以进行扩充。
|
错误_刻度
|
Vuforia检测到目标和实物之间存在显著差异。
目标的大小要么太小,要么太大,与被跟踪对象的实际大小相比,最大可达50倍。
目标仍将跟踪,但报告的姿势将不在公制坐标中。目标将出现在HoloLens或Magic Leap上的错误深度。
建议纠正天平。
|
扩展_跟踪
|
|
间接跟踪目标。可以直接跟踪它的外观、遮挡、too-far或too-close,但其姿势由设备姿势行为保持。请参阅设备跟踪了解更多详细信息。
|
正常
|
如果需要,激励用户返回目标。
|
错误_刻度
|
请参阅TRACKED+WRONG_SCALE。建议纠正天平。
|
有限公司
|
|
正在跟踪目标,但精度很低。如果应用程序需要精确的目标对齐,建议放弃目标的有限姿势。如果精确对准不太重要,那么使用有限的姿势可以提供更连续的跟踪体验。
|
重新定位
|
如果需要,鼓励用户返回目标。
|
错误_刻度
|
Vuforia检测到目标和实物之间存在巨大差异。
与被跟踪对象的实际单词大小相比,目标的大小要么太小,要么太大,超过了50倍。
跟踪无法可靠工作。
确保审查并纠正模型目标的比例。
|
区域目标和锚点姿势状态和状态信息
区域目标和锚点不报告姿势状态TRACKED,而是在跟踪正常工作时报告EXTENDED_TRACKED。区域目标行为
和锚定行为
对于扩展的跟踪姿势,始终报告为NORMAL(正常);对于有限的姿势,总是报告为RELOCALIZING(重新定位)。
下表列出了区域目标和锚点的可用姿势状态值:
|
状态信息
|
否_位置
|
|
Vuforia正在尝试检测目标或锚点,但姿势尚不可用。
|
未送达
|
将用户引导到起始位置,以开始或重新启用对环境的跟踪。
|
已扩展跟踪
|
|
利用设备姿势行为间接跟踪目标或锚点,并将其设置为正常运行。
|
正常
|
正常的目标或锚点跟踪条件。可以通过精确对齐渲染增强效果。
|
有限公司
|
|
正在跟踪目标或锚点,但精度很低。如果应用程序需要精确的目标对齐,建议放弃目标的有限姿势。如果精确对准不太重要,那么使用有限姿势可以提供更连续的跟踪体验。
|
重新定位
|
已知目标或锚点的有限姿态比正常的扩展跟踪姿态具有更大的误差。一旦更准确地估计了目标或锚点的推断姿势,它将再次开始报告扩展的跟踪姿势。
|
设备跟踪姿势状态和状态信息
设备姿势行为表示设备相对于周围环境的姿势。
设备跟踪使用Vuforia融合利用每个平台可用的核心技术。Vuforia Engine从底层平台提取信息,并将其与姿势状态和状态信息合并。
该表总结了设备位置行为
.
状态
|
状态信息
|
否_位置
|
|
没有可用的设备姿势。
|
未送达
|
未知
|
Vuforia无法确定设备姿势或提供原因信息。
|
使用Reset()重置设备姿势行为,或指示用户在持续报告情况一定时间(例如10秒)后重新启动整个AR体验。
|
初始化
|
设备跟踪正在初始化。
|
指示用户等待并稍微移动设备。
Vuforia使用任何提供程序报告此状态,以允许一致的应用程序行为。在ARKit上,当没有提供姿势时会报告此情况启动ARSession后.
|
重新定位
|
该设备正在尝试重新连接到世界并恢复Anchor位置。
|
指示用户返回之前看到的区域。当情况持续报告一定时间(例如10秒)时,重置设备姿势或指示用户重新启动整个AR体验。
重新调整后,可能不会报告某些锚。我们建议在重新调整后的某个时间清理这些问题。 注意:时间长度取决于预期的用户行为和您的用例。
ARKit上未报告此状态信息。
在此状态信息中,当使用仅视觉并检测到之前未检测到的目标,设备姿态状态在短暂延迟后切换为LIMITED/INITIALIZING。这表明没有发生重新缩放,但在内部重新启动了设备姿势。以前的中层锚丢失了。可能会重新检测其他锚和目标。
|
有限公司
|
|
设备姿势质量降低。应用程序可能会建议用户帮助恢复更好的设备跟踪。
不建议创建锚点。无法保证新锚点的准确性或一致性,如果没有足够的场景几何体,创建可能会失败。
|
未知
|
Vuforia无法提供有关有限姿势原因的信息。
|
建议用户保持设备静止,并检查照明条件是否合适,以及跟踪区域是否具有足够的视觉特征。
降级的三自由度姿势可能是一种后备姿势。
|
初始化
|
正在初始化设备跟踪。
|
指导用户移动设备以实现更好的质量跟踪。
|
重新定位
仅在ARKit上报告
|
该设备正在尝试重新连接到世界并恢复Anchor位置。
|
指示用户返回之前看到的区域。如果在一定时间内(例如10秒)报告了这种情况,请重置设备姿势或指示用户重新启动整个AR体验。
重定标后可能不会报告某些锚/目标。我们建议在重新调整后的某个时间清理这些问题。
注意:时间长度取决于预期的用户行为和您的用例。
|
过度运动
仅在ARKit上报告
|
设备移动过快。
|
指示用户缓慢移动或保持设备静止。
|
功能不足
仅在ARKit上报告
|
该设备指向一个几乎没有视觉特征的区域。虽然传感器读数支持设备跟踪,但视觉里程计系统也依赖于环境中的视觉特征。
|
指导用户指向具有更多视觉特征的区域,或检查照明和对比度是否正确。
|
不足_亮度
仅在ARCore上报告
|
由于照明条件差,运动跟踪丢失。
|
指示用户移动到更明亮的区域。
|
已跟踪
|
|
提供了可靠的设备姿势,并根据环境确定了体验。
|
正常
|
正常设备跟踪条件。
|
是时候呈现您完整的增强体验了。
注:在某些情况下(例如,如果底层平台发现场景几何体不足,或者指向没有可击中表面的方向),命中测试仍可能失败。
|
统一处理状态和状态信息
大多数观察员行为
在Unity中,包括图像目标、模型目标、区域目标和锚默认观察者事件处理程序
它可以即时处理状态更新。
默认情况下,此事件处理程序将根据当前的状态
。通过检查器中的下拉菜单,可以配置显示增强时应考虑的状态值。
对于更复杂的用例,您可以直接订阅OnTargetStatus已更新
事件观察员行为
。此事件适用于所有观察者行为,包括设备位置行为
并将在OnStatusChanged(状态已更改)
已触发。
以下示例显示了订阅和处理此事件的设置:
使用UnityEngine;使用Vuforia;公共类StatusEventHandler:MonoBehaviour{private观察者行为mObserver行为;虚空觉醒(){观察者行为mObserverBehaviour=GetComponent<观察者行为>();if(mObserverBehaviour!=空)mObserver行为。OnTargetStatusChanged+=OnStatusChange;}void OnStatusChanged(ObserverBehaviour行为,TargetStatus状态){调试。日志格式(“TargetName:{0},状态为:{1},StatusInfo:{2}”,behaviour.TargetName,Status.Status,Status.StatusInfo);}销毁时无效(){if(mObserverBehaviour!=空)mObserver行为。OnTargetStatusChanged-=OnStatusChange;}}