u1 += ( V_MIN - v1 )*( u2 - u1 )/( v2 - v1 ); v1 =V_MIN;
}
if ( v2 < V_MIN ) {
u2 += ( V_MIN - v2 )*(u2 - u1 )/( v2 - v1 ); v2 =V_MIN;
}
wptr -> flags = 1 ;
wptr-> d = (int)( 160 + (u1*HSCALE)M ); wptr -> c2 = (int)( 160 + (u2*HSCALE)/v2 );

13. Элементы виртуальной реальности

float Ы =VSCALE/v1; float h2 =VSCALE/v2; float dh = ( h2 - hi ) / ( c2 - d );

for (int i = wptr->c1 ;i <= wptr->c2; hi += dh ) wptr -> h [i - wptr -> c1] = hi;
}
if ( col < wptr -> c1 II col > wptr -> c2 ) return -1;
return wptr -> h [col - wptr -> c1];
}

Количество операций умножения и деления на всю стену доставляет 15, так что если средняя ширина проекции стены больше 3-4 пикселов, то этот подход оказывается заметно выгоднее. Обратите внимание на использование когерентности для вычисления высот соответствующих столбцов пикселов для соседних лучей.

Замечание. Количество операций умножения для поворота пиксела (что используется для проектирования вершин отрезка) можно сократить вдвое. Для этого для каждой вершины заранее вычисляется произведение ее координат ху, а также для угла поворота вычисляется величина

sm#>cos#> = -sm2<p.

После этого используются соотношения

ysirup - xcosp = (x + s\n<p\y-cos(p)~ xy + $\r\(pcos<py
xsincp 4- ycos<p = (x 4- cos^Xj; + sin#>)-~ xy - sin q>zosq>.

13.2. Текстурирование горизонтальных поверхностей Попытаемся изменить подход, столь успешно примененный при текстурирова-нии вертикальных поверхностей (и заключающийся в рисовании их вертикальными отрезками), для работы с горизонтальными поверхностями.

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


⇐ Предыдущая| |Следующая ⇒