如何转换边界框以进行视锥体剔除?

时间:2012-10-27 19:54:52

标签: directx intersection coordinate-transformation culling

我有一个场景图,其中包含变换和边界框的节点,以及我从viewProjection矩阵构建每个帧的视锥体。但是,这些框在框的局部空间中有4个顶点的坐标我必须把它们变成什么样才能让它们进入与视锥体相同的空间,这样我就可以检查与视锥体的交点?我试着将它们带入世界空间,但这很奇怪,因为我有50个世界矩阵(我使用实例化,每个实例都有自己的世界/变换矩阵)

1 个答案:

答案 0 :(得分:0)

通常你想在单词空间中碰撞BB和视锥。原始算法:

mtxViewProjTranspose = MtxTranspose(mtxView * mtxProj);
frustumViewWorld = frustumView * mtxViewProjTranspose;
foreach(i)
{
    bbWorld[i] = bb[i] * mtxWorld;
    bCull[i] = collide(BBWorld[i], frustumViewWorld );
}

你也可以在视野中做到这一点(但不太好):

mtxProjTranspose = MtxTranspose(mtxProj);
frustumViewViewSpace = frustumView * mtxProjTranspose;
    foreach(i)
    {
        bbView[i] = bb[i] * mtxWorld[i] * mtxView;  // More calculations here
        bCull[i] = collide(bbView[i], frustumViewViewSpace );
    }

如果你认为将边界框(4个顶点)转换为世界空间是很奇怪的,那么想想在网格本身中有数千个顶点这样做有多奇怪。 =)据我所知,碰撞检测远比这个简单的乘法更昂贵。但是:

  • 要缩短碰撞列表,您可以将平截头体转换为世界空间,并粗略地检查哪些节点值得与平截头体碰撞,哪些节点不碰撞。 所以你也不需要翻译他们的BB 。这取决于你的场景实现。
  • 根据您在HLSL,游戏风格和目标最终用户硬件方面的技能,您可以(或不能)在GPU上移动BB变换(计算着色器,甚至在SM 4.0上也可用,但有一些限制)因为GPU通常使用网格VB来做到这一点。但我认为它不会给你出价。然而,稍后将碰撞检测移动到GPU也是一个很好的训练。

希望有所帮助!