13. Элементы виртуальной реальности убедиться в правильности этих формул, а также и в том, что их использование в этом месте оправданно - они обеспечивают большую точность.
Замечание. Ряд современных процессоров (Pentium, Pentium Л, Pentium III, PowerPC) отличаются специальной оптимизаций операций с вещественными числами, поэтому для этих процессоров использование вещественных чисел может оказаться более предпочтительным.
Следующим шагом будет использование текстур. Для этого назначим каждой стене картинку некоторого фиксированного размера (удобно если этот размер будет являться степенью двух). В следующем примере будем считать, что размер картинки равен 128 на 128 пикселов.
В общем случае задача перспективного проектирования текстуры является нелинейной и требует два деления на каждый пиксел (см. далее).
Рассмотрим сначала простейший частный случай: стена параллельна экрану. Тогда, как несложно заметить, все изображение просто равномерно сжимается/растягивается. Этот случай практически не требует никаких делений - можно, например, использовать алгоритм Брезенхейма.
В общем случае, когда стена не параллельна экрану, любой столбец пикселов экрана (вертикальный отрезок картинной плоскости) соответствует вертикальному отрезку на стене и тем самым параллелен этому отрезку. Отсюда следует, что отображение отрезка пикселов на стене в соответствующий отрезок пикселов на картинной плоскости будет растяжением (сжатием).
Таким образом, для построения текстурированной проекции стены для каждого столбца пикселов на экране следует определить соответствующий столбец пикселов текстуры и смасштабировать его до требуемого размера, для чего необходимо найти расстояние t от точки пересечения до угла клетки. Так как стены параллельны координатным осям, то в качестве этого расстояния выступает у mod h для пересечения с вертикальной стеной и х mod h для пересечения с горизонтальной стеной. Обратите внимание на рис. 13.7. Для наблюдателя, находящегося в точке А, самый первый (левый) луч попадает в угол клетки и для него t = 0. Для наблюдателя в точке В самый первый луч даст значение t - h. Тем самым наблюдатель увидит изображение, перевернутое слева направо. А чтобы оба наблюдателя увидели одно и то же изображение, можно в зависимости от величины угла наблюдения "перевернуть" 1, т. е. заменить его на h -1.