了解如何导入 3D 模型、将这些模型转换为 Sceneform 格式,以及在 Android Studio 中预览它们。
导入新的 3D 素材资源
Sceneform 支持以下格式的 3D 资源:
- OBJ
- glTF(不支持动画)
- 包含动画或不包含动画的 SurfaceFlinger。
若要导入新的 3D 素材资源,请按以下步骤操作:
验证项目的
app
文件夹是否包含sampledata
文件夹。如需创建文件夹,请右键点击 Project 窗口中的
app
文件夹,然后选择 New > Sample Data Directory。sampledata
文件夹是您的 Android Studio 项目的一部分,但其内容将不会包含在您的 APK 中。将 3D 模型来源素材资源文件(
*.obj
、*.fbx
或*.gltf
)及其所有依赖项(*.mtl
、*.bin
、*.png
、*.jpg
等)复制到sampledata
文件夹中。请勿将这些源文件复制到项目的
assets
或res
文件夹中,因为这会导致不必要地将其包含在 APK 中。右键点击 3D 模型来源资源,然后选择 Import Sceneform Asset 以开始导入过程。
这些值由 app 的
sceneform.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
动画文件,请点击加号 (+) 并逐个添加其余文件。点击完成以开始导入过程。
为了导入您的素材资源,该插件会执行以下操作:
将 Sceneform Gradle 插件添加到项目
build.gradle
(如果尚不存在):dependencies { … classpath 'com.google.ar.sceneform:plugin:1.15.0' }
更新应用的
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 插件参考。
在文本窗口中打开
*.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 的默认材料可让开发者轻松地获得出色的外观。您还可以使用自定义材质来深入自定义素材资源的外观。
如需为素材资源分配自定义资料,请执行以下操作:
以 [Custom Material 参考](/sceneform/develop/custom-material 为指导),创建自定义材料定义 (
*.mat
) 文件。将自定义材质应用于相应素材资源:
导入新素材资源时:
- 在导入过程中指定自定义 Material
*.mat
文件。
如需更新之前导入的素材资源,请执行以下操作:
- 在导入过程中指定自定义 Material