5.1 3D 资产:模型、动画、材质


5.1 3D 资产:模型、动画、材质

本节摘要:3D 资产是 XR 内容的"原材料"。XR 资产和游戏 3D 资产最大的差异是"真实空间尺度"——1 单位必须等于 1 米;"预烘焙光照"——VR 里实时光照代价太高;"低面数+法线贴图"——单场景面数控制在 200k 以内。本节用"从 Blender 到 Unity 的一条 XR 资产流水线"演示,途中给出 4 个常见陷阱的避坑指南。

学习要点

阅读完本节,你应当能够:

  1. 解释 XR 3D 资产与游戏 3D 资产的 3 个关键差异。
  2. 在 Blender 里按"XR 资产规范"建模,并导入 Unity。
  3. 用 LOD + 预烘焙光照把一个场景的 GPU 负载减半。
  4. 列出 XR 资产的 4 个常见陷阱及避坑方法。

一、问题与直觉

XR 3D 资产和游戏 3D 资产听上去一样,但工程上差异很大:

  • 真实空间尺度:XR 资产必须按真实米/厘米建模,否则用户戴头显看到"1 米高的虚拟人"会瞬间"出戏"。
  • 预烘焙光照:VR 里实时阴影/反射的代价是游戏 5-10 倍,必须烘焙到 Lightmap。
  • 低面数:单场景总面数控制在 200k 以内(Quest 3),否则 GPU 满载。

直觉:XR 资产追求"够真",不追求"够细"

二、XR 资产规范

一份 XR 资产从建模到上线的规范如下:

维度 规范 理由
单位 1 单位 = 1 米 真实空间尺度
面数 单物体 < 30k Quest 3 GPU 顶限
材质 PBR(金属/粗糙度) 头显里 PBR 看起来对
纹理 2K 优先,4K 谨慎 显存与带宽
法线贴图 必须 用低模+法线贴图代替高模
光照 Lightmap 预烘焙 实时光照代价
动画 骨骼数 < 60 蒙皮计算量
导出格式 FBX / glTF 2.0 跨引擎

三、从 Blender 到 Unity 的 XR 资产流水线

Step 1:在 Blender 里建模

  • 启动 Blender,把"单位"改成"米"(不是默认的"无单位")。
  • 按真实尺度建模:桌子 0.74m 高、椅子 0.45m 座高、人 1.75m 身高等。
  • 启用 Stat 面板的"Overlays → Statistics",看实时面数。

Step 2:拆 UV + 烘焙法线贴图

  • 高模(5w 面)烘焙法线贴图到低模(1w 面)——这是 90% XR 资产的标准做法。
  • 拆 UV 时按"展平"(不是默认的"自动")——保证接缝少、纹理连续。

Step 3:导出 FBX

  • "Apply Scalings" = "FBX Units Scale"。
  • "Forward" = "-Z Forward"(Unity 习惯)。
  • "Up" = "Y Up"。

Step 4:Unity 导入设置

// 在 Unity Editor 里把导入的 FBX 做以下处理: // 1. Model → Scale Factor = 1 // 2. Model → Convert Units = true // 3. Materials → Location = Use External Materials // 4. Rig → Animation Type = Humanoid(如果是人) // 5. Animation → Anim. Compression = Optimal

Step 5:配置 LOD

// Unity LOD Group public class SetupLOD : MonoBehaviour { void Start() { var lodGroup = gameObject.AddComponent<LODGroup>(); var renderers = GetComponentsInChildren<Renderer>(); var lod0 = new LOD(0.6f, renderers); // 距离 < 60% 视野用全模 var lod1 = new LOD(0.2f, new[] { renderers[1] }); // 距离 60-80% 用中模 var lod2 = new LOD(0.05f, new[] { renderers[2] }); // 距离 > 80% 用低模 lodGroup.SetLODs(new[] { lod0, lod1, lod2 }); lodGroup.RecalculateBounds(); } }

四、4 个常见陷阱与避坑

陷阱 1:单位错乱

Blender 默认"无单位"——一个 1m 高的角色用 1 单位建模就错。避坑:Blender Scene Properties → Units → Length = Meters。

陷阱 2:高模当低模用

直接用 50k 面的高模 → Quest 3 上一帧渲染 4 个就掉帧。避坑:高模烘焙法线贴图 → 低模用低模+法线贴图。

陷阱 3:实时阴影

XR 里实时阴影的代价是游戏的 5-10 倍。避坑:所有静态物体用 Lightmap 烘焙,只有动态物体(玩家/手)开实时阴影。

陷阱 4:未压缩纹理

一张 4K 纹理 = 64MB 显存。避坑:纹理压缩到 ASTC(Quest/iOS)或 BC7(PC),2K 起步。

五、动手演示:把 Blender 资产导入 Unity 并配置 XR

// 1. 启动 OpenXR + Quest 3 优化 // 2. 把刚才导入的资产放进场景 // 3. 加 LOD、加预烘焙光照、加 GPU Instancing public class XRAssetValidator : MonoBehaviour { [SerializeField] private Renderer targetRenderer; void OnValidate() { // 检查面数 var mesh = targetRenderer.GetComponent<MeshFilter>().sharedMesh; if (mesh.triangles.Length / 3 > 30000) Debug.LogWarning($"面数 {mesh.triangles.Length / 3} 超过 30k 上限"); // 检查材质 var mat = targetRenderer.sharedMaterial; if (mat.shader.name == "Standard") Debug.LogWarning("请用 URP/Lit 而不是 Standard"); } }

跑起来后用 Unity Profiler 抓帧——如果目标资产占 GPU 时间 > 1ms,就要进一步减面或加 LOD。

本节要点回顾

  • XR 资产规范:1 单位=1 米、单物体 < 30k 面、PBR、预烘焙光照。
  • 真实空间尺度是 XR 资产的第一原则——错 1 厘米就出戏。
  • 高模烘焙法线贴图到低模,是 XR 资产的标准做法。
  • 4 个常见陷阱:单位、高模用高模、实时阴影、未压缩纹理。
  • 从 Blender 建模到 Unity 部署的 5 步流水线,把规范变成可复用流程。

下一节我们从资产走到叙事——怎么在 XR 里讲一个沉浸故事。


作者与出处
原作者: 灏天文库
来源:灏天文库
整理: 灏天文库整理
由灏天文库平台收录,内容或由平台用户上传,仅供学习交流
发布者: 作者: 灏天文库 转发
评论区 (0)
U