Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

ИГС / IGS_2014-2015 / Lab_04 / glopen11 / glopen11

.cpp
Скачиваний:
5
Добавлен:
17.04.2018
Размер:
7.14 Кб
Скачать
#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();

}
Соседние файлы в папке glopen11
  • #
    17.04.20187.14 Кб5glopen11.cpp
  • #
    17.04.20184.37 Кб5glopen11.dsp
  • #
    17.04.2018539 б5glopen11.dsw
  • #
    17.04.201841.98 Кб5glopen11.ncb
  • #
    17.04.201848.64 Кб5glopen11.opt
  • #
    17.04.20181.34 Кб6glopen11.plg