Алгоритм обнаружения столкновений я вижу такой:
Исходные данные:
1. Вектор скорости персонажа
2. Высота персонажа
3. Радиус персонажа
4. Номер зоны в каторой находится персонаж
5. Треугольники, принадлежащие зоне (треугольник описан координатами вершин и вектором нормали к поверхности)
Алгоритм:
1. Вычисляем проверяемое положение персонажа из текущего положения и вектора скорости
2. Проверяем вычисленное положения на столкновения с поверхностями, а именно:
2.1. На плоскости XY находим треугольники зоны, которые пересекают окружность персонажа
2.2. В пространстве находим пересечения цилинда персонажа с поверхностью треугольников, которые на этапе 2.1 пересекали окружность.
2.3. Если на этапе 2.2 поверхность пересекает цилиндр, то вычисляем разницу координаты Z двух положений (текущего и проверяемого)
2.4. Если разница координаты Z больше определенного значения, то движение в этом направлении невозможно, иначе проверяемое положение становится текущим и переходим к этапу 1.
Приблизительно так.
Реализация на C++ есть на сайте
Geometric Tools
Нет только пересечения окружности с треугольником, но есть пересечение окружности с линией, его можно взять за основу.