这是我的问题。
我的游戏,有效渲染和碰撞分为区域。 每个区域中将有许多将动态移动的对象。当他们移动时,我需要一种方法来快速确定他们所在的区域。
对象永远不会比某个区域更长或更宽。因此,它永远不会超过4个地区。
棘手的部分是对象的矩形是使用2D中的单独轴定理的Oriented Bounding Box,因此它们可以旋转。
我想到的主要方法是确定每个点的区域:
static public int colFromPos(float startX,float width, float x)
{
x -= startX;
return (int)Math.floor(x / width);
}
static public int rowFromPos(float startY,float height, float y)
{
y -= startY;
return (int)Math.floor(y / height);
}
这似乎很快。
我想过几种方法可以这样做:
- 我生成一个OBB的边界矩形,找到这个矩形的4个区域。这里的缺点是必须进行进一步的测试 完成以确定对象是否真的在。
- 我确定每个角落的区域和OBB的每个中点。
醇>
有更好,更快的方法吗? 我的解决方案中的任何一个都是好主意吗?
由于
答案 0 :(得分:0)
确定包含OBB每个顶点的区域。
如果所有四个都在同一地区,请返回该地区。
如果所有四个区域都位于共享X坐标或共享Y坐标的一对区域中,则返回该区域。
如果它们位于四个不同的区域,则返回该组四个区域。
如果这些条件都不适用,则您有两个不同的X区域坐标和两个不同的区域Y坐标,定义了一组在单个顶点会合的四个区域,V。
如果V在OBB内部,则返回所有四个区域。
如果V在OBB之外,且OBB顶点在三个不同的区域,则返回这三个区域。
其余情况是一对对角相邻的区域包含OBB的顶点,而V在OBB之外。选择连接不在同一区域中的顶点的OBB的一侧。返回包含两个顶点的区域,以及该线穿过的第三个区域。
我没有解决例如V恰好位于OBB的一侧。处理这些案件取决于计划惯例。