创建在主页中使用的 3D 模型
用户在启动应用程序之前,会先登陆到 Windows Mixed Reality 主页。 为 Windows Mixed Reality 头戴显示设备设计应用程序时,请使用 3D 模型作为应用启动器,并将 3D 深层链接放入 Windows Mixed Reality 主页中。 本文概述了创建与 Windows Mixed Reality 主页兼容的 3D 模型的指南。
资产要求概述
为 Windows Mixed Reality 创建 3D 模型时,所有资产必须满足以下要求:
- 导出 - 资产必须以 .glb(二进制 glTF)、.obj 或 .fbx 文件格式传送
- 建模 - 资产必须少于 10k 个三角形,每个 LOD 不超过 64 个节点和 32 个子网格
- 材料 - 纹理大小不能大于 4096 x 4096,最小 MIP 贴图的任一维度不应大于 4
- 动画 - 30 FPS 速度的动画时长不能超过 20 分钟(36,000 个关键帧),并且包含的变形目标顶点必须 <= 8192 个
- 优化 - 应使用 WindowsMRAssetConverter 优化资产。 对于 <= 1709* 的 Windows OS 版本,需要进行优化;对于 >= 1803 的 Windows OS 版本,建议进行优化
注意
3D 查看器应用支持不同的格式和分辨率,但最终会将模型转换为 .glb/glTF,然后再在混合现实主页中显示它们。
本文接下来将详细概述这些要求和提供额外的指南,确保模型能够在 Windows Mixed Reality 主页中正常使用。
详细指南
导出模型
Windows Mixed Reality 主页要求使用 .glb 文件格式传送包含嵌入图像和二进制数据的 3D 资产。 Glb 是 glTF 格式的二进制版本,它是由 Khronos Group 维护的用于 3D 资产传送的免版税开放标准。 随着 glTF 发展成为可互操作 3D 内容的行业标准,Microsoft 对跨 Windows 应用和体验的格式支持会不断扩大。 如果尚未创建 glTF 资产,可以在 glTF 工作组 github 页上找到支持的导出器和转换器列表。
建模指南
Windows 要求按照以下建模指南生成资产,以确保与混合现实主页的体验兼容。 在所选的程序中建模时,请记住以下建议和限制:
- 上轴应设置为“Y”。
- 资产应“正面”朝向正 Z 轴。
- 所有资产都应生成在场景原点 (0,0,0) 处的地平面上
- 单位应设置为米和资产,以便可以按世界标度创作资产
- 不必合并所有网格,但如果目标设备资源受限,则建议合并
- 所有网格都应共享一种材料,整个资产只使用一个纹理集
- UV 必须以正方形的排列方式布局在 0-1 空间中。 尽管允许平铺纹理,但应避免这样做。
- 不支持多 UV
- 不支持双面材料
三角形数量和详细级别 (LOD)
Windows Mixed Reality 主页不支持包含 10,000 以上三角形的模型。 建议三角化网格,然后再导出,以确保网格不会超过此数量。 Windows MR 还支持选择几何图形详细级别 (LOD),以确保高性能和高质量的体验。 WindowsMRAssetConverter 可帮助将 3 个版本的模型合并到单个 .glb 模型中。 Windows 会根据模型所使用的屏幕空间量确定要显示的 LOD。 仅支持 3 个LOD 级别,建议的三角形数量如下:
LOD 级别 | 建议的三角形数量 | 最大三角形数量 |
---|---|---|
LOD 0 | 10,000 | 10,000 |
LOD 1 | 5,000 | 10,000 |
LOD 2 | 2,500 | 10,000 |
节点数量和子网格限制
Windows Mixed Reality 主页不支持每个 LOD 包含 64 个节点或 32 个子网格以上的模型。 节点是 glTF 规范中的概念,它定义场景中的对象。 子网格在对象网格上的基元数组中定义。
功能 | 说明 | 支持的最大数量 | 文档 |
---|---|---|---|
节点 | glTF 场景中的对象 | 每个 LOD 64 个 | 此处 |
子网格 | 所有网格上的基元总数 | 每个 LOD 32 个 | 此处 |
材料指南
纹理应该使用 PBR 金属粗糙度工作流进行准备。 首先创建一组完整的纹理,包括反照率、法线、遮挡、金属度和粗糙度。 Windows Mixed Reality 支持分辨率高达 4096 x 4096 的纹理,但建议采用 512 x 512 的分辨率进行创作。 纹理应以 4 的倍数的分辨率进行创作。 以下概述了导出步骤中应用于纹理的压缩格式要求。 生成 MIP 贴图或纹理时,最低 MIP 必须最大为 4 x 4。
建议的纹理大小 | 最大纹理大小 | 最低 MIP |
---|---|---|
512x512 | 4096 x 4096 | 最大 4 x 4 |
反照率(基准颜色)贴图
无照明信息的原始颜色。 该贴图还分别包含金属(金属度贴图中的白色)和绝缘体(金属度贴图中的黑色)图面的反射率和漫射信息。
正常
正切空间法线贴图
粗糙度贴图
描述对象的微观图面。 白色 1.0 为粗糙,黑色 0.0 为光滑。 此贴图为资产提供了最明显的特征,因为它真实描述了图面。 例如划痕、指纹、污迹、污垢等。
环境遮挡贴图
显示光线遮挡(阻止反射)区域的值级别贴图
金属度贴图
让着色器了解某些位置是否为金属。 纯金属 = 1.0 白色,非金属 = 0.0 黑色。 可能存在过渡灰度值,这些值指示有灰尘等物体覆盖在金属原材料表面,但通常情况下,此贴图应仅为黑色和白色。
优化
Windows Mixed Reality 主页在使用自定义扩展定义的核心 glTF 规范基础上提供一系列优化 对于 <= 1709 的 Windows 版本,需要进行这些优化,对于更新的 Windows 版本,建议进行这些优化。 可以使用 GitHub 上提供的 Windows Mixed Reality 资产转换器,轻松优化任何 glTF 2.0 模型。 此工具将按以下指定的方式执行正确的纹理封装和优化。 对于常规用法,建议使用 WindowsMRAssetConverter,但如果需要对体验进行更多控制并希望生成自己的优化管道,则可以参考以下详细规范。
注意
有关确切的模型限制的可能性的最终列表,请参阅用于 Dynamics 365 应用程序的 3D 模型优化一文。
材质
为缩短在混合现实环境中加载资产的时间,Windows MR 支持呈现根据本部分定义的纹理封装方案封装的压缩 DDS 纹理。 可使用 MSFT_texture_dds 扩展来引用 DDS 纹理。 强烈建议使用压缩纹理。
HoloLens
基于 HoloLens 的混合现实体验要求使用以下封装规范,通过 2 个纹理设置封装纹理:
glTF 属性 | 纹理 | 封装方案 |
---|---|---|
pbrMetallicRoughness | baseColorTexture | 红色 (R),绿色 (G),蓝色 (B) |
MSFT_packing_normalRoughnessMetallic | normalRoughnessMetallicTexture | 法线 (RG),粗糙度 (B),金属度 (A) |
压缩 DDS 纹理时,每个贴图应进行以下压缩:
纹理 | 预期压缩 |
---|---|
baseColorTexture,normalRoughnessMetallicTexture | BC7 |
沉浸式 (VR) 头戴显示设备
沉浸式 (VR) 头戴显示设备的基于电脑的 Windows Mixed Reality 体验要求使用以下封装规范,通过 3 个纹理设置封装纹理:
>= 1803 的 Windows OS 版本
glTF 属性 | 纹理 | 封装方案 |
---|---|---|
pbrMetallicRoughness | baseColorTexture | 红色 (R),绿色 (G),蓝色 (B) |
MSFT_packing_occlusionRoughnessMetallic | occlusionRoughnessMetallicTexture | 遮挡 (R),粗糙度 (G),金属度 (B) |
MSFT_packing_occlusionRoughnessMetallic | normalTexture | 法线 (RG) |
压缩 DDS 纹理时,每个贴图应进行以下压缩:
纹理 | 预期压缩 |
---|---|
normalTexture | BC5 |
baseColorTexture, occlusionRoughnessMetallicTexture | BC7 |
<= 1709 的 Windows OS 版本
glTF 属性 | 纹理 | 封装方案 |
---|---|---|
pbrMetallicRoughness | baseColorTexture | 红色 (R),绿色 (G),蓝色 (B) |
MSFT_packing_occlusionRoughnessMetallic | roughnessMetallicOcclusionTexture | 粗糙度 (R),金属度 (G),遮挡 (B) |
MSFT_packing_occlusionRoughnessMetallic | normalTexture | 法线 (RG) |
压缩 DDS 纹理时,每个贴图应进行以下压缩:
纹理 | 预期压缩 |
---|---|
normalTexture | BC5 |
baseColorTexture,roughnessMetallicOcclusionTexture | BC7 |
添加网格 LOD
Windows MR 根据屏幕覆盖范围,使用几何节点 LOD 以不同详细级别呈现 3D 模型。 虽然此功能在技术上不是必需的,但建议将其用于所有资产。 目前 Windows 支持 3 个详细级别。 默认 LOD 为 0,表示最高质量。 其他 LOD 按顺序编号(例如 1、2),质量逐渐降低。 Windows Mixed Reality 资产转换器支持通过接受多个 glTF 模型并使用有效 LOD 级别将它们合并到单个资产,以生成满足此 LOD 规范的资产。 下表概述了预期的 LOD 排序和目标三角形数量:
LOD 级别 | 建议的三角形数量 | 最大三角形数量 |
---|---|---|
LOD 0 | 10,000 | 10,000 |
LOD 1 | 5,000 | 10,000 |
LOD 2 | 2,500 | 10,000 |
使用 LOD 时,始终指定 3 个 LOD 级别。 如果切换 LOD 系统时未切换到任何 LOD 级别,缺少 LOD 将导致模型意外不呈现。 glTF 2.0 当前不支持 LOD 作为核心规范的一部分。应使用 MSFT_LOD 扩展来定义 LOD。
屏幕覆盖范围
Windows Mixed Reality 根据每个 LOD 上设置的屏幕覆盖范围值驱动的系统来显示 LOD。 当前使用较大屏幕空间的对象将以较高的 LOD 级别显示。 屏幕覆盖范围不是核心 glTF 2.0 规范的一部分,必须使用 MSFT_lod 扩展的“附加”部分中的 MSFT_ScreenCoverage 来指定。
LOD 级别 | 建议范围 | 默认范围 |
---|---|---|
LOD 0 | 100% - 50% | 0.5 |
LOD 1 | 50% 以下 - 20% | 0.2 |
LOD 2 | 20% 以下 - 1% | 0.01 |
LOD 4 | 1% 以下 | - |
动画指南
注意
Windows 10 2018 年 4 月更新中已添加此功能。 在旧版本的 Windows 上,这些动画不会播放,但是,如果根据本文指南创作这些动画,则仍会加载它们。
混合现实主页支持在 HoloLens 和沉浸式 (VR) 头戴显示设备上播放 glTF 动画对象。 如果要在模型上触发动画,则需要使用 glTF 格式的动画贴图扩展。 使用此扩展可以根据用户在世界中的状态,在 glTF 模型中触发动画,例如,当用户靠近对象或用户查看对象时触发动画。 如果 glTF 对象具有动画,但没有定义触发器,则不会播放动画。 以下部分将介绍向任何 glTF 动画对象添加触发器的工作流。
工具
首先,下载以下工具(如果尚未安装)。 借助这些工具,可以轻松打开任何 glTF 模型,预览它,修改它并将它保存为 glTF 或 .glb:
打开并预览模型
首先,将 .glTF 文件拖动到编辑器窗口中,以在 VSCode 中打开 glTF 模型。 如果拥有的是 .glb 而不是 .glTF 文件,则可以使用下载的 glTF 工具加载项将其导入 VSCode 中。 转到“查看 -> 命令面板”,然后开始在命令面板中键入“glTF”,并选择“glTF: 从 glb 导入”,随即将弹出一个文件选取器,以便导入 .glb。
打开 glTF 模型后,应在编辑器窗口中看到 JSON。 此外,还可以右键单击文件名并从右键单击菜单中选择“glTF: 预览 3D 模型”命令快捷方式,以在实时 3D 查看器中预览模型。
添加触发器
可使用动画贴图扩展将动画触发器添加到 glTF 模型 JSON。 GitHub 中公开记录了动画贴图扩展(注意:此为草稿版本的扩展)。 若要将扩展添加到模型,只需滚动到编辑器中 glTF 文件的末尾,然后向文件添加“extensionsUsed”和“extensions”块(如果文件中没有它们)。 在“extensionsUsed”部分中,添加对“EXT_animation_map”扩展的引用,然后在“extensions”块中,将映射添加到模型中的动画。
如规范中所述,可以使用“动画”列表(即动画索引数组)中的“语义”字符串来定义动画触发项。 以下示例指定用户凝视对象时要播放的动画:
"extensionsUsed": [
"EXT_animation_map"
],
"extensions" : {
"EXT_animation_map" : {
"bindings": [
{
"semantic": "GAZE",
"animations": [0]
}
]
}
}
Windows Mixed Reality 主页支持以下动画触发器语义。
- “ALWAYS”:不断循环动画
- “HELD”:在抓取对象的整个持续时间内循环
- “GAZE”:在查看对象时循环
- “PROXIMITY”:在观看者靠近对象时循环
- “POINTING”:用户指向对象时循环
保存并导出
更改 glTF 模型后,可以直接将其另存为 glTF。 还可以在编辑器中右键单击文件的名称,然后选择“glTF: 导出到 GLB (二进制文件)”以导出 .glb。
限制
动画时长不能超过 20 分钟,且所包含的关键帧不能超过 36,000 个(以 30 FPS 速度播放 20 分钟)。 此外,使用基于变形目标的动画时,变形目标顶点不能超过 8192 个。 超过这些数量会导致动画资产不受 Windows Mixed Reality 主页支持。
功能 | 最大 |
---|---|
持续时间 | 20 分钟 |
关键帧 | 36,000 |
变形目标顶点 | 8192 |
glTF 实现说明
Windows MR 不支持使用负刻度翻转几何图形。 具有负刻度的几何图形可能导致视觉伪影。
glTF 资产必须使用场景属性指向默认场景,以便 Windows MR 呈现。 此外,Windows 10 2018 年 4 月更新之前的 Windows MR glTF 加载程序需要访问器:
- 必须提供最小值和最大值。
- SCALAR 类型必须为 componentType UNSIGNED_SHORT (5123) 或 UNSIGNED_INT (5125)。
- VEC2 和 VEC3 类型必须为 componentType FLOAT (5126)。
核心 glTF 2.0 规范使用以下材料属性,但它们并不是必需的:
- baseColorFactor、metallicFactor、roughnessFactor
- baseColorTexture:必须指向 DDS 中存储的纹理。
- emissiveTexture:必须指向 DDS 中存储的纹理。
- emissiveFactor
- alphaMode
核心规范中忽略以下材料属性:
- 所有多 UV
- metalRoughnessTexture:必须改用以下定义的 Microsoft 优化纹理封装
- normalTexture:必须改用以下定义的 Microsoft 优化纹理封装
- normalScale
- occlusionTexture:必须改用以下定义的 Microsoft 优化纹理封装
- occlusionStrength
Windows MR 不支持基元模式线和点。
仅支持单个 UV 顶点属性。
更多资源
- glTF 导出器和转换器
- glTF 工具包
- glTF 2.0 规范
- Microsoft glTF LOD 扩展规范
- 电脑混合现实纹理封装扩展规范
- HoloLens 混合现实纹理封装扩展规范
- Microsoft DDS 纹理 glTF 扩展规范