这是我的问题。
我的游戏,为了高效的渲染和碰撞被分为多个区域。
每个区域将有许多对象动态移动。当它们移动时,我需要一种快速确定它们所处区域的方法。
一个物体永远不能比一个区域长或宽因此它不能同时出现在4个以上的区域。
棘手的部分是,对象的矩形是定向包围盒使用分离轴定理在2D,因此它们可以旋转。
我想到的主要方法是确定每个点的区域:

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的每个角和每个中点的区域。
有没有更好更快的方法来解决这个问题?
我的两个解决方案都是好主意吗?
谢谢

最佳答案

确定包含OBB的每个顶点的区域。
如果四个区域都在同一个区域中,则返回该区域。
如果四个区域都在一对共享X坐标或共享Y坐标的区域中,则返回该对区域。
如果它们在四个不同的区域中,则返回该组四个区域。
如果这些条件都不适用,则有两个不同的区域x坐标和两个不同的区域y坐标,定义一组在单个顶点v处相交的四个区域。
如果V在OBB内,则返回所有四个区域。
如果V在OBB之外,并且OBB顶点位于三个不同的区域中,则返回这三个区域。
另一种情况是,一对对角邻接区域包含obb的顶点,而v在obb之外。拾取OBB的一个边,该边连接不在同一区域中的顶点。返回包含两个顶点的区域,以及直线交叉的第三个区域。
我还没有讨论过,例如,v是完全站在obb一边的问题。这些案件的处理取决于程序约定。

10-07 22:18