用于存储 3D 模型的 AR 应用程序数据库

Database for AR app for storing 3D models

我正在学习增强现实并使用 Google 的 AR-Core 开发 AR 应用程序。它在单个模型上工作正常,但我在想如果我可以在数据库中上传不同的 3D 模型,应用程序将从数据库中获取模型并显示到屏幕上。

编辑: 我想从数据库加载模型 运行-time。 除了 GLTF2 之外还有其他方法吗,比如 OBJ 或 FBX 可以在 运行 时间内加载。

您在应用中使用多个模型的方式的两个示例是:

  • 在构建时在应用中包含多个 Renderable
  • 添加在 运行 时间加载和构建模型的能力

第一个示例如下所示。这将加载并构建应用程序 'raw' 文件夹中的所有可呈现文件,在 Main ACtivity 的 onCreate 函数中(此示例是下面的 Kotlin)。此示例使用 class 'MetaRenderable',它只是一个 class,具有用于存储可渲染名称和可渲染本身的属性。它通过在原始文件夹中的名称中查找已知文本字符串来搜索可渲染文件,但您可以简单地为所有“.sfb”文件分别搜索:

  override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)

        //Check that AR is supported on this device
        if (!checkIsSupportedDeviceOrFinish(this)) {
            return
        }

        //Create the set of renderables
        val rawFields: Array<Field> = R.raw::class.java.fields
        for (i in 0 .. rawFields.count() - 1) {
            val resID = rawFields[i].getInt(rawFields[i])
            val value = TypedValue()
            resources.getValue(resID, value, true)
            val rawFileName = value.string.toString()
            if (rawFileName.contains("com_yourpackagename_")) {
                //This is a renderable so build it and add it to the list
                Log.d(TAG,"rawFileName: " + rawFileName)
                ModelRenderable.builder()
                    .setSource(this, resID)
                    .build()
                    .thenAccept{
                        val newMetaRenderable:MetaRenderable = MetaRenderable()
                        newMetaRenderable.name = rawFields[i].name.substringAfter("com_yourpackagename_renderable_")
                        newMetaRenderable.renderable = it
                        listOfMetaRenderables.add(newMetaRenderable)
                        //Set the default renderable
                        if(rawFileName.contains("your_defaul_trenderable_name")) {
                            selectedRenderable = it
                        }
                    }
                    .exceptionally {
                        Log.d(TAG, "Could not build Renderable id: " + resID)
                        Toast.makeText(this@MainActivity, "Could not build one of the renderables", Toast.LENGTH_LONG).show()
                        return@exceptionally null
                    }
            }
        }

对于第二个示例方法,在 运行 时间加载,您可以使用 RenderableSource.Builder 对象。这将允许您在 运行 时间为给定 URL 构建一个可渲染文件,尽管目前它仅限于 'GLTF2' 个文件,AFAIK。

RenderableSource.Builder
setSource(Context context, Uri modelUri, RenderableSource.SourceType sourceType) Sets the Uri of the asset to be imported.

文档在这里:

这里有一个示例项目,可以从 Google 的 Poly 网站浏览、下载和构建模型: