检查边界框是否与视图视锥相交/碰撞

2024-10-01 07:21:10 发布

您现在位置:Python中文网/ 问答频道 /正文

我想对照一些对象的轴对齐边界框检查一个视锥,粗略检查这些对象是否在视野内。速度不是什么大事。在


Tags: 对象速度边界视野粗略视锥
2条回答

我发现,建立视锥体的世界空间模型并检查与它的bbox碰撞是错误的。

一个更简单的方法是反其道而行之,将给定bbox的每个顶点转换为屏幕空间,如果bbox的任何顶点在屏幕边界内,则将该bbox视为可见。我通过乘以摄像机矩阵得到屏幕空间位置,然后根据摄像机的视场计算透视。

代码如下:

vertexMatrix = matrix([vertex.x,vertex.y,vertex.z,1]) 
productMatrix = (vertexMatrix * camMatrix)
pVectSS = vector(prodMatrix[0][0],prodMatrix[0][1],prodMatrix[0][2])

pointX = ((pVectSS.x/(-pVectSS.z))/tan(radians(hFOV/2)))/2.0+.5
pointY = ((pVectSS.y/(-pVectSS.z))/tan(radians(vFOV/2)))/2.0+.5

密钥:

^{pr2}$

那就行了。然而,通常人们宁愿提取截头平面并计算到这些平面的距离。你说过“速度不是什么大不了的”,但最终你会发现其实如此。毕竟,一个人做截锥剔除是为了让事情更快。在

将一个顶点与一个矩阵相乘需要相当于4个点积,因此您需要相当于32个点积来检查所有8个角点。计算一个点到一个平面的距离需要一个点积和一个加法,在最坏的情况下效率会更高,在一般情况下效率会更高(因为通常可以在一个或两个平面之后剪切对象,并且永远不会超过三个平面)而放弃该对象。对于剪辑平面,有许多利用临时一致性的优化,我将不深入讨论。在

此外,还可以通过计算中心点到平面的距离并检查该距离是否大于边界框的半径来预先进行一些粗略消隐。这将剔除那些明显是“输入”或“输出”的对象,而且成本非常低。或者,你可以将你的视场矢量的点积与视场值的余弦值加上一些“填充”(或者,只是看看它是否为正)作为第一个超粗检查。你会记得,两个向量的点积告诉你它们指向同一方向的程度。与你的视图向量有负点积的东西当然是你可以安全地丢弃的东西,因为它就在你身后。在

相关问题 更多 >