C# 确认ARHit已准备就绪
我正在使用Unity和Apple的ARKitHitTest脚本。我在UI上创建了一个提示,要求用户指向地面并进行扫描C# 确认ARHit已准备就绪,c#,unity3d,augmented-reality,arkit,C#,Unity3d,Augmented Reality,Arkit,我正在使用Unity和Apple的ARKitHitTest脚本。我在UI上创建了一个提示,要求用户指向地面并进行扫描 我想做的是确定ARKit何时有足够的扫描点来放置目标。一旦我弄明白了这是怎么做的,我就可以更新用户提示,说准备好放置了。有人能告诉我如何确定何时可以放置ARKit吗?谢谢 ARKit有许多方法,您可以使用这些方法来确定跟踪是否可用,例如,条件是否不适合跟踪 通过注册以下回调,可以在Unity中获得这些信息: UnityARSessionNativeInterface.ARFram
我想做的是确定ARKit何时有足够的扫描点来放置目标。一旦我弄明白了这是怎么做的,我就可以更新用户提示,说准备好放置了。有人能告诉我如何确定何时可以放置ARKit吗?谢谢 ARKit有许多方法,您可以使用这些方法来确定跟踪是否可用,例如,条件是否不适合跟踪 通过注册以下回调,可以在Unity中获得这些信息:
UnityARSessionNativeInterface.ARFrameUpdatedEvent += ARFrameUpdated;
UnityARSessionNativeInterface.ARSessionFailedEvent += ARSessionFailedEvent;
例如,这些可以帮助您确定跟踪是可用的还是有限的
基本上,当一次会议条件良好时,例如代表通知我们:
ARTrackingStateReason.ARTrackingStateReasonNone
我们知道,条件适合放置对象,因为有足够的特征点等
处理此问题的类可能如下所示:
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";
}
}
公共类ARTrackingStatusController:MonoBehavior{
//1.获取会话的引用
私人单位会话国家界面增强真实会话;
私有字符串arTrackingStatus=“准备设备…”;
//------------------
//马克:生命周期
//------------------
无效开始(){
//1.注册ARFrame更新事件,该事件在IOS=(func呈现程序(u呈现程序:SCNSceneRenderer,updateAtTime时间:时间间隔))
UnityARSessionNativeInterface.ARFrameUpdatedEvent+=ARFrameUpdated;
UnityARSessionNativeInterface.ARSessionFailedEvent+=ARSessionFailedEvent;
}
无效更新(){
//1.更新会话的状态
印刷品(arTrackingStatus);
}
//-------------------------
//MARK:-ARSCNViewDelegate
//-------------------------
///
///每次更新ARCamera时调用
///
///照相机。
已更新公共无效ARFrameUpdated(UnityARCamera)
{
//1.追踪纵火事件
if(camera.trackingState==ARTrackingState.ARTrackingStateLimited){
logTrackingStateReason(摄像头、trackingReason);
}否则{
日志跟踪状态(camera.trackingState);
}
日志照明(摄像头、lightData、arLightEstimate、环境强度);
}
///
///记录ARSession失败事件
///
///错误。
公共无效ARSessionFailedEvent(字符串错误)
{
打印(错误);
}
//----------------------
//标记:-状态更新
//----------------------
///
///通知用户当前跟踪状态
///
///跟踪状态。
公共无效日志跟踪状态(ARTrackingState trackingState)
{
开关(跟踪状态){
案例ARTrackingState.ARTrackingStateNormal:
arTrackingStatus=“跟踪就绪”;
打破
案例ARTrackingState.ARTrackingState不可用:
arTrackingStatus=“跟踪不可用”;
打破
}
}
///
///通知用户当前跟踪状态
///
///原因。
公共无效日志跟踪StateReason(ArtTrackingStateReason)
{
切换(原因){
案例ARTrackingStateReason.ARTrackingStateReason过度运动:
arTrackingStatus=“请放慢移动速度”;
打破
案例ARTrackingStateReason.ArtrackingStateReasonUnficiencies功能:
arTrackingStatus=“尝试指向平面”;
打破
案例ARTrackingStateReason.ARTrackingStateReason初始化:
arTrackingStatus=“初始化”;
打破
案例ARTrackingStateReason.ARTrackingStateReason重新定位:
arTrackingStatus=“重新定位”;
打破
案例ARTrackingStateReason.ARTrackingStateReason无:
arTrackingStatus=“”;
打破
}
}
///
///确定当前照明条件是否适合该区域
///
///光估计。
公共照明(浮光灯)
{
如果(估计值小于100){
arTrackingStatus=“照明变暗”;
}
}
希望能有所帮助……你说得再清楚不过了!完美的解决方案。非常感谢(很抱歉延迟回复)