4

对于演示应用程序,我需要一个可靠的 AR SDK,它允许在运行时创建图像目标。

SDK 必须在移动设备上运行,并且目标不应由某些云服务器或在开发过程中创建。在这种情况下,用户将拍摄他们自己的标记(例如杂志封面),然后将它们裁剪和变形以用作标记(必须将 3D 对象随机分配给这些标记)。vuforia 和 ARToolkit 都不允许这种情况。其他一些可能的 SDK

支持它:KudanEasyARMAXST

如果这根本不可能,是否有一个 AR SDK 允许多次使用完全相同的图像目标(或任何类型的标记)来渲染相同的 3D 对象?同样 vuforia 和 ARToolkit 不支持这一点。

4

4 回答 4

4

Kudan 接缝不统一支持此功能,我认为本机 SDK 支持此功能。

与原生 SDK 不同,Unity 插件不能只从资产中获取原始图像文件并将其加载到跟踪器中。这是我们将来会添加到插件中的一项功能。

来源:- https://kudan.readme.io/docs/markers-1

另一方面,EasyAR 支持从 .png 或 .jpg 一次创建一个图像或通过 .json 创建一个 imageTarget 以批量添加多个图像,它在EasyAR_SDK_2.2.0_Basic_Samples_Unity 的示例项目中提供

注意:- 要运行您需要的示例项目

1 - 在他们的网站上注册https://www.easyar.com/

2-从这里创建 SDK 许可证密钥。

3 - 按照本指南放置密钥并统一运行。

4 - 您的目标在“HelloARTarget”项目中实现

这是从 .pjg 图像加载 AR 体验的示例项目脚本

using UnityEngine;
using System.Linq;
using EasyAR;

namespace Sample
{
    public class HelloARTarget : MonoBehaviour
    {
        private const string title = "Please enter KEY first!";
        private const string boxtitle = "===PLEASE ENTER YOUR KEY HERE===";
        private const string keyMessage = ""
              + "Steps to create the key for this sample:\n"
              + "  1. login www.easyar.com\n"
              + "  2. create app with\n"
              + "      Name: HelloARTarget (Unity)\n"
              + "      Bundle ID: cn.easyar.samples.unity.helloartarget\n"
              + "  3. find the created item in the list and show key\n"
              + "  4. replace all text in TextArea with your key";

        private void Awake()
        {
            if (FindObjectOfType<EasyARBehaviour>().Key.Contains(boxtitle))
            {
        #if UNITY_EDITOR
                 UnityEditor.EditorUtility.DisplayDialog(title, keyMessage, "OK");
        #endif
                 Debug.LogError(title + " " + keyMessage);
            }
        }

    void CreateTarget(string targetName, out SampleImageTargetBehaviour targetBehaviour)
    {
        GameObject Target = new GameObject(targetName);
        Target.transform.localPosition = Vector3.zero;
        targetBehaviour = Target.AddComponent<SampleImageTargetBehaviour>();
    }
        void Start()
    {
        SampleImageTargetBehaviour targetBehaviour;
        ImageTrackerBehaviour tracker = FindObjectOfType<ImageTrackerBehaviour>();

        // dynamically load from image (*.jpg, *.png)
        CreateTarget("argame01", out targetBehaviour);
        targetBehaviour.Bind(tracker);
        targetBehaviour.SetupWithImage("sightplus/argame01.jpg", StorageType.Assets, "argame01", new Vector2());
        GameObject duck02_1 = Instantiate(Resources.Load("duck02")) as GameObject;
        duck02_1.transform.parent = targetBehaviour.gameObject.transform;

        // dynamically load from json file
        CreateTarget("argame00", out targetBehaviour);
        targetBehaviour.Bind(tracker);
        targetBehaviour.SetupWithJsonFile("targets.json", StorageType.Assets, "argame");
        GameObject duck02_2 = Instantiate(Resources.Load("duck02")) as GameObject;
        duck02_2.transform.parent = targetBehaviour.gameObject.transform;

        // dynamically load from json string
        string jsonString = @"
            {
            ""images"" :
            [
                {
                ""image"" : ""sightplus/argame02.jpg"",
                ""name"" : ""argame02""
                }
            ]
            }
            ";
        CreateTarget("argame02", out targetBehaviour);
        targetBehaviour.Bind(tracker);
        targetBehaviour.SetupWithJsonString(jsonString, StorageType.Assets, "argame02");
        GameObject duck02_3 = Instantiate(Resources.Load("duck02")) as GameObject;
        duck02_3.transform.parent = targetBehaviour.gameObject.transform;

        // dynamically load all targets from json file
        var targetList = ImageTargetBaseBehaviour.LoadListFromJsonFile("targets2.json", StorageType.Assets);
        foreach (var target in targetList.Where(t => t.IsValid).OfType<ImageTarget>())
        {
            CreateTarget("argame03", out targetBehaviour);
            targetBehaviour.Bind(tracker);
            targetBehaviour.SetupWithTarget(target);
            GameObject duck03 = Instantiate(Resources.Load("duck03")) as GameObject;
            duck03.transform.parent = targetBehaviour.gameObject.transform;
        }

        targetBehaviour = null;
    }




    }
}

编辑

虽然从 .png 制作 ImageTarget 很容易,但我想知道如何检查图像是否包含在 EasyAR 中检测到的足够特征?

Google AR Core 支持此功能,但支持的设备数量有限

https://developers.google.com/ar/develop/java/augmented-images/guide

编辑 2

看起来Vuforia支持在运行时创建图像目标。还可以将图像作为纹理拖放到编辑器中,而无需从门户生成数据集。尽管您仍然需要门户中的 api 密钥。

于 2018-06-22T06:11:11.657 回答
1

您绝对可以使用 Vuforia 和 UserDefinedTargetBuildingBehaviour 做到这一点

https://library.vuforia.com/articles/Training/User-Defined-Targets-Guide

于 2017-03-03T20:43:48.790 回答
0

我看过一个 OpenSpace3D 视频这样做。我相信他们将 ARToolKit5 集成到 OpenSpace3D 中并使其以某种方式工作。OpenSpace3D 似乎是开源的,所以你可以看看他们的解决方案。

这是视频的链接: https ://www.youtube.com/watch?v=vSF1ZH1CwQI

查看大约 8:50 到 9:50 分钟。

于 2017-03-03T19:45:36.067 回答
0

Kudan 和 EasyAR 似乎提供了这个选项。我将尝试将它们与 Google Cardboard 集成。

于 2017-03-03T17:16:30.237 回答