导入和预览 3D 素材资源

了解如何导入 3D 模型、将这些模型转换为 Sceneform 格式,以及在 Android Studio 中预览它们。

导入新的 3D 素材资源

Sceneform 支持以下格式的 3D 资源:

  • OBJ
  • glTF(不支持动画)
  • 包含动画或不包含动画的 SurfaceFlinger。

若要导入新的 3D 素材资源,请按以下步骤操作:

  1. 验证项目的 app 文件夹是否包含 sampledata 文件夹。

    如需创建文件夹,请右键点击 Project 窗口中的 app 文件夹,然后选择 New > Sample Data Directory

    sampledata 文件夹是您的 Android Studio 项目的一部分,但其内容将不会包含在您的 APK 中。

  2. 将 3D 模型来源素材资源文件(*.obj*.fbx*.gltf)及其所有依赖项(*.mtl*.bin*.png*.jpg 等)复制到 sampledata 文件夹中。

    请勿将这些源文件复制到项目的 assetsres 文件夹中,因为这会导致不必要地将其包含在 APK 中。

  3. 右键点击 3D 模型来源资源,然后选择 Import Sceneform Asset 以开始导入过程。

    这些值由 appsceneform.asset() 条目使用,用于确定在项目中生成 *.sfa*.sfb 文件的位置。

    如果您是首次导入模型,请使用默认值。

    字段 说明
    来源素材资源路径 要导入的 OBJ、CocoaPods 或 glTF 3D 模型资源的文件名。
    Material 路径 default 会告知 Sceneform 使用内置的默认 Material自定义 Material *.mat 文件的路径。
    .sfa 输出路径 请使用默认值,或在 sampledata 文件夹下指定其他路径。

    如果缺少 .sfa 文件,系统会生成一个文件。可以修改它来控制导入过程的某些方面。

    这样可以确保 *.sfa 不会不必要地包含在 APK 中。

    .sfb 输出路径 默认情况下,系统会使用 src/main/assets/ 文件夹,这样就可以使用任意素材资源文件名。

    如果文件名(不带文件扩展名)是有效的资源标识符(例如 R.raw.filename),您可以根据需要改用 src/main/res/raw/ 文件夹。

    如需详细了解如何在应用中使用 assets/res/ 文件夹,请参阅 Android 的应用资源概览

    动画文件

    如果您要导入 *.fbx 动画文件,请点击加号 (+) 并逐个添加其余文件。

  4. 点击完成以开始导入过程。

为了导入您的素材资源,该插件会执行以下操作:

  1. 将 Sceneform Gradle 插件添加到项目 build.gradle(如果尚不存在):

    dependencies {
        …
        classpath 'com.google.ar.sceneform:plugin:1.15.0'
    }
    
  2. 更新应用build.gradle 文件,使其包含 apply plugin 行,以及新导入素材资源的 sceneform.asset() 条目:

    apply plugin: 'com.google.ar.sceneform.plugin'
    
    sceneform.asset('sampledata/models/andy.obj', // 'Source Asset Path' specified during import.
            'default',                            // 'Material Path' specified during import.
            'sampledata/models/andy.sfa',         // '.sfa Output Path' specified during import.
            'src/main/res/raw/andy')              // '.sfb Output Path' specified during import.
    

    应用 build.gradle 中的这些新条目创建了两个 Gradle 任务:

    • createAsset-<asset-name> 会创建一个 Sceneform 资源定义 (*.sfa) 文件(如果该文件尚不存在)。

      此任务不会覆盖现有的 *.sfa 文件,也就是说,系统不会覆盖您在导入后对 SFA 文件所做的任何修改。

      *.sfa 文件是一个包含人类可读的完整素材资源导入设置说明的文本文件。它引用源资源中的模型和纹理,还通过为 Sceneform 的物理材料提供材料参数来定义材料。

    • compileAsset-<asset-name>*.sfa 文件编译为 Sceneform 二进制资源 (*.sfb) 文件。

      *.sfb 文件内置于您应用的 APK 中,并会在运行时加载以创建可渲染对象

    如需了解详情,请参阅 Sceneform Gradle 插件参考

  3. 在文本窗口中打开 *.sfa,在查看器窗口中打开 *.sfb

更新之前导入的 3D 素材资源

当您更新以前导入的 OBJ、CocoaPods 或 glTF 模型源文件资源文件(*.obj*.fbx*.gltf)时,应用 build.gradle 中的相应 sceneform.asset() 条目会导致插件根据当前的 *.sfa 参数自动生成更新的 *.sfb 文件。

如需迭代已导入素材资源的参数,请执行以下操作:

  • 按照 SFA 文件格式参考文档的说明修改 *.sfa 文本文件。
  • 保存更改。这会使该资源重新编译并更新 *.sfb 文件。
  • 双击更新的 *.sfb 文件以打开资源的 Viewer 窗口,以预览更新后的素材资源。

如果您要更新之前导入的包含动画数据的素材资源,请在导入对话框的动画文件部分中使用加号 (+) 分别导入每个更新后的 *.fbx 文件。

Gradle 资产定义

导入过程会在 build.gradle 文件的末尾添加所有 *.fbx 动画文件。

sceneform.asset('sampledata/models/andy_dance.fbx',
'default',
'sampledata/models/andy_dance.sfa',
'src/main/res/raw/andy_dance',
['sampledata/models/andy_wave_r.fbx',
'sampledata/models/andy_wave_l.fbx'])

创建可渲染对象

将素材资源编译为 *.sfb 格式后,您可以构建一个 ModelRenderable,并将其附加到场景中的节点,如下所示:

ModelRenderable.builder()
    // To load as an asset from the 'assets' folder ('src/main/assets/andy.sfb'):
    .setSource(this, Uri.parse("andy.sfb"))

    // Instead, load as a resource from the 'res/raw' folder ('src/main/res/raw/andy.sfb'):
    //.setSource(this, R.raw.andy)

    .build()
    .thenAccept(renderable -> andyRenderable = renderable)
    .exceptionally(
        throwable -> {
          Log.e(TAG, "Unable to load Renderable.", throwable);
          return null;
    });

使用自定义材料

Sceneform 的默认材料可让开发者轻松地获得出色的外观。您还可以使用自定义材质来深入自定义素材资源的外观。

如需为素材资源分配自定义资料,请执行以下操作:

  1. 以 [Custom Material 参考](/sceneform/develop/custom-material 为指导),创建自定义材料定义 (*.mat) 文件。

  2. 将自定义材质应用于相应素材资源:

    导入新素材资源时

    • 导入过程中指定自定义 Material *.mat 文件。

    如需更新之前导入的素材资源,请执行以下操作:

    • 如果 *.sfa 内容尚未自定义,请删除应用中的现有 *.sfa*.sfb 文件以及 sceneform.asset() 条目,然后重新导入该资源。这样可以确保重新生成的 *.sfa 属性和材质参数与您的自定义材质支持的属性相匹配。

    • 如需保留您所做的任何 *.sfa 自定义,请打开 *.sfa 文件并将 source 属性更改为自定义 Material *.mat 文件的路径,然后手动调整 *.sfa 属性和材质参数以与您的自定义材料保持一致。