{

glTranslatef(-pos.x,-pos.y,-pos.z-0.0005) ; glRotatef(-dir.у, 0, 1,0) ; if(i)glRotatef(-look.y,0,1,0); glRotatef(-dir.x,1,0, 0) ; if(i)glRotatef(-look.x,1,0,0);

}

// проецирование на указанную плоскость void shadow(float* plane,float lw) ;

// позиционирование источника света void lightpos(int i=0);

// обработка ввода

virtual void input(BASE_input* myin,float winw=640,

float winh=480);

// вывод модели камеры virtual void draw(int 1=0);

};

// позиционирование источника света void GLobj::lightpos(int i)

{

float ldir[]={0,0,-1}; float lpos[]={0,0,0,1}; glPushMatrix(); btransform();

glLightfv(GL_LIGHT0+i,GL_P0SITI0N,lpos); glLightfv(GL_LIGHT0 + i,GL_SPOT_DIRECTION,ldir) ; glPopMatrix();

}

// проецирование на указанную плоскость // lw - w координата камеры (источника света) void GLobj::shadow(float* plane,float lw)

{

float m[4][4]; // матрица проецирования float tmp;

pos.mul(-1);

tmp=plane[0]*pos.x+plane[lJ *pos.y+ plane[2]*pos[2]+plane[3]* Iw; m[0][0]=tmp-pos.x*plane[0]; m[l][0]=0.0-pos.x’plane[1]; m[2][0]=0.0-pos.x*plane[2]; m[3][0]=0.0-pos.x*plane[3];

m[0][1]=0.0-pos.у*plane[0]; m[1][1]=tmp-pos.y*plane[1]; m[2][1]=0.0-pos.y*plane[2]; m[3][1]=0.0-pos.y*plane[3];

m[0][2]=0.0-pos.z*plane[0]; m[l][2]=0.0-pos.z*plane[1]; m[2][2]=tmp-pos.z*plane[2]; m[3][2]=0.0-pos.z*plane[3];

m[0][3]=0.0-1w*plane[0]; m[1][3]=0.0-lw*plane[l]; m[2][3]=0.0-lw*plane[2]; m[3][3]=tmp-lw*plane[3]; glMultMatrixf((const GLfloat*)m); pos.mul(-1);

}

void GLobj::draw(int 1) // вывод модели камеры {

Models m; if (1)

{

gIPushMatrix(); btrans form(); glCallList(1); gIPopMatrix (); return;

}

// модель по умолчанию gIPushMatrix();

// рамка + направление взгляда

btransform();

glColor3f (0,1,0);

m.planeXY(-2.5,2.5,2.5,-2.5);

glColor 3 £(1,1,1); glBegin(GL_LINES); glVertex3f(0,0,0); glVertex3f(0,0, -10) ; glEnd(); glPopMatrix(); glPushMatrix() ;

btransform(0); // без учета взгляда glColor3f(1,0,0); glBegin(GL_LINES);

// направление движения вперед glColor3f(1,0, 0); glVertex3f(0,0,0); glVertex3f(0,0,-10);

// направление движения вверх glColor3f(0,1,0); giVertex3f(0,0,0); glVertex3f(0,10,0);

// направление движения вбок glColor3f(0,0,1); glVertex3f(0,0,0); glVertex3f(10,0,0); glEnd(); glPopMatrix();

}

void GLobj::input(BASE_input* myin,

float winw,float winh)

{

POINT pt;

// состояние обработки ввода для камер static char instate=0;

// ESC клавиша изменяет состояние ввода от камер if(myin->vkey==VK_ESCAPE)

{

myin->vkey=-l;instate=!instate; if (instate)

{

SetCursorPos(winw/2,winh/2);

ShowCursor(0);

}

else ShowCursor(1);

}

// управление камерой if(instate)

(

if(myin->vkeys[1E'])movefb() ; if(myin->vkeys['D'])movefb(-1) ; if(myin->vkeys['S'])movelr() ; if(myin->vkeys['F'])movelr(-1) ; if(myin->vkeys['С'])moveud() ; if(myin->vkeys['V'])moveud(-1) ; if(myin->vkeys[VK_LEFT] )dirlr(-1) ; if(myin->vkeys[VK_RIGHT] )dirlr() ; if(myin->vkeys[VK_UP])dirud(-1) ; if(myin->vkeys[VK_DOWN])dirud() ; GetCursorPos(&pt);

SetCursorPos(winw/2, winh/2) ; dirlr(-(winw/2-pt.x) ) ; lookud(-(winh/2-pt.y)) ;

}

}

#endif

Файл image.h

Стандарт OpenGL не поддерживает какой-либо формат файла для хранения растровых изображений. Если у вас нет дополнительных библиотек типа GLUT, то можете воспользоваться классом IMAGE для работы с *.bmp и *.tga файлами. В дополнение там предусмотрена загрузка указанных файлов в качестве текстур и вывод в окно средствами OpenGL.


⇐ вернуться назад | | далее ⇒