是否有用于在运行时创建图像目标的AR SDK?

时间:2017-03-03 16:59:36

标签: unity3d augmented-reality vuforia kudan

对于Demo应用程序,我需要一个可靠的AR SDK,它允许在运行时创建Image Targets。

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

的SDK

支持它:KudanEasyARMAXST

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

4 个答案:

答案 0 :(得分:3)

Kudan接缝不统一支持此功能 我认为它在本机SDK中受支持。

  

与本机SDK不同,Unity插件不能仅从资产中获取原始图像文件并将其加载到跟踪器中。我们将来会将此功能添加到插件中。

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

另一方面,

EasyAR支持从.png或.jpg一次创建一个图像或通过.json创建imageTarget以在一批中添加多个图像 并且在 EasyAR_SDK_2.2.0_Basic_Samples_Unity here

的示例项目中提供

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

1-在其网站https://www.easyar.com/上注册

2-创建SDK许可证密钥from here

3-遵循此Guide来放置钥匙并统一运行。

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

答案 1 :(得分:1)

你绝对可以用Vuforia和UserDefinedTargetBuildingBehaviour

来做到这一点

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

答案 2 :(得分:0)

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

答案 3 :(得分:0)

我看过一个OpenSpace3D视频。我相信他们将ARToolKit5集成到了OpenSpace3D中并使其以某种方式工作。 OpenSpace3D似乎是OpenSource,因此您可以查看他们的解决方案。

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

请看8分50秒到9点50分左右。