Удалите компонент скорости вдоль нормали треугольника.
Идея состоит в том, что вы можете представить движение как часть, которая движется "в" треугольник и остаток (который будет в перпендикулярных направлениях). Если вы просто двигаетесь с остатком, вы больше не будете приближаться к треугольнику при движении (или дальше, но в этом случае вам не следует обнаруживать столкновение).
В псевдокоде:
// v := velocity vector of moving object
// p[3] := points that make up the triangle
triangle_normal = cross(p[2]-p[0], p[1]-p[0])
problematic_v = project(v, onto=triangle_normal)
safe_movement = v - problematic_movement
Обратите внимание, что это намеренно не сохраняет величину вектора движения, так как это заставит вас очень быстро скользить вдоль стены при беге прямо на нее.
Для получения более подробной информации и некоторых красивых картинок см. Уроки в Зале бассейна: Быстрое, точное обнаружение столкновений между кругами или сферами в Гамасутре Вы не используете сферы, но, по сути, вы делаете идеально пластичное (так как вы не отскакиваете) столкновение.