【发布时间】:2017-01-27 11:35:36
【问题描述】:
我正在使用一个碰撞检测系统 Binary Space Partitioning Tree。我有两种对象:
- 需要检查与其他对象碰撞的动态对象(角色、射弹),
- 静态对象(如墙壁)不会相互碰撞测试,但只能针对动态对象进行测试。
为此,我使用了两种数据结构:用于存储所有动态对象的列表,以及包含所有对象(动态或静态)的 BSP 树。因此,每个动态对象都存储在两个结构中。
最后,我通过遍历列表并使用树来测试每个对象来执行碰撞检测,如下所示:
foreach(DynamicObject dynobj in myListOfDynamicObjects)
{
//check the collision against every close dynamic or static objects
myBSPtree.CheckCollision(dynobj);
}
然而,在这一点上,我没有想到:两个动态对象之间的每次碰撞检查都会进行两次。例如:
\ 动态对象列表:{dynA, dynB} 树:dynA / \ 静态1动态B组合测试:
-
dynA - dynA(处理无用的情况) - dynA - 静态1
- dynA - dynB
- dynB - dynA(同上)
- dynB - 静态1
dynB - dynB
为了跳过无用的检查,我想在每个对象上添加一个属性 Order :它将是对象构造时给出的唯一标识符,并像这样使用:
if(dynA.Order < dynB.Order){ CheckCollision(dynA,dynB); }
这样,每个对象组合只进行一次碰撞检查。
我的问题是:如果这种技术是正确的(我的意思是它是一个好的设计吗?),并且由于每个对象在 C# 中都有一个唯一的引用,我可以像这样直接比较它们的引用吗:(?)
if(dynA.Reference < dynB.Reference){ CheckCollision(dynA,dynB); }
我们可以使用 object.ReferenceEquals 来查看两个引用是否相等,但是我们可以对这些引用进行实际比较吗?
【问题讨论】:
-
你的方法对我来说似乎很合理。你甚至可以使用
GetHashCode() method(但是为了处理哈希冲突,检查还应该包括相等性)。您始终可以生成一个唯一标识符,但我不确定您的情况是否有必要。
标签: c# tree collision-detection bsp-tree