查看动画网格的截锥体剔除
View frustum culling for animated meshes
我在我的系统中实施了截锥体剔除,它测试了每个对象边界球体上的截锥体平面,效果很好。 (我发现不需要 PlaneVsAabb 检查)
但是,网格的边界球体根据其绑定姿势进行了调整,因此当网格体开始移动时(例如玩家用他的剑攻击),一些顶点可能会超出球体。
这通常会导致网格被剔除,尽管有一些顶点应该被渲染(例如玩家的剑超出了球体)。
我可以想到两种可能的解决方案:
对于每一帧中的每个网格,根据骨骼变化计算其新的边界球体。 (我不知道如何开始...)这会不会太低效了?
为每个球体半径添加一个固定的偏移量(也许基于整个网格大小?),因此即使在设置动画时网格也不会被剔除。
(1) 实时效率低下是的。但是,您可以通过计算最大可能的边界球体静态,即加载它时,将两者结合起来。在 (2) 中使用它可以保证比您弥补的一些 任意 偏移更好的结果。
(1) 您可以将定位器添加到关键元素(例如剑尖上的虚拟骨骼)并在动画时变换它们的原点。您可以在每次更新时在 CPU 上完成,然后计算边界框或边界球。或者您可以离线预先计算每一帧动画的边界体积。 Doom3 使用第二种方法。
我在我的系统中实施了截锥体剔除,它测试了每个对象边界球体上的截锥体平面,效果很好。 (我发现不需要 PlaneVsAabb 检查)
但是,网格的边界球体根据其绑定姿势进行了调整,因此当网格体开始移动时(例如玩家用他的剑攻击),一些顶点可能会超出球体。
这通常会导致网格被剔除,尽管有一些顶点应该被渲染(例如玩家的剑超出了球体)。
我可以想到两种可能的解决方案:
对于每一帧中的每个网格,根据骨骼变化计算其新的边界球体。 (我不知道如何开始...)这会不会太低效了?
为每个球体半径添加一个固定的偏移量(也许基于整个网格大小?),因此即使在设置动画时网格也不会被剔除。
(1) 实时效率低下是的。但是,您可以通过计算最大可能的边界球体静态,即加载它时,将两者结合起来。在 (2) 中使用它可以保证比您弥补的一些 任意 偏移更好的结果。
(1) 您可以将定位器添加到关键元素(例如剑尖上的虚拟骨骼)并在动画时变换它们的原点。您可以在每次更新时在 CPU 上完成,然后计算边界框或边界球。或者您可以离线预先计算每一帧动画的边界体积。 Doom3 使用第二种方法。