crypt of decay - GJK и sweep tests [entries|archive|friends|userinfo]
ketmar

[ userinfo | ljr userinfo ]
[ archive | journal archive ]

GJK и sweep tests [Jun. 7th, 2017|10:41 am]
Previous Entry Add to Memories Tell A Friend Next Entry
[Tags|]

в продолжение темы GJK: я, конечно, подумал, что оно может быть применимо для sweep tests. это тесты типа: «есть два стула конвекса, один из них пиздошит с какой-то линейной скоростью, когда эта ебанина столкнётся?» применимо, очевидно, в continuous collision detection.


так вот. в принципе, свип-тесты такого типа делаются через всё ту же minkowski difference: путём минковски-вычитания одного конвекса из другого мы получаем отличный расклад: распухший конвекс и точку. а дальше задача упрощается до простого рэйкаста.

вот эта статья нам расскажет, как делать рэйкаст на GJK (для чего только его ни применяют!).

как обычно, шаг выкидивания точки из симплекса в статье хуйпроссышь, но он очень простой:
    // here, `a` and `b` are current simplex points; for other things, read the fuckin' paper!
    if (a.valid) {
      if (b.valid) {
        VT p1 = x.projectToSeg(a, p);
        VT p2 = x.projectToSeg(p, b);
        if (p1.distanceSquared(x) < p2.distanceSquared(x)) {
          b = p;
          distsq = p1.distanceSquared(x);
        } else {
          a = p;
          distsq = p2.distanceSquared(x);
        }
        VT ab = b-a;
        VT ax = x-a;
        v = ab.tripleProduct(ax, ab);
      } else {
        b = p;
        VT ab = b-a;
        VT ax = x-a;
        v = ab.tripleProduct(ax, ab);
      }
    } else {
      a = p;
      v = -v;
    }

тут всё настолько уже очевидно, что расшифровывать не надо; весь остальной код транслируется прямиком из статьи.

а теперь все скинулись мне по три рубля за то, что я опять рассказал вам про очередную вам ненужную хуйню.
Linkmeow!