{

float xx=x*m[0]+y*m[l]+z*m[2]+m[3]; float yy=x*m[4]+y*m[5]+z*m[6]+m[7]; float zz=x*m[8]+y*m[9]+z*m[10]+m[ll]; x=xx;y=yy;z=zz;

}

// умножение на матрицу, элементы по столбцам void mul_matrc(float*m)

{

float xx=x*m[0]+y*m[4]+z*m[8]+m[12]; float yy=x*m[l]+y*m[5]+z*m[9]+m[13]; float zz=x*m[2]+y*m[6]+z*m[10]+m[14]; x=xx;y=yy;z=zz;

)

// различные операторы operator float*() {return (float*)this;} void operator=(const Vertex& a) {set(a);}

// умножение вектора на число Vertex operator*(float a)

{Vertex temp(*this);temp.mul(a);return temp;} // деление вектора на число Vertex operator/(float a)

{Vertex temp(*this);temp.div(a);return temp;} void operator+=(Vertex&a) {add(a);}

void operator-=(Vertex&a) {sub(a);}

void operator*=(float a) {mul(a);} void operator/=(float a) {div(a);} int operator==(Vertex&a)

{return equal((float*)this,

(float*)this+3,(float*)a);}

};

Vertex operator+(const Vertexia,const Vertex&b) {return Vertex(b.x+a.x,b.y+a.y,b.z+a.z);} Vertex operator-(const Vertex&b,const Vertex&a) {return Vertex(b.x-a.x,b.y-a.y,b.z-a.z) ; } Vertex operator*(const Vertex&a,const Vertex&b) {return Vertex(b.x*a.x,b.y*a.y,b.z*a.z);} #endif

Файл model.h

Класс Models может служить дополнительной демонстрацией построения примитивов в OpenGL.

#i fndef _MODEL_

#define JmODEL_

struct Models {

// вывод массива вершин как…

void array(GLenum m,int is,int n,float*v,int nv, float*texc=0,float*norm=0,float*c=0);

// вывод треугольников с общей вершиной void trianglefan(float*v,int nv,float*texc=0, float*norm=0,float*c=0)

{array(GL_TRIANGLE_FAN,0,nv,v,nv,texc,norm,с);}

// вые-.^д треугольь;:коь

void triangles(fioat*v,int nv,float*texc=0, float*norm=0,float*c=0)

{array(GL_TRIANGLES,0,nv,v,nv,texc,norm,c);}

// вывод массива точек

void points(float*v,int nv,float*texc=0, float*norm=0,float*c=0)

{array(GL_POINTS,0,nv,v,nv,texc,norm,c);}

// вывод многоугольника

void polygon(float*v,int nv,float*texc=0, float*norm=0,float*c=0)

{array(GL_POLYGON,0,nv,v,nv,texc, norm,c);}

// вывод квадратичных поверхностей void glusphere(GLdouble r=l,int sl=30,int st=30); void glucylinder(GLdouble r=l,GLdouble h=l, int sl=30,int st=30); void gluconus(GLdouble rb=l,GLdouble h=l,

GLdouble ru=0,int sl=30,int st=30); void gludisk(GLdouble ro=l,GLdouble ri=0, int sl=30,int st=30); void glupartdisk(GLdouble ro=l,GLdouble sa=0,

GLdouble swa=360,GLdouble ri=0, int sl=30,int st=30);

// четырехугольник в плоскости XY void planeXY(float xl,float yl,float x2,float y2, float z=0,float s=l,float t=l,float*tex=0)

{

float p [ ] = { xl, yl, z, xl, y2, z, x2, y2, z, x2, yl, z } ; quads (p, 4, 0, 0, s, t, 0) ;

}

// четырехугольник в плоскости XZ void planeXZ(float xl,float zl,float x2,float z2, float y=0,float s=l,float t=l,float*tex=0)

{

float p[]={xl,y,zl,xl,y,z2,x2,y,z2,x2,y,zl}; quads (p, 4 , 0, 0, s, t, 0) ;

}

// четырехугольник в плоскости YZ

void planeYZ(float yl,float zl,float y2,float z2,

float x=0,float s=l,float t=l,float*tex=0)

{

float p[ ] = {x, yl, zl, x, yl, z2, x, y2, z2, x, y2, zl} ;


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