确认 ARHit 就绪
Confirm ARHit Ready
我正在使用 Unity 和 Apples 的 ARKitHitTest 脚本。我在 UI 上创建了一个提示,要求用户指向地面并扫描。
我想做的是确定 ARKit 何时扫描到足够的点来放置目标。一旦我弄清楚这是如何完成的,我就可以更新用户提示说准备好放置。谁能告诉我如何确定 ARKit 何时准备好放置?谢谢!
ARKit 有许多方法可用于确定跟踪是否可用,以及例如条件是否不适合跟踪。
这些可以通过注册以下回调在 Unity
中获得:
UnityARSessionNativeInterface.ARFrameUpdatedEvent += ARFrameUpdated;
UnityARSessionNativeInterface.ARSessionFailedEvent += ARSessionFailedEvent;
例如,这些可以帮助您确定跟踪是否可用或受限。
基本上当一个会话有良好的条件时,例如代表通知我们:
ARTrackingStateReason.ARTrackingStateReasonNone
我们知道条件适合放置对象,因为有足够的特征点可用等
因此 Class 处理这个问题可能看起来像这样:
public class ARTrackingStatusController : MonoBehaviour {
//1. Get Reference To The Session
private UnityARSessionNativeInterface augmentedRealitySession;
private string arTrackingStatus = "Preparing Device...";
//------------------
//MARK: - LifeCycle
//------------------
void Start () {
//1. Register For The ARFrame Updated Event Which In IOS = (func renderer(_ renderer: SCNSceneRenderer, updateAtTime time: TimeInterval))
UnityARSessionNativeInterface.ARFrameUpdatedEvent += ARFrameUpdated;
UnityARSessionNativeInterface.ARSessionFailedEvent += ARSessionFailedEvent;
}
void Update () {
//1. Update The Status Of The Session
print(arTrackingStatus);
}
//-------------------------
//MARK: - ARSCNViewDelegate
//-------------------------
/// <summary>
/// Called Each Time The ARCamera Is Updated
/// </summary>
/// <param name="camera">Camera.</param>
public void ARFrameUpdated (UnityARCamera camera)
{
//1. Track The ARSession
if (camera.trackingState == ARTrackingState.ARTrackingStateLimited) {
logTrackingStateReason (camera.trackingReason);
} else {
logTrackingState (camera.trackingState);
}
logLighting (camera.lightData.arLightEstimate.ambientIntensity);
}
/// <summary>
/// Logs The ARSession Failed Event
/// </summary>
/// <param name="error">Error.</param>
public void ARSessionFailedEvent (string error)
{
print (error);
}
//----------------------
//MARK: - Status Updates
//----------------------
/// <summary>
/// Informs The User About The Current Tracking State
/// </summary>
/// <param name="trackingState">Tracking state.</param>
public void logTrackingState (ARTrackingState trackingState)
{
switch (trackingState) {
case ARTrackingState.ARTrackingStateNormal:
arTrackingStatus = "Tracking Ready";
break;
case ARTrackingState.ARTrackingStateNotAvailable:
arTrackingStatus = "Tracking Unavailable";
break;
}
}
/// <summary>
/// Informs The User About The Current Tracking Status
/// </summary>
/// <param name="reason">Reason.</param>
public void logTrackingStateReason (ARTrackingStateReason reason)
{
switch (reason) {
case ARTrackingStateReason.ARTrackingStateReasonExcessiveMotion:
arTrackingStatus = "Please Slow Your Movement";
break;
case ARTrackingStateReason.ARTrackingStateReasonInsufficientFeatures:
arTrackingStatus = "Try To Point At A Flat Surface";
break;
case ARTrackingStateReason.ARTrackingStateReasonInitializing:
arTrackingStatus = "Initializing";
break;
case ARTrackingStateReason.ARTrackingStateReasonRelocalizing:
arTrackingStatus = "Relocalizing";
break;
case ARTrackingStateReason.ARTrackingStateReasonNone:
arTrackingStatus = "";
break;
}
}
/// <summary>
/// Determines If The Current Lighting Conditions Are Appropriate For The ARSession
/// </summary>
/// <param name="lightEstimate">Light estimate.</param>
public void logLighting (float lightEstimate)
{
if (lightEstimate < 100) {
arTrackingStatus = "Lighting Is To Dark";
}
}
希望对您有所帮助...
我正在使用 Unity 和 Apples 的 ARKitHitTest 脚本。我在 UI 上创建了一个提示,要求用户指向地面并扫描。
我想做的是确定 ARKit 何时扫描到足够的点来放置目标。一旦我弄清楚这是如何完成的,我就可以更新用户提示说准备好放置。谁能告诉我如何确定 ARKit 何时准备好放置?谢谢!
ARKit 有许多方法可用于确定跟踪是否可用,以及例如条件是否不适合跟踪。
这些可以通过注册以下回调在 Unity
中获得:
UnityARSessionNativeInterface.ARFrameUpdatedEvent += ARFrameUpdated;
UnityARSessionNativeInterface.ARSessionFailedEvent += ARSessionFailedEvent;
例如,这些可以帮助您确定跟踪是否可用或受限。
基本上当一个会话有良好的条件时,例如代表通知我们:
ARTrackingStateReason.ARTrackingStateReasonNone
我们知道条件适合放置对象,因为有足够的特征点可用等
因此 Class 处理这个问题可能看起来像这样:
public class ARTrackingStatusController : MonoBehaviour {
//1. Get Reference To The Session
private UnityARSessionNativeInterface augmentedRealitySession;
private string arTrackingStatus = "Preparing Device...";
//------------------
//MARK: - LifeCycle
//------------------
void Start () {
//1. Register For The ARFrame Updated Event Which In IOS = (func renderer(_ renderer: SCNSceneRenderer, updateAtTime time: TimeInterval))
UnityARSessionNativeInterface.ARFrameUpdatedEvent += ARFrameUpdated;
UnityARSessionNativeInterface.ARSessionFailedEvent += ARSessionFailedEvent;
}
void Update () {
//1. Update The Status Of The Session
print(arTrackingStatus);
}
//-------------------------
//MARK: - ARSCNViewDelegate
//-------------------------
/// <summary>
/// Called Each Time The ARCamera Is Updated
/// </summary>
/// <param name="camera">Camera.</param>
public void ARFrameUpdated (UnityARCamera camera)
{
//1. Track The ARSession
if (camera.trackingState == ARTrackingState.ARTrackingStateLimited) {
logTrackingStateReason (camera.trackingReason);
} else {
logTrackingState (camera.trackingState);
}
logLighting (camera.lightData.arLightEstimate.ambientIntensity);
}
/// <summary>
/// Logs The ARSession Failed Event
/// </summary>
/// <param name="error">Error.</param>
public void ARSessionFailedEvent (string error)
{
print (error);
}
//----------------------
//MARK: - Status Updates
//----------------------
/// <summary>
/// Informs The User About The Current Tracking State
/// </summary>
/// <param name="trackingState">Tracking state.</param>
public void logTrackingState (ARTrackingState trackingState)
{
switch (trackingState) {
case ARTrackingState.ARTrackingStateNormal:
arTrackingStatus = "Tracking Ready";
break;
case ARTrackingState.ARTrackingStateNotAvailable:
arTrackingStatus = "Tracking Unavailable";
break;
}
}
/// <summary>
/// Informs The User About The Current Tracking Status
/// </summary>
/// <param name="reason">Reason.</param>
public void logTrackingStateReason (ARTrackingStateReason reason)
{
switch (reason) {
case ARTrackingStateReason.ARTrackingStateReasonExcessiveMotion:
arTrackingStatus = "Please Slow Your Movement";
break;
case ARTrackingStateReason.ARTrackingStateReasonInsufficientFeatures:
arTrackingStatus = "Try To Point At A Flat Surface";
break;
case ARTrackingStateReason.ARTrackingStateReasonInitializing:
arTrackingStatus = "Initializing";
break;
case ARTrackingStateReason.ARTrackingStateReasonRelocalizing:
arTrackingStatus = "Relocalizing";
break;
case ARTrackingStateReason.ARTrackingStateReasonNone:
arTrackingStatus = "";
break;
}
}
/// <summary>
/// Determines If The Current Lighting Conditions Are Appropriate For The ARSession
/// </summary>
/// <param name="lightEstimate">Light estimate.</param>
public void logLighting (float lightEstimate)
{
if (lightEstimate < 100) {
arTrackingStatus = "Lighting Is To Dark";
}
}
希望对您有所帮助...