Добавил:
nyan
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз:
Предмет:
Файл:ИГС / IGS_2014-2015 / Lab_04 / glopen11 / glopen11
.cpp#include <afxwin.h>
#include <gl\gl.h>
#include <gl\glu.h>
#include <gl\glaux.h>
#include <math.h>
void Draw(void);
void Redraw(void);
int FlagRotation;
int Flag = 0; //при Flag = 1 имеем полигональную модель поверхности
GLfloat alX, alY; // "угол поворота"
int Xmouse, Ymouse; //координаты мышки
void mouse_left_down(AUX_EVENTREC *event)
{
int x = event->data[AUX_MOUSEX];
int y = event->data[AUX_MOUSEY];
Xmouse = x; Ymouse = y;
Flag = 1;
}
void mouse_left_up(AUX_EVENTREC *event)
{
int x = event->data[AUX_MOUSEX];
int y = event->data[AUX_MOUSEY];
Xmouse = x; Ymouse = y;
Flag = 0;
}
void mouse_left_loc(AUX_EVENTREC *event)
{
if(event->event == AUX_MOUSELOC)
{
int x = event->data[AUX_MOUSEX];
int y = event->data[AUX_MOUSEY];
alX += x - Xmouse;
alY += y - Ymouse;
Xmouse = x; Ymouse = y;
}
}
void Key_DOWN(void)
{
FlagRotation = 3;
}
void Key_UP(void)
{
FlagRotation = 4;
}
void Key_LEFT(void)
{
FlagRotation = 1;
}
void Key_RIGHT(void)
{
FlagRotation = 2;
}
void Key_SPACE(void)
{
FlagRotation = 0;
}
void main()
{
FlagRotation = 1;
// расположение окна OpenGL на экране
auxInitPosition(100, 50, 600, 450);
// установка основных параметров работы OpenGL
// цветовой режим RGB | включение Z-буфера для сортировки по глубине | двойная буфферизация
auxInitDisplayMode( AUX_RGB | AUX_DEPTH | AUX_DOUBLE);
// инициализация окна OpenGL с заголовком
if(auxInitWindow("OpenGL Console Application "
" Rotation by mouse and arrows, Stop - SPACE ") ==GL_FALSE) auxQuit();
auxMouseFunc(AUX_LEFTBUTTON, AUX_MOUSEDOWN, (AUXMOUSEPROC)mouse_left_down);
auxMouseFunc(AUX_LEFTBUTTON, AUX_MOUSELOC, (AUXMOUSEPROC)mouse_left_loc);
auxMouseFunc(AUX_LEFTBUTTON, AUX_MOUSEUP, (AUXMOUSEPROC)mouse_left_up);
auxKeyFunc(AUX_DOWN, (AUXKEYPROC)Key_DOWN);
auxKeyFunc(AUX_LEFT, (AUXKEYPROC)Key_LEFT);
auxKeyFunc(AUX_RIGHT, (AUXKEYPROC)Key_RIGHT);
auxKeyFunc(AUX_UP, (AUXKEYPROC)Key_UP);
auxKeyFunc(AUX_SPACE, (AUXKEYPROC)Key_SPACE);
//обрабатыает сообщение на перерисование сцены
auxIdleFunc((AUXIDLEPROC)Redraw);
// регистрация функции, которая вызывается при перерисовке
// и запуск цикла обработки событий
// Draw() - функция пользователя
auxMainLoop((AUXMAINPROC)Draw);
}
//обрабатыает сообщение на перерисование сцены
void Redraw(void)
{
switch(FlagRotation)
{
case 1:
alX -= 0.5;
break;
case 2:
alX += 0.5;
break;
case 3:
alY += 0.5;
break;
case 4:
alY -= 0.5;
break;
}
Draw();
}
void Draw(void)
{
//3. установка параметров прекции
// выбор матрицы проекций в качестве текущей
glMatrixMode( GL_PROJECTION );
// загрузка единичной матрицы
glLoadIdentity();
// выбор видовой матрицы в качестве текущей
glMatrixMode( GL_MODELVIEW );
glLoadIdentity();
//включаем механизм z-буфура
glClearColor(0,0,0.5, 1.0f);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glClearDepth(1.0);
glEnable(GL_DEPTH_TEST);
// glShadeModel(GL_FLAT ); //модель закршивания - однородное закрашивание
glShadeModel(GL_SMOOTH ); //модель закршивания - модель Гуро
// RECT rc;
//коодинаты окна отправляетс в струткуру rc
// GetClientRect(hwnd, &rc);
//установка матрицы перспективной проекции
// gluPerspective(f,a,zN,zF) f-угол просмотра, a- коэффициент
//пропорциональности, zN- расстояние до ближней плоскости отсечения
// zF- расстояние до дальней плоскости отсечения
gluPerspective(65, (double)1, 3, 40);
//умножение текущей матрицы на матрицу переноса
glTranslatef(0, 0, -10);
//умножение текущей матрицы на матрицу пповорота
// glRotatef(27, 1, 0, 0);
// glRotatef(-19, 0, 1, 0);
glRotatef(27 + alY, 1, 0, 0);
glRotatef(-19 + alX, 0, 1, 0);
GLfloat lightpos[4] = {3,3,6,1};
GLfloat lightdirection[3] = {-0.5f,-0.6f,-0.7f};
glLightfv(GL_LIGHT0,GL_POSITION,lightpos);
glLightfv(GL_LIGHT0,GL_SPOT_DIRECTION,lightdirection);
glLightf(GL_LIGHT0,GL_SPOT_EXPONENT,4);
glLightf(GL_LIGHT0,GL_SPOT_CUTOFF,50);
glEnable(GL_LIGHT0);
glEnable(GL_LIGHTING);
glEnable(GL_COLOR_MATERIAL);
glEnable(GL_NORMALIZE);
//создаем вершины для полигональной сетки заданной поверхности
const int N= 24, M = 75;
double ver[N][M][3];
GLfloat vert[2*N][3];
float fi, fie, fib, tet, tete, tetb, dfi, dtet;
fib = 0.0; fie = 361.0;
tetb = 0.05f; tete = 4.3f;
dfi = (fie - fib)/(N-1);
dtet = (tete - tetb)/(M-1);
float Ymax = 3.0;
//вычисляем вершины полигональной сетки
for(int n=0; n<N; n++)
{
fi = fib + dfi*n;
for(int m=0; m<M; m++)
{
tet = tetb + dtet*m;
ver[n][m][2] = tet*cos(3.14*fi/180);
ver[n][m][0] = tet*sin(3.14*fi/180);
ver[n][m][1] = Ymax*cos(2.5*tet)*cos(2.5*tet)/(1 + 0.5*tet*tet);
}
}
//выбираем Ncolor градаций цвета поверхности по высоте (координата Y)
int Ncolor = 100;
float dcolor = 1.0f/Ncolor;
float dY = Ymax/Ncolor;
//рисование поверхности и полигональной сетки
for(int p=0; p<M-1; p++)
{
for( int i=0; i<N; i++)
for(int j=0; j<2; j++)
for(int k=0; k<3; k++)
vert[2*i + j][k] = (GLfloat)ver[i][j+p][k];
GLfloat Vmin, Vmax;
Vmin = 1000; Vmax = 0.0;
for(int m=0; m<2*N; m++)
{
if(vert[m][1]>Vmax)
Vmax = vert[m][1];
if(vert[m][1]<Vmin)
Vmin = vert[m][1];
}
float h;
int Nc;
for(int ic=Ncolor; ic>0; ic--)
{
h = ic*dY;
if(Vmax>=h)
{
Nc = ic;
break;
}
}
if(Flag == 0)
{
glColor3f((GLfloat)(0.75*dcolor*Nc+0.25), (GLfloat)(0.5*dcolor*Nc+0.5),
(GLfloat)(0.25*dcolor*Nc+0.75));
glBegin(GL_TRIANGLE_STRIP);
for( i=0; i<N*2; i++)
glVertex3fv(vert[i]);
glEnd();
}
if(Flag == 1)
{
glColor3f((GLfloat)(0.25*dcolor*Nc+0.75), (GLfloat)(0.5*dcolor*Nc+0.5),
(GLfloat)(0.75*dcolor*Nc+0.25));
glBegin(GL_LINE_STRIP);
for( i=0; i<N*2; i++)
glVertex3fv(vert[i]);
glEnd();
}
}
//Шахматное поле
for(int j=-5; j <5; j++)
for(int i=-5; i<5; i++)
{
if((abs(i+j)%2) == 0)
glColor3f(1, 0, 0);
else
glColor3f(0.8f, 0.8f, 0.8f);
glBegin(GL_QUADS);
glVertex3f((GLfloat)i, 0, (GLfloat)j);
glVertex3f((GLfloat)i+1, 0, (GLfloat)j);
glVertex3f((GLfloat)i+1, 0, (GLfloat)j+1);
glVertex3f((GLfloat)i, 0, (GLfloat)j+1);
glEnd();
}
//axes
glColor3f( 1.0f,1.0f,0.0f);
//толщина линий - 3 пикселей
glLineWidth(3.0);
//OX RED
glBegin(GL_LINES);
// glColor3f( 1.0f,0.0f,0.0f);
glVertex3f(0.0f,0.25f,0.f);
glVertex3f(5.5f,0.25f,0.f);
glEnd();
// OY GREEN
glBegin(GL_LINES);
// glColor3f( 0.0f,1.0f,0.0f);
glVertex3f(0.0f,0.25f,0.0f);
glVertex3f(0.0f,4.25f,0.0f);
glEnd();
// OZ BLUE
glBegin(GL_LINES);
// glColor3f( 0.0f,0.0f,1.0f);
glVertex3f(0.0f,0.25f,0.0f);
glVertex3f(0.0f,0.25f,5.5f);
glEnd();
//переключаем буфферы в режиме двойной буфферизации
auxSwapBuffers();
}