Qt Quick 3D 细节层次
细节层次(LoD)
细节层次(LoD)是指在与摄像机的不同距离上使用三维模型替代版本的技术。这样做的目的是优化资源使用,当模型距离较远或只占屏幕一小部分时,就使用较简单的版本,而当模型距离较近或占屏幕空间较大时,就使用更详细的版本。这种方法既能有效利用 GPU 资源,又能保持视觉保真度。
Qt Quick 3D 在《Desktop.com》中,既提供了自动系统,也提供了明确的细节级别系统。自动系统的基础是使用单一网格,并在网格文件中存储多级细节。显式系统则使用 组件,将不同的细节级别指定为子模型。LodManager
自动详细程度
使用自动细节级别支持的主要方法是使用Balsam Asset Import Tool(资产导入工具)导入内容。通过在导入资产时使用标志--generateMeshLevelsOfDetail
,该工具将在可能的情况下为每个网格生成细节级别。这样做的目的是在保持整体特征的同时,尽量简化原始网格的几何形状。这样就会产生额外的几何图形,并为每个额外的细节级别生成新的索引值,以及一个距离系数,用于确定在给定的渲染尺寸下使用哪个网格。这个距离系数与渲染对象到摄像机的距离有关,但最重要的是每个像素的几何图形比例要好。这些数据会写入 .mesh 文件,并在模型使用时自动使用。
自动系统的一个折衷方案,也是默认情况下不启用该功能的原因是,当几何体缩小时,有可能会引入视觉假象。所使用的几何简化算法试图保留模型的特征,但在某些情况下,可能需要重新计算网格的法线,以保持预期的视觉外观。这可以在导入资产时使用--recalculateLodNormals
标志来完成。可以通过向参数--recalculateLodNormalsMergeAngle
和--recalculateLodNormalsSplitAngle
传递欧拉角值来控制法线合并或分割的角度,从而进一步调整法线重新计算过程。
自动系统的主要优点是,在导入资产并进行适当设置后即可轻松使用。使用自动系统不需要额外的代码,任何模型在引用生成的包含细节几何图形的网格文件时,都会根据模型在屏幕上所占的像素自动选择合适的几何图形。
您可以在global level 或per-model level 上调整自动选择细节层次的行为,方法是使用Camera 或Model 的levelOfDetailBias
属性。这些偏置属性的默认值均为 1.0,表示信任自动系统计算的值。该值是对理想值的偏置,如果值小于 1.0,则需要更小的渲染尺寸才能切换到较低的细节级别。高于 1.0 的值将导致更快地使用较低级别的细节。如果数值为 0.0,则会完全禁止使用细节级别,并始终使用原始网格几何体。
自动系统不如显式系统灵活。例如,自动系统总是对所有细节层次使用相同的材质,这可能并不总是理想的。另一个潜在的缺点是不同细节级别之间没有过渡,而自动细节级别在理想情况下不需要过渡,但在某些使用情况下可能需要过渡。
显式详细程度
显式详细程度系统比自动系统更灵活,但使用时需要做更多的工作。显式系统的基础是使用LodManager 组件,将不同的详细程度指定为子Model 组件。LodManager 的任何子组件,只要是 Model 的实例,都将被视为一个细节层次。这一点非常强大,因为每个细节级别都可以是一个完全自定义的模型,拥有自己的几何形状和材料。
LodManager 组件还有一个distances 属性,用于决定使用哪个子Model 。当摄像机距离接近每个距离边界时,LodManager 节点将过渡到下一个子Model 。fadeDistance 属性可用于设置交叉淡入淡出过渡开始和结束的距离。
这是一个如何使用显式细节级别系统的示例:
在参考示例中,LodManager 用于为大理石半身像的每个细节级别明确指定不同的网格文件。
LodManager { camera: camera distances: [100, 140, 180] fadeDistance: 10 Model { scale: Qt.vector3d(100, 100, 100); source: "meshes/marble_bust_01_LOD_0.mesh" materials: [ marbleMaterial ] } Model { scale: Qt.vector3d(100, 100, 100); source: "meshes/marble_bust_01_LOD_1.mesh" materials: [ marbleMaterial ] } Model { scale: Qt.vector3d(100, 100, 100); source: "meshes/marble_bust_01_LOD_2.mesh" materials: [ marbleMaterial ] } Model { scale: Qt.vector3d(100, 100, 100); source: "meshes/marble_bust_01_LOD_3.mesh" materials: [ marbleMaterial ] } }
对于此代码,这是一个定义示意图,其中指出了如何使用距离列表来定义不同细节级别之间的边界,以及如何使用 fadeDistance 属性来定义交叉渐变过渡。
© 2025 The Qt Company Ltd. Documentation contributions included herein are the copyrights of their respective owners. The documentation provided herein is licensed under the terms of the GNU Free Documentation License version 1.3 as published by the Free Software Foundation. Qt and respective logos are trademarks of The Qt Company Ltd. in Finland and/or other countries worldwide. All other trademarks are property of their respective owners.