代码之家  ›  专栏  ›  技术社区  ›  mauris

使用vector2-xna系列创建形状

  •  3
  • mauris  · 技术社区  · 15 年前

    在XNA游戏中,我需要根据二维空间中的几个vector2坐标定义一个不规则形状。原因是做碰撞检查(比如 Rectangle.Intersects() )

    例如:

    Vector2 point1 = new Vector(20,30);
    Vector2 point2 = new Vector(60,30);
    Vector2 point3 = new Vector(60,80);
    Vector2 point4 = new Vector(40,90);
    Vector2 point5 = new Vector(20,80);
    

    将创建一个具有路径的形状 point1 -gt; point2 -gt; point3 -gt; point4 -gt; point5 然后回到 点1 .

    但是,我找不到合适的解决方案来实现这一点。请帮忙。谢谢。

    2 回复  |  直到 15 年前
        1
  •  2
  •   Lisa    15 年前

    对于你想做的事情,有几种不同的方法。你提到过碰撞检测:你想确定一个点是否与形状相交,还是想确定两个多边形是否相交?

    如果你想要一个点,你要找的是所谓的“点在多边形测试”。有许多不同的方法,但最快和最直接的方法之一是射线测试。从点创建光线,并计算它穿过边缘的次数。如果数字是偶数,则该点位于外部。如果很奇怪的话,关键就在里面。

    你可以在这里找到一篇好文章: http://www.ecse.rpi.edu/Homepages/wrf/Research/Short_Notes/pnpoly.html

    本文中的代码实现如下所示:

    int pnpoly(int nvert, float *vertx, float *verty, float testx, float testy)
    {
      int i, j, c = 0;
      for (i = 0, j = nvert-1; i < nvert; j = i++) {
        if ( ((verty[i]>testy) != (verty[j]>testy)) &&
         (testx < (vertx[j]-vertx[i]) * (testy-verty[i]) / (verty[j]-verty[i]) + vertx[i]) )
           c = !c;
      }
      return c;
    }
    

    确定两个多边形是否相交更为复杂,但并非完全不同。很多游戏实际上只是检查多边形的角点,用点在多边形中是容易和便宜的,但也可以检查完整的交叉点。

    一种方法是将每个边视为一个分割平面/半空间。半空间的相交决定了两个多边形是否相交。

    尝试寻找“分离轴定理”。

        2
  •  0
  •   Peter Lillevold Rene    15 年前

    Ziggyware(原名www.ziggyware.com)有一个关于二维多边形碰撞检测的教程,但ZW似乎正在搬往新家。 Here's a video 不过,教程的外观如何。