}
// выводим квадратичный объект gluPartialDisk(obj,ri,ro,si,st,sa, swa);
// уничтожаем квадратичный объект gluDeleteQuadric(obj) ;
}
void Models::gludisk(GLdouble ro,GLdouble ri,int si,int st)
{
GLUquadricObj *obj=gluNewQuadric(); gluQuadricNormals(obj,GLU_SMOOTH); gluQuadricTexture(obj,1); if(ro<0)
{
gluQuadricOrientation(obj,GLU_INSIDE); ro=-ro; ri=-ri;
}
gluDisk(obj,ri, ro, si, st) ; gluDeleteQuadric(obj) ;
}
void Models::gluconus(GLdouble rb,GLdouble h,
GLdouble ru,int si,int st)
{
GLUquadricObj *obj=gluNewQuadric(); gluQuadricNormals(obj,GLU_SMOOTH); gluQuadricTexture(obj,1); if(rb<0) t
gluQuadricOrientation(obj,GLU_INSIDE); rb=-rb; ru=-ru;
}
gluCylinder(obj,rb, ru, h, si, st) ; gluDeleteQuadric(obj);
}
void Models::glucylinder(GLdouble r,GLdouble h,
int si,int st)
{
GLUquadricObj *obj=gluNewQuadric() ; gluQuadricNormals(obj,GLU_SMOOTH); gluQuadricTexture(obj , 1) ; if(r<0)
{
gluQuadricOrientation(obj,GLU_INSIDE); r=-r ;
}
gluCylinder(obj,r,r,h,sl,st) ; gluDeleteQuadric(obj);
}
void Models::glusphere(GLdouble r,int si,int st) {
GLUquadricObj *obj=gluNewQuadric() ; gluQuadricNormals(obj,GLU_SMOOTH) ; gluQuadricTexture(obj , 1) ; if(r<0)
{
gluQuadricOrientation(obj , GLU_INSIDE) ; r=-r;
}
gluSphere(obj,r,si,st); gluDeleteQuadric(obj) ;
}
#endif
Файл globj.h
В классе GLobj представлен один из способов реализации камеры. Функции члены класса позволяют связать с камерой модель, источник света и спроецировать тень на указанную плоскость.
ttifndef _GLobj_
#define _GLobj_ struct GLobj
{
Vertex pos;
Vertex dir; // вектор направления движения Vertex look; // углы поворота взгляда
float da; // величина изменения поворота float ds; // величина изменения движения
// конструктор
GLobj(float _ds=0.8,float _da=0.5)
{
init(_ds,_da); pos.set(0,0,0); dir.set(0,0,0); look.set(0,0,0);
}
// инициализация
void init(float _ds=l,float _da=0.5)
{da=_da; ds=_ds;}
// позиционирование камеры
void position(float x=0,float y=0,float z=0) {pos.set(-x,-y,- z);}
// установка направления движения камеры void direction(float x=0,float y=0,float z=0) {dir.set(x,y,z);}
// установка направления взгляда камеры void looking(float x=0,float y=0,float z=0)
{look.set(x,y,z);}
// движение камеры вперед/назад void movefb(float steps=l)
{pos.move(ds*steps,dir.x,dir.y);}
// движение влево/вправо боком void movelr(float steps=l)
{pos.move(ds*steps,0,dir.y-90) ; }
// движение вверх/вниз void moveud(float steps=l)
{pos.move(ds*steps,dir.x+90, dir.y) ; }
// изменение направления движения влево/вправо void dirlr(float steps=l) {dir.y+=steps*da;}
// изменение направления движения вверх/вниз void dirud(float steps=l) {dir.x+=steps*da;}
// изменение направления взгляда влево/вправо void looklr(float steps) {look.y+=steps*da;}
// изменение направления взгляда вверх/вниз void lookud(float steps) {look.x+=steps*da;}
// преобразование в координаты камеры void transform(int i=l)
{
glRotatef(dir.x, 1, 0,0) ; і і і і ) g IRotatef (lo . х, 1, 0, 0) ; glRotatef(dir.у,0,1,0); if(i)glRotatef(look.у, 1, 0, 0) ; glTranslatef(pos.x,pos.y,pos.z-0.00 05);
}
// обратное преобразование для позиционирования void btransform(int i=l)