break;
case DOWN: x -= vx; У -= vy; break;
case ESC: done =1; break; .
}
}
}
float totalTime = ( clock () - start) / CLKJCK; setVideoMode (0x03 );
printf ("\nFrames rendered : %ld\ totalFrames );
printf ("\nTotal time ( sec ) : %7.2f\ totalTime );
printf ("\nFPS : %7.2f, totalFrames / totalTime );
}
После перехода к числам с фиксированной точкой и ряда оптимизаций процедура drawV/ew принимает следующий вид:
// Phragment of Floor3.cpp void drawView ()
{
char far * videoPtr = screenPtr + 100*320; long widthMask = MAKELONG ( pic -> width -1, OxFFFF );
long heightMask = MAKELONG ( pic -> height -1, OxFFFF );
int widthShift = getShift ( pic -> width );
char * picData = pic -> data;
total Frames++;
drawSky ();
for (int row = 0; row < 100; row++ ) {
Fixed dist = ( H * distTable [row]) » 8;
Fixed uO = (locX + dist * ( cosine ( angle ) » 8 )) & widthMask; Fixed vO = (locY + dist * ( sine ( angle ) » 8 )) & heightMask; Fixed du =( dist * CSinTable [angle » 6]) » 8; Fixed dv = (-dist * CCosTable [angle » 6]) » 8; Fixed u = uO; Fixed v = vO;
Компьютерная графика. Полигональные модели
videoPtr += 160;
for (int col = 159; col >= 0; col- ) {
* videoPtr- = picData [fixed2lnt ( u ) +
(fixed2lnt ( v ) « widthShift)];
u = ( u - du ) & widthMask; v = ( v - dv ) & heightMask;
}
videoPtr += 160;
for ( col = 160, u = uO, v = vO; col < 320; col++ ) {
u = ( u + du ) & widthMask; v = ( v + dv ) & heightMask;
videoPtr++ = picData [ fixed2lnt ( u ) + (fixed2lnt ( v ) « widthShift) ];
}
}
}
13.3. DOOM
Одной из самых серьезных и известных игр, сделанных в стиле виртуальной реальности, является игра DOOM, которая прочно заняла ведущие места в рейтингах самых популярных игр сразу же после своего выхода.
Игра была революционной в целом ряде аспектов, сочетая в себе сложную геометрию сцены, текстурирование горизонтальных поверхностей и многое другое, продемонстрировав трехмерную графику, невиданную ранее на персональных компьютерах.