Table of Contents

Migration von version 4.6 auf version 4000 beispiel: Migration des SpatialMap_Sparse_Localizing-beispiels

Dieser artikel beschreibt, wie das SpatialMap_Sparse_Localizing-beispiel von der EasyAR Sense Unity Plugin version 4.6 auf version 4000 migriert wird.

Plugin-paket ersetzen

Ersetzen sie das plugin-paket gemäß dem allgemeinen migrationsleitfaden.

Szene neu aufbauen (erforderlich)

Löschen sie die AR-Sitzung in der szene:

Erstellen sie die AR-Sitzung neu:

Löschen sie die Sparse SpatialMap in der szene:

Erstellen sie die Sparse SpatialMap neu:

Füllen sie im inspector-fenster der Sparse SpatialMap Controller-komponente die ID und den namen der spärlichen raumkarte aus und geben sie den tracker an:

Weisen sie im beispielskript ARSession erneut der neu erstellten AR-Sitzung (EasyAR) zu:

Weisen sie im beispielskript MapController erneut dem neu erstellten Sparse SpatialMap Controller zu:

Inkompatiblen code ändern

Entfernen Sie in Start den Code, der den Status ausgibt, und aktualisieren Sie den Lokalisierungscallback für die räumliche Karte mit geringer Dichte auf MapController.TargetFound und MapController.TargetLost gemäß der neuen API-Version:

Ursprünglicher Code:

sparse = Session.GetComponentInChildren<SparseSpatialMapWorkerFrameFilter>();

if (string.IsNullOrEmpty(MapController.MapManagerSource.ID) || string.IsNullOrEmpty(MapController.MapManagerSource.Name))
{
    throw new UIPopupException("Map ID or Name NOT set, please set MapManagerSource on: " + MapController + Environment.NewLine +
        "To create SpatialMap, use <SpatialMap_SparseSpatialMap> sample." + Environment.NewLine +
        "To get Map ID and Name, use EasyAR Develop Center (www.easyar.com) -> SpatialMap -> Database Details." + Environment.NewLine +
        "Map ID is used when loading, it can be used to share maps among devices.", 100);
}

MapController.MapLoad += (map, status, error) =>
{
    GUIPopup.EnqueueMessage("Load map {name = " + map.Name + ", id = " + map.ID + "} into " + sparse.name + Environment.NewLine +
        " => " + status + (string.IsNullOrEmpty(error) ? "" : " <" + error + ">"), status ? 3 : 5);

    if (!status)
    {
        return;
    }

    GUIPopup.EnqueueMessage("Notice: load map (only the first time each map) will trigger a download in this sample." + Environment.NewLine +
        "Statistical request count will be increased (more details on EasyAR website)." + Environment.NewLine +
        "Map cache is used after a successful download." + Environment.NewLine +
        "Map cache will be cleared if SparseSpatialMapManager.clear is called or app uninstalled.", 5);
};

MapController.MapLocalized += () =>
{
    GUIPopup.EnqueueMessage("Localized map {name = " + MapController.MapInfo.Name + "}", 3);
};

MapController.MapStopLocalize += () =>
{
    GUIPopup.EnqueueMessage("Stopped localize map {name = " + MapController.MapInfo.Name + "}", 3);
};

sparse.Localizer.startLocalization();

Geändert zu:

sparse = Session.GetComponentInChildren<SparseSpatialMapWorkerFrameFilter>();

MapController.TargetFound += () =>
{
    Debug.Log($"Found target {{name = {MapController.Info.Name}}}");
};

MapController.TargetLost += () =>
{
    if (!MapController) { return; }
    Debug.Log($"Lost target {{name = {MapController.Info.Name}}}");
};

Verwenden Sie die neue API in Update, um zu prüfen, ob eine Sparse Spatial Map existiert und direkt verfolgt wird:

Ursprünglicher Code:

private void Update()
{
    Status.text = $"Device Model: {SystemInfo.deviceModel} {deviceModel}" + Environment.NewLine +
        "VIO Device" + Environment.NewLine +
        "\tType: " + ((Session.Assembly != null && Session.Assembly.FrameSource) ? Session.Assembly.FrameSource.GetType().ToString().Replace("easyar.", "").Replace("FrameSource", "") : "-") + Environment.NewLine +
        "\tTracking Status: " + Session.TrackingStatus + Environment.NewLine +
        "Sparse Spatial Map" + Environment.NewLine +
        "\tWorking Mode: " + sparse.WorkingMode + Environment.NewLine +
        "\tLocalization Mode: " + sparse.LocalizerConfig.LocalizationMode + Environment.NewLine +
        "Localized Map" + Environment.NewLine +
        "\tName: " + (sparse.LocalizedMap == null ? "-" : (sparse.LocalizedMap.MapInfo == null ? "-" : sparse.LocalizedMap.MapInfo.Name)) + Environment.NewLine +
        "\tID: " + (sparse.LocalizedMap == null ? "-" : (sparse.LocalizedMap.MapInfo == null ? "-" : sparse.LocalizedMap.MapInfo.ID)) + Environment.NewLine +
        "\tPoint Cloud Count: " + (sparse.LocalizedMap == null ? "-" : sparse.LocalizedMap.PointCloud.Count.ToString()) + Environment.NewLine +
        "Cube Location: " + (onSparse ? "On Sparse Spatial Map" : (Session.TrackingStatus.OnSome && Session.TrackingStatus != MotionTrackingStatus.NotTracking ? "Air" : "-")) + Environment.NewLine +
        Environment.NewLine +
        "Gesture Instruction" + Environment.NewLine +
        "\tMove to Sparse Spatial Map Point: One Finger Move" + Environment.NewLine +
        "\tScale: Two Finger Pinch";

    if (Input.touchCount == 1 && !EventSystem.current.IsPointerOverGameObject(Input.GetTouch(0).fingerId))
    {
        var touch = Input.touches[0];
        if (touch.phase == TouchPhase.Moved)
        {
            var viewPoint = new Vector2(touch.position.x / Screen.width, touch.position.y / Screen.height);
            if (sparse && sparse.LocalizedMap)
            {
                var points = sparse.LocalizedMap.HitTest(viewPoint);
                foreach (var point in points)
                {
                    onSparse = true;
                    TouchControl.transform.position = sparse.LocalizedMap.transform.TransformPoint(point);
                    break;
                }
            }
        }
    }
}

Geändert zu:

private void Update()
{
    if (Input.touchCount == 1 && !EventSystem.current.IsPointerOverGameObject(Input.GetTouch(0).fingerId))
    {
        var touch = Input.touches[0];
        if (touch.phase == TouchPhase.Moved)
        {
            var viewPoint = new Vector2(touch.position.x / Screen.width, touch.position.y / Screen.height);
            if (MapController && MapController.IsDirectlyTracked)
            {
                var points = MapController.HitTest(viewPoint);
                foreach (var point in points)
                {
                    onSparse = true;
                    TouchControl.transform.position = MapController.transform.TransformPoint(point);
                    break;
                }
            }
        }
    }
}

Nun sind die beispielszene und die skripte auf version 4000.0 aktualisiert und können ausgeführt werden.

Verwandte themen