Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Андрэ Ламот - Програмирование игр.doc
Скачиваний:
16
Добавлен:
01.07.2025
Размер:
6.81 Mб
Скачать

Вычисление оставшихся пересечений

После того как мы нашли первое пересечение для вертикальной и горизонтальной стены, можно найти следующую точку возможного пересечения — достаточно прибавить константы к текущей точке пересечения. Например, если координата Yi пересечения равна 100, то следующая точка Yi может быть рассчитана простым прибавлением числа 100.

В нашем случае каждая ячейка имеет размеры 64х64, и чтобы найти следующее пересечение мы используем следующие формулы:

Формула 6.4. Вычисление Х-координаты следующего возможного пересечения.

Следующее Xi = Xi + М х (ширина ячейки)

Формула 6.5. Вычисление Y-координаты следующего возможного пересечения.

Следующее Yi = Yi + М х (высота ячейки)

где высота и ширина ячейки равна 64.

Это не так плохо: вычисление следующего возможного пересечения требует двух умножений и двух сложений. Помните, отсечение лучей должно выполняться максимально быстро, а иначе в нем нет смысла.

После вычисления следующей возможной точки мы проверяем, есть ли там что-то на самом деле. Если есть, то мы вычисляем дистанцию до этого пересечения. Дистанция используется позже, для трехмерного рендеринга. Если же пересечения нет, то мы продолжаем отсечение.

Вычисление расстояния

Теперь, когда мы нашли пересечение с объектом, встает вопрос о том, как вычислить расстояние до него. Поскольку мы нашли точку пересечения, то можем найти и расстояние от этой точки до позиции игрока. Это расстояние нам нужно для двух вещей:

  • Чтобы узнать тип пересечения (вертикальное или горизонтальное);

  • Чтобы выяснить масштаб стен.

Формула 6.6. Теорема Пифагора.

Мы можем использовать для этого теорему Пифагора;

Н =sqrt (х2 + у2)

Это прекрасная формула, но ужасно сложная для ПК, поскольку вычисление квадратного корня — процесс весьма медленный и долгий. Мы, конечно, можем использовать табличное представление функции квадратного корня, но и в этом нет ничего хорошего. Есть другой, более простой способ найти удаление точки пересечения от игрока, если вычислить координаты точек и найти sin © и cos ©.

Давайте посмотрим на рисунок 6.26.

Поскольку мы уже вычислили точки вертикального и горизонтального пересечения, мы можем воспользоваться известным правилом, чтобы найти синус и косинус угла наклона:

  • Угол наклона луча (он у нас есть);

  • Длина гипотенузы (мы ее хотим найти);

  • Длина сторон треугольника (который мы имеем).

Назвав переменные так же, как они обозначены на рисунке 6.26, напишем формулы для вычисления длины- гипотенузы (или, что то же самое - искомого расстояния).

Формула 6.7. Вычисление расстояния до точки Х-пересечения.

расстояние = (Xi - Хр) х cos-1 A

Формула 6.8. Вычисление расстояния до точки Y-пересечения.

расстояние = (Yi - Yp) x sin-1 A

где А - это угол луча, который рассматривается в настоящее время. В программе это просто индекс от 0 до 1920 для таблицы вычисленных значений sin-1 и cos-1.

Это может показаться громоздким, но если это правильно написать и оптимизировать, то процесс будет занимать несколько миллисекунд. После того как расстояние будет вычислено, встает вопрос, что ближе, а что дальше на экране.