Re: Поверхность вращения и OpenGL
От: GunVan  
Дата: 11.01.05 12:59
Оценка:
Здравствуйте Все! Вот что получилось насчет сабжа:

GV>Подскажите как нарисовать при помощи OpenGL поверхность вращения, есть параметрические уравнения для координат x(t),y(t)? Надо вращать вокруг оси 0Y, с дальнейшей целью раскрасить и вращать получившуюся картинку(по нажатию клавиш).(пишу на С++,простое приложение без использования WinAPI и MFC)

Еще раз повторюсь человек я начинающий! принимаются замечания и предложения по улучшению и оптимизации, если такие возникнут буду рад!
#include <GL/glut.h>
#include <math.h>
#include <iostream.h>
#define PI (3.1415926)
//const GLfloat Pi=PI;//=acos(-1);
GLfloat T=2;//параметр сферы
double delta_t=0.1,delta_r=0.1;//шаги изменения
double ANGLE0=0.0,ANGLE1=2*PI;//отрезок изменения угла поворота
double T0=-2*PI,T1=2*PI;//отрезок изменения параметра t для сл1
double route_y=0;
double route_z=0;
double route_delta=0.5;
//----------------------------------------------------------------
//сл1
double xx(double t)
{

if(t==0) return T;
else
return 2*T*sin(t/2)/t;
}
//----------------------------------------------------------------
double yy(double t)
{

if(t==0) return 0;
else
return T*T*(t-sin(t))/(2*t*t);
}
//----------------------------------------------------------------
double xn(double t)
{

if(t!=0) return T*cos(t/2)/t-2*T*sin(t/2)/(t*t);
else return 0;
} // Производная xx(t)
//----------------------------------------------------------------
double yn(double t)
{

if(t!=0) return T*T*(1-cos(t))/(2*t*t) — T*T*(t-sin(t))/(t*t*t);
else return T*T/12;
} // Производная yy(t)

//----------------------------------------------------------------

bool Normalization(double &x,double &y,double &z)
{
double len;
if((x==0) &&(y==0) &&(z==0)) return false;
len=sqrt(x*x+y*y+z*z);
x=x/len;
y=y/len;
z=z/len;
return true;
}
//----------------------------------------------------------------
void resize(int w,int h)
{


glViewport(0,0,w,h);
glMatrixMode( GL_PROJECTION );
glLoadIdentity();
glOrtho(-6,6, -6,6, 0,12);
gluLookAt( 7,0,0, 0,0,0, 0,-1,0 );
glMatrixMode( GL_MODELVIEW );
glLoadIdentity();

}
//----------------------------------------------------------------
void init(void)
{

GLfloat ambient[] = { 0.0, 0.0, 0.0, 1.0 };
GLfloat diffuse[] = { 1.0, 1.0, 1.0, 1.0 };
GLfloat specular[] = { 1.0, 1.0, 1.0, 1.0 };

GLfloat lmodel_ambient[] = { 0.4, 0.4, 0.4, 1.0 };
GLfloat local_view[] = { 0.0 };

GLfloat position[] = { 0.0, 3.0, 2.0, 0.0 };
GLfloat position1[] = { 0.0, -3.0, -2.0, 0.0 };


glEnable(GL_DEPTH_TEST);// для работы алгоритма z-буфера
glEnable(GL_COLOR_MATERIAL);

glClearColor(1,1,1,1);

glShadeModel(GL_SMOOTH);

glLightfv(GL_LIGHT0, GL_AMBIENT, ambient);
glLightfv(GL_LIGHT0, GL_DIFFUSE, diffuse);
glLightfv(GL_LIGHT0, GL_SPECULAR, specular);

glLightfv(GL_LIGHT0, GL_POSITION, position);

glLightfv(GL_LIGHT1, GL_AMBIENT, ambient);
glLightfv(GL_LIGHT1, GL_DIFFUSE, diffuse);
glLightfv(GL_LIGHT1, GL_SPECULAR, specular);

glLightfv(GL_LIGHT1, GL_POSITION, position1);


glLightModelfv(GL_LIGHT_MODEL_AMBIENT, lmodel_ambient);
glLightModelfv(GL_LIGHT_MODEL_LOCAL_VIEWER, local_view);
glLightModeli(GL_LIGHT_MODEL_TWO_SIDE,GL_TRUE );
glEnable(GL_LIGHTING);
glEnable(GL_LIGHT0);
glEnable(GL_LIGHT1);

}
//----------------------------------------------------------------
void display()
{

GLfloat no_mat[] = { 0.0, 0.0, 0.0, 1.0 };
GLfloat ambient[] = { 0.7, 0.7, 0.7, 1.0 };
GLfloat diffuse[] = { 0.1, 0.5, 0.8, 1.0 };
GLfloat specular[] = { 1.0, 1.0, 1.0, 1.0 };

GLfloat shininess[] = { 70.0 };
GLfloat mat_emission[] = {0.3, 0.2, 0.2, 0.0};


double t,ang;


glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );

glMaterialfv(GL_FRONT_AND_BACK, GL_AMBIENT, ambient);
glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, diffuse);
glMaterialfv(GL_FRONT_AND_BACK, GL_SPECULAR, specular);
glMaterialfv(GL_FRONT_AND_BACK, GL_SHININESS, shininess);
glMaterialfv(GL_FRONT_AND_BACK, GL_EMISSION, no_mat);



glRotated(route_y,1,0,0 );
glRotated(route_z,0,0,1 );

glPushMatrix();
glColor3d(1,0,0);

double x,y,z;
double nx,ny,nz;
double curcos,cursin,curx,cury,curderx,curdery,curxst,curyst,curderxst,curderyst;

glBegin(GL_TRIANGLE_STRIP);//полоса из треугольников

for(t=T0;t<=T1;t+=delta_t)
{
curx=xx(t);//значение xx(t) в текущей точке t
cury=yy(t);//значение yy(t) в текущей точке t
curderx=xn(t);//значение xn(t) в текущей точке t
curdery=yn(t);//значение yn(t) в текущей точке t
if(t+delta_t<=T1)
{
curxst=xx(t+delta_t);//значение xx(t+delta_t) в текущей точке t
curyst=yy(t+delta_t);//значение yy(t+delta_t) в текущей точке t
curderxst=xn(t+delta_t);//значение xn(t+delta_t) в текущей точке t
curderyst=yn(t+delta_t);//значение yn(t+delta_t) в текущей точке t
}
else
{
curxst=xx(T1);
curyst=yy(T1);
curderxst=xn(T1);
curderyst=yn(T1);
}

for(ang=ANGLE0;ang<ANGLE1;ang+=delta_r)
{
curcos=cos(ang);
cursin=sin(ang);

x=curx*curcos;
y=cury;
z=curx*cursin;

nx=curderx*curcos;
ny=curdery;
nz=curderx*cursin;
Normalization(nx,ny,nz);
glNormal3d(nx,ny,nz);
glVertex3d(x,y,z);

x=curxst*curcos;
y=curyst;
z=curxst*cursin;

nx=curderxst*curcos;
ny=curderyst;
nz=curderxst*cursin;

Normalization(nx,ny,nz);
glNormal3d(nx,ny,nz);
glVertex3d(x,y,z);

}
ang=ANGLE1;
curcos=cos(ang);
cursin=sin(ang);

x=curx*curcos;
y=cury;
z=curx*cursin;

nx=curderx*curcos;
ny=curdery;
nz=curderx*cursin;

Normalization(nx,ny,nz);
glNormal3d(nx,ny,nz);
glVertex3d(x,y,z);

x=curxst*curcos;
y=curyst;
z=curxst*cursin;

nx=curderxst*curcos;
ny=curderyst;
nz=curderxst*cursin;

Normalization(nx,ny,nz);
glNormal3d(nx,ny,nz);
glVertex3d(x,y,z);

}

glEnd();

glutSwapBuffers();
glPopMatrix();

}
//----------------------------------------------------------------

void keys(unsigned char key, int x, int y)
{
switch (key)
{
case 'u':route_y=route_delta;break;
case 'd':route_y=-route_delta;break;
case 'l':route_z=route_delta;break;
case 'r':route_z=-route_delta;break;
case 'o':route_y=0; route_z=0;break;
}
}
//----------------------------------------------------------------

void main()
{

glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH);
glutInitWindowSize(600, 600);
glutCreateWindow( "Surface of rotation" );
init();
glutIdleFunc(display);//Функция простоя
glutDisplayFunc(display);
glutReshapeFunc(resize);
glutKeyboardFunc(keys);
glutMainLoop();
}

//---------------------------------------------------------------------------


— Сильнее любви, богатства и власти —
время. Праздник жизни прекрасен. Но наступает час, и с самой лучшей
компанией приходится расставаться...
Простите что-то скрипты не сработали, поэтом текст не раскрашен, как можно было при помощи [ccode]
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.