ARCore 1.2 Unity 动态创建 AugmentedImageDatabase
ARCore 1.2 Unity Create AugmentedImageDatabase on the fly
我正在尝试使用 arcores 的新图像跟踪功能动态创建图像数据库。
目前我有一个服务器为我提供图像位置,我将其下载到我设备的持久数据路径。我使用这些图像创建新的数据库条目,如下所示:
Public 变量:
public AugmentedImageDatabase newBD;
public AugmentedImageDatabaseEntry newEntry;
这里我进行正则表达式匹配以从数据路径获取图像并将它们转换为 texture2D 以填充 AugmentedImageDatabaseEntry 值。
Regex r1 = new Regex(@"https?://s3-([^.]+).amazonaws.com/([^/]+)/([^/]+)/(.*)");
// Match the input for file name
Match match = r1.Match(input);
if (match.Success)
{
string v = match.Groups[4].Value;
RegexMatch = v;
Texture2D laodedTexture = LoadTextureToFile(v);
laodedTexture.EncodeToPNG();
AugmentedImageDatabaseEntry newEntry = new AugmentedImageDatabaseEntry(v, laodedTexture, Application.persistentDataPath + "/" + v);
newEntry.Name = v;
newEntry.Texture = laodedTexture;
newEntry.TextureGUID = Application.persistentDataPath + "/" + v;
Debug.Log(newEntry.Name);
Debug.Log(newEntry.Texture);
Debug.Log(newEntry.TextureGUID);
newBD.Add(newEntry);
}
为了让它在 android 上运行,我不得不稍微修改 ARCore 统一实现的源代码,以便 database.Add() 函数可以在编辑器之外运行。
所有这些似乎都可以无缝运行,因为我还没有收到任何错误。
一旦我将场景更改为 ARCore 场景,我就会实例化一个 ARCore Camera 并创建一个新的 sessionconfig,它包含对上面填充的数据库的引用。
代码如下:
public class 新配置设置:MonoBehaviour {
public GameObject downloadManager;
public GameObject arcoreDevice;
// Use this for initialization
void Start () {
downloadManager = GameObject.Find("DownlaodManager");
TestModelGenerator generator = downloadManager.GetComponent<TestModelGenerator>();
GoogleARCore.ARCoreSessionConfig newconfig = new GoogleARCore.ARCoreSessionConfig();
GoogleARCore.ARCoreSessionConfig config = ScriptableObject.CreateInstance<GoogleARCore.ARCoreSessionConfig>();
config.AugmentedImageDatabase = generator.newBD;
Debug.Log("transfered db size --------------- " + config.AugmentedImageDatabase.Count);
arcoreDevice.GetComponent<GoogleARCore.ARCoreSession>().SessionConfig = config;
Instantiate(arcoreDevice,new Vector3(0,0,0), Quaternion.identity);
}
}
当我在编辑器中 运行 时,直到我在编辑器中查看数据库时才出现错误,那是我出现此错误的时候:
ERROR: flag '--input_image_path' is missing its argument; flag
description: Path of image to be evaluated. Currently only supports
*.png, *.jpg and *.jpeg.
当我调试并查看 AugmentedImageDatabase 的内存时。一切似乎都在那里并且工作正常。此外,一旦我为 android 构建,我就不会出现任何错误,而且当我在命令行中使用 'adb logcat -s Unity' 时,也不会抛出任何异常。
这可能是新 ARCore 功能的限制吗? AugmentedImageDatabases 是否不允许在 android 上动态创建?如果是这样,为什么要创建它们的内置函数?
我知道这些功能是全新的,而且任何地方都没有太多文档,因此非常感谢您的帮助。
我在 ARCore 的 Github 页面上发布了一个问题,得到的回复是您所说的功能尚未在 Unity API 中公开:
https://github.com/google-ar/arcore-unity-sdk/issues/256
我正在尝试使用 arcores 的新图像跟踪功能动态创建图像数据库。
目前我有一个服务器为我提供图像位置,我将其下载到我设备的持久数据路径。我使用这些图像创建新的数据库条目,如下所示:
Public 变量:
public AugmentedImageDatabase newBD;
public AugmentedImageDatabaseEntry newEntry;
这里我进行正则表达式匹配以从数据路径获取图像并将它们转换为 texture2D 以填充 AugmentedImageDatabaseEntry 值。
Regex r1 = new Regex(@"https?://s3-([^.]+).amazonaws.com/([^/]+)/([^/]+)/(.*)");
// Match the input for file name
Match match = r1.Match(input);
if (match.Success)
{
string v = match.Groups[4].Value;
RegexMatch = v;
Texture2D laodedTexture = LoadTextureToFile(v);
laodedTexture.EncodeToPNG();
AugmentedImageDatabaseEntry newEntry = new AugmentedImageDatabaseEntry(v, laodedTexture, Application.persistentDataPath + "/" + v);
newEntry.Name = v;
newEntry.Texture = laodedTexture;
newEntry.TextureGUID = Application.persistentDataPath + "/" + v;
Debug.Log(newEntry.Name);
Debug.Log(newEntry.Texture);
Debug.Log(newEntry.TextureGUID);
newBD.Add(newEntry);
}
为了让它在 android 上运行,我不得不稍微修改 ARCore 统一实现的源代码,以便 database.Add() 函数可以在编辑器之外运行。
所有这些似乎都可以无缝运行,因为我还没有收到任何错误。 一旦我将场景更改为 ARCore 场景,我就会实例化一个 ARCore Camera 并创建一个新的 sessionconfig,它包含对上面填充的数据库的引用。
代码如下:
public class 新配置设置:MonoBehaviour {
public GameObject downloadManager;
public GameObject arcoreDevice;
// Use this for initialization
void Start () {
downloadManager = GameObject.Find("DownlaodManager");
TestModelGenerator generator = downloadManager.GetComponent<TestModelGenerator>();
GoogleARCore.ARCoreSessionConfig newconfig = new GoogleARCore.ARCoreSessionConfig();
GoogleARCore.ARCoreSessionConfig config = ScriptableObject.CreateInstance<GoogleARCore.ARCoreSessionConfig>();
config.AugmentedImageDatabase = generator.newBD;
Debug.Log("transfered db size --------------- " + config.AugmentedImageDatabase.Count);
arcoreDevice.GetComponent<GoogleARCore.ARCoreSession>().SessionConfig = config;
Instantiate(arcoreDevice,new Vector3(0,0,0), Quaternion.identity);
}
}
当我在编辑器中 运行 时,直到我在编辑器中查看数据库时才出现错误,那是我出现此错误的时候:
ERROR: flag '--input_image_path' is missing its argument; flag description: Path of image to be evaluated. Currently only supports *.png, *.jpg and *.jpeg.
当我调试并查看 AugmentedImageDatabase 的内存时。一切似乎都在那里并且工作正常。此外,一旦我为 android 构建,我就不会出现任何错误,而且当我在命令行中使用 'adb logcat -s Unity' 时,也不会抛出任何异常。
这可能是新 ARCore 功能的限制吗? AugmentedImageDatabases 是否不允许在 android 上动态创建?如果是这样,为什么要创建它们的内置函数?
我知道这些功能是全新的,而且任何地方都没有太多文档,因此非常感谢您的帮助。
我在 ARCore 的 Github 页面上发布了一个问题,得到的回复是您所说的功能尚未在 Unity API 中公开: https://github.com/google-ar/arcore-unity-sdk/issues/256