{
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} ;