3D 对象不显示

如果你试图创建一个 3D 对象,但在屏幕上看不到它,本页将列出你可能遇到的一些常见问题。

GLTF 资源使用不正确

请参考 GLTF page 页面,了解如何在 Bevy 中正确使用 GLTF 3D 资源。

GLTF 文件很复杂。它包含许多子资源,与不同的 Bevy 类型对应。请确保你使用的东西是正确的。

在你正在生成一个 GLTF 场景时,确保使用与 GLTF 基本类型相对应的 MeshStandardMaterial

如果你通过资源路径创建场景,请确保指定一个你想要的子资源标签。

asset_server.load("my.gltf#Scene0");

如果你尝试使用 Gltf 的顶层的 master asset 创建场景,它无法正常工作。

如果你尝试仅生成 GLTF 中一个 Mesh,它也无法正常工作。

如果你通过在自己创建的 Bevy PbrBundle 实体上使用 Gltf 顶层 master asset 或 GltfMesh,它同样无法正常工作。你需要一个特定的 GLTF Primitive、或者直接使用场景。:)

不受支持的 GLTF

Bevy 并不完全支持 GLTF 格式的所有特性,对数据有一些特殊的要求。不是所有的 GLTF 文件都能在 Bevy 中加载和渲染。不幸的是,在许多这样的情况下,你得不到任何的错误提示或诊断信息。

普遍遇到的限制:

  • 纹理通过 base64 编码后以 ascii 字符形式嵌入的 GLTF 文件不能被加载。需要把你的纹理放在外部文件中,或者使用二进制(*.glb)的格式。
  • 不支持 Mipmaps。你的资源应该仍然可以被加载和渲染,但没有 mipmapping,它看起来可能会很嘈杂、有颗粒、有锯齿。
  • Bevy 的渲染器要求所有的 mesh 和 primitive 都有每个顶点的位置、UV 和法线,请确保所有这些数据都包含在内。
  • 没有纹理的 mesh 和 primitive(如果材质只是一种纯色)仍然必须包含 UV。Bevy 将不会渲染没有 UV 的网格。
  • 当在你的材质中使用法线贴图时,切线也必须包含在网格中。有法线贴图但没有切线的网格是有效的,如果缺少切线,其他软件通常会自动生成切线,但 Bevy 还不支持这个。请确保在导出时勾选包括切线的复选框。
  • Bevy 还没有内置的骨架动画支持,渲染时动画是完全被忽略的。

这份清单并不详尽,可能还有我不知道的或忘了包括在这里的其他不支持的情况。:)

未优化的编译或调试编译

或许你的资源只是需要多一点时间来加载?Bevy(和一般的 Rust)在没有编译器优化的情况下是非常慢的。实际上,拥有大纹理的复杂 GLTF 文件可能需要超过一分钟才能加载并显示在屏幕上。在优化后的构建中,这几乎是瞬间完成的。请看这里

顶点顺序和剔除算法

在默认情况下,Bevy 渲染器假设逆时针方向的顶点顺序,并且启用了背面剔除。

如果你是通过代码生成你的 Mesh,请确保你的顶点顺序是正确的。