//Функция, вызываемая по сообщению WM_SIZE
void resize(int width.int height)
{
Client.right - width; Client.bottom - height: glVi ewport(0.0.wi dth,hei ght): }
//Функции рисования
void DrawRectCUSEVERTEXl *Setka)
{
g1 Beg i n(GL_TRIANGL E_FAN );
glNorma!3d( Setka[0].Nx.Setka[0].y. Setka[0].z ):
glVertex3d( Setka[0].x. Setka[0].y. Setka[0].z ):
glNorma!3d( Setka[l].Nx.Setka[l].Ny.Setka[l].Nz):
glvertex3d( Setka[l].x. Setka[l].y. Setka[l].z );
glNorma!3d( Setka[2].Nx.Setka[2].Ny.Setka[2].Nz):
glVertex3d( Setka[2].x. Setka[2].y. Setka[2].z ):
glNorma!3d( Setka[3].Nx.Setka[3].Ny.Setka[3].Nz):
glVertex3d( Setka[3].x. Setka[3].y. Setka[3].z );
glEndO;
}
void DrawO {
extern float pos[4];//W - 0 - источник бесконечно далеко
extern float dir[3];
glLightfv(GL_LIGHT0. GL_P0SITI0N. pos):
glLightfv(GL_LIGHT0. GL_SPOT_DIRECTION. dir);
//Если установили свет в Init - источник неподвижно висит в мире
glClearColor(0.9f.0.9f.0.9f.0.0f);
glClearDepth(l.O);
glClear( GL_COLOR_BUFFER_BIT |GL_DEPTH_BUFFER_BIT ); glShadeModel (GLJLAT);
Отображение трехмерной сцены
glEnable(GL_DEPTH_TEST);
glVi ewport(0.0.Cli ent.ri ght.Cli ent.bottom);
glColor3d(0.6.0.6.0.5):
DrawRectC SetkaGran); //Дорога.
glCo1or3d(0.0,1.0.0.0); //Две грани земли.
DrawRectC SetkaGranl);
DrawRectC SetkaGran2);
for(int i - 7;i>-0;i--) //Здания {
g1 Beg i n(GL_JRIANGL E_STRIP ); glColor3d(0.6.0.6.0.7); forCint j - 0:j<10:j++) //Грани дома {
glNormal3d(SetkKub[IndexKubl[j]].Nx. SetkaKub[IndexKubl[j]].Ny.
SetkaKub[IndexKubl[j]].Nz); glVertex3d(Ekzmpl0bj[i].Pos[0]+
SetkaKub[IndexKubl[j]].x.EkzmplObj[i].Pos[l]+ SetkaKub[IndexKubl[j]].y.Ekzmpl0bj[i].Pos[2]+ SetkaKub[IndexKubl[j]].z):
}
glEndO; }
glFinishO;
SwapBuffers(wglGetCurrentDCO) ; }
Рассмотренный проект выводит сцену в виде освещенных параллелепипедов. Используя изученный материал, можно при помощи наложения текстур превратить элементы сцены в здания, показанные на рис. 24.4.
Формирование стереоизображений Общие сведения При работе со стереоустройствами необходимо сформировать два изображения, соответствующие наблюдению сцены левым и правым глазом. Для этого нельзя пользоваться выведенными ранее матрицами. Они получены в предположении, что пирамида видимости симметрична и наблюдатель смотрит в центр окна. В данном случае центры проецирования смещены вдоль оси X, поэтому должна использоваться матрица, аналогичная той, что приведена в справке к функции д1 Рп^итпС). Впрочем, вместо этого можно использовать саму функцию д1 Гги$т:ит().