Враги
Мы хотим провести линию видимости между транспортным средством и каждой вершиной, где находится враг, чтобы решить обнаружил нас враг или нет. Чтобы избежать эффекта откровенной 'дискретизации' ('зазубренности'), будем нуждаться в суб-пиксельном точном алгоритме трассировки лучей.
Таким образом, трехмерная версия алгоритма Брезенхама рисования линии не используется для растрезации векторов дороги. С фиксированной точкой (DDA) алгоритм рисования линии взамен используется. Он очень прост; позиция в трехмерном пространстве сохраняется как число с фиксированной запятой и используется другая фиксированная точка трехмерный 'инкрементор' (шаг увеличения) для того чтобы пройти маленькими шагами по линии. На каждом шаге, выполняется проверка на видимость, выше мы или ниже видимого уровня местности в этой точке. Уровень местности вычисляется, используя билинейную интерполяцию из четырех соседних высот и пикселов растра местности как иллюстрируется на рисунке 13. Для лучшей точности, длина шага должна быть выбрана такой же как, или меньше, чем размер пиксела.
Рисунок 13 - Пример билинейной интерполяции поверхности на сетке 4x4-вершины
Это вычисление может быть отнимает большего всего времени в этом алгоритме. Следовательно, мы не хотим делать это, если это не абсолютно необходимо. Таким образом, мы не делаем вычисление пока необходимо и используем флаг атрибута, bHaveVisCalc, для того чтобы проверить, вычислили ли мы предварительно это для данной вершины. Если нет, то мы вычисляем это и сохраняем результат в другом атрибуте флага, bVisible. Эта 'ленивая' оценка может быть отмечена, как форма запоминания см. [CORM90] стр.312.
Наземная высота сохраняется в другом атрибуте, wHeight. 16 битное значение должно быть достаточно для нашей планеты (гора Эверест на 8848 м выше уровня моря). К наземной высоте добавлены специфические 'визуальные' высоты в зависимости от типа местности (выполненные через таблицу, конечно). Тип местности был уже сохранен в cTerrainType атрибуте.
5.2.3