в продолжение темы 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;
}
тут всё настолько уже очевидно, что расшифровывать не надо; весь остальной код транслируется прямиком из статьи.
а теперь все скинулись мне по три рубля за то, что я опять рассказал вам про очередную вам ненужную хуйню.