{
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.