我有一个场景图,其中的节点包含变换和边界框,以及一个视图平截头体,我从 viewProjection 矩阵构建每个帧。但是,框在框的局部空间中有 4 个顶点的坐标。什么必须我将它们转换为,将它们放入与视锥相同的空间,这样我就可以检查与视锥的交叉点?我尝试将它们带入世界空间,但这很奇怪,因为我有 50 个世界矩阵(我使用实例化,每个实例都有自己的世界/变换矩阵)
问问题
816 次
1 回答
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 (计算着色器,甚至在 SM 4.0 上可用,但有一些限制)上移动 BB 变换,因为 GPU 通常使用网格 VB 执行此操作。但我认为它不会给您带来出价收益。然而,稍后将碰撞检测转移到 GPU 也将是一个很好的训练。
希望它的帮助!
于 2012-10-27T21:16:09.183 回答