Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Скачиваний:
15
Добавлен:
01.05.2014
Размер:
14.99 Кб
Скачать
// Figure3D.cpp : implementation file
//

#include "stdafx.h"
#include "GLlab.h"
#include "Figure3D.h"

#include <gl\gl.h>
#include <gl\glu.h>
#include <gl\glaux.h>

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

/////////////////////////////////////////////////////////////////////////////
// Figure3D

IMPLEMENT_DYNCREATE(Figure3D, CDocument)

Figure3D::Figure3D()
{ angle=45;
	bx=1;	by=1;	bz=1;	dx=0;	dy=0;	dz=0;

	LightPosition[0]=-2.0;LightPosition[1]=2.0;LightPosition[2]=2.0;LightPosition[3]=1.0;
	LightNapr[0]=2.0;LightNapr[1]=-2.0;LightNapr[2]=-2.0;LightNapr[3]=1.0;

	LightAmbient[0]=0.6;LightAmbient[1]=0.2;LightAmbient[2]=0.7;LightAmbient[3]=1.0;
	LightDiffuse[0]=0.2;LightDiffuse[1]=0.8;LightDiffuse[2]=0.9;LightDiffuse[4]=1.0;
	LightSpecular[0]=1.0;LightSpecular[1]=0.2;LightSpecular[2]=0.1;LightSpecular[3]=1.0;

	spot=60;twoside=true;local=false;

	MatEmission[0]=0;MatEmission[1]=0;MatEmission[2]=0;MatEmission[3]=1;
	MatAmbient[0]=0.1;MatAmbient[1]=0.2;MatAmbient[2]=0.2;MatAmbient[3]=1.0;
	MatDiffuse[0]=0.1;MatDiffuse[1]=0.2;MatDiffuse[2]=0.2;MatDiffuse[3]=1.0;
	MatSpecular[0]=1.0;MatSpecular[1]=0.2;MatSpecular[2]=0.2;MatSpecular[3]=1.0;

	SceneLamps[0]=0;SceneLamps[1]=0;SceneLamps[2]=0;
	SceneLamp1[0]=0.5;SceneLamp1[1]=0.5;SceneLamp1[2]=0.5;SceneLamp1[3]=1.0;
	SceneLamp2[0]=0.5;SceneLamp2[1]=0.5;SceneLamp2[2]=0.5;SceneLamp2[3]=1.0;
	SceneLamp3[0]=0.5;SceneLamp3[1]=0.5;SceneLamp3[2]=0.5;SceneLamp3[3]=1.0;
}

BOOL Figure3D::OnNewDocument()
{
	if (!CDocument::OnNewDocument())
		return FALSE;
	return TRUE;
}

Figure3D::~Figure3D()
{
}


BEGIN_MESSAGE_MAP(Figure3D, CDocument)
	//{{AFX_MSG_MAP(Figure3D)
		// NOTE - the ClassWizard will add and remove mapping macros here.
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// Figure3D diagnostics

#ifdef _DEBUG
void Figure3D::AssertValid() const
{
	CDocument::AssertValid();
}

void Figure3D::Dump(CDumpContext& dc) const
{
	CDocument::Dump(dc);
}
#endif //_DEBUG

/////////////////////////////////////////////////////////////////////////////
// Figure3D serialization

void Figure3D::Serialize(CArchive& ar)
{
	if (ar.IsStoring())
	{
		// TODO: add storing code here
	}
	else
	{
		// TODO: add loading code here
	}
}

/////////////////////////////////////////////////////////////////////////////
// Figure3D commands]
void Figure3D::SetAngle(float _angle)
{angle=_angle;}
void Figure3D::SetBX(int _bx)
{bx=_bx;}
void Figure3D::SetBY(int _by)
{by=_by;}
void Figure3D::SetBZ(int _bz)
{bz=_bz;}
void Figure3D::SetDX(float _dx)
{dx=_dx;}
void Figure3D::SetDY(float _dy)
{dy=_dy;}
void Figure3D::SetDZ(float _dz)
{dz=_dz;}
void Figure3D::SetLightPosition(float _LightPosition[3])
{for (int i=0;i<3;i++)
	{LightPosition[i]=_LightPosition[i];}
}
void Figure3D::SetLightNapr(float _LightNapr[3])
{for (int i=0;i<3;i++)
	{LightNapr[i]=_LightNapr[i];}
}
void Figure3D::SetLightAmbient(float _LightAmbient[3])
{for (int i=0;i<3;i++)
	{LightAmbient[i]=_LightAmbient[i];}
}
void Figure3D::SetLightDiffuse(float _LightDiffuse[3])
{for (int i=0;i<3;i++)
	{LightDiffuse[i]=_LightDiffuse[i];}
}
void Figure3D::SetLightSpecular(float _LightSpecular[3])
{for (int i=0;i<3;i++)
	{LightSpecular[i]=_LightSpecular[i];}
}
void Figure3D::SetSpot(int _spot)
{spot=_spot;}
void Figure3D::SetTwoside(bool _twoside)
{twoside=_twoside;}
void Figure3D::SetLocal(bool _local)
{local=_local;}
void Figure3D::SetMatAmbient(float _MatAmbient[3])
{for (int i=0;i<3;i++)
	{MatAmbient[i]=_MatAmbient[i];}
}
void Figure3D::SetMatDiffuse(float _MatDiffuse[3])
{for (int i=0;i<3;i++)
	{MatDiffuse[i]=_MatDiffuse[i];}
}
void Figure3D::SetMatSpecular(float _MatSpecular[3])
{for (int i=0;i<3;i++)
	{MatSpecular[i]=_MatSpecular[i];}
}
void Figure3D::SetMatEmission(float _MatEmission[3])
{for (int i=0;i<3;i++)
	{MatEmission[i]=_MatEmission[i];}
}
void Figure3D::SetSceneLamps(int _SceneLamps[3])
{for (int i=0;i<3;i++)
	{SceneLamps[i]=_SceneLamps[i];}
}
void Figure3D::SetSceneDifuseLamp(float _SceneLamp[3],int i)
{ if (i==1)
	{
		for (int j=0;j<3;j++)
			{SceneLamp1[j]=_SceneLamp[j];}
	}
  if (i==2)
	{
		for (int j=0;j<3;j++)
			{SceneLamp2[j]=_SceneLamp[j];}
	}

  if (i==3)
	{
		for (int j=0;j<3;j++)
			{SceneLamp3[j]=_SceneLamp[j];}
	}
}



void Figure3D::DrawChel()
{ GLUquadricObj *quadObj1; 

 quadObj1 = gluNewQuadric(); 
	 
 glRotated(angle,bx,by,bz);
 glTranslatef(dx,dy,dz);

 glTranslatef(0,0.5,0);
 glColor3d(0,1,1);
 gluQuadricDrawStyle(quadObj1, GLU_FILL); 
 gluSphere(quadObj1, 0.4, 20, 20); 

 glTranslatef(0,-0.3,0);
 glRotated(90,1,0,0);
 gluQuadricDrawStyle(quadObj1, GLU_FILL); 
 gluCylinder(quadObj1, 0.08, 0.2, 0.2, 20, 20); 
 glRotated(-90,1,0,0);

 glTranslatef(0,-0.7,0);

 glPolygonMode(GL_FRONT_AND_BACK, GL_FILL); 

 glBegin(GL_QUADS);

	glVertex3f( -0.5f, 0.5f, -0.5f);
	glVertex3f( -0.5f, 0.5f, 0.5f);
	glVertex3f( 0.5f, 0.5f, 0.5f);
	glVertex3f( 0.5f, 0.5f, -0.5f);

	glVertex3f( -0.5f, -0.5f, -0.5f);
	glVertex3f( -0.5f, -0.5f, 0.5f);
	glVertex3f( 0.5f, -0.5f, 0.5f);
	glVertex3f( 0.5f, -0.5f, -0.5f);

	glVertex3f( -0.5f, -0.5f, 0.5f);
	glVertex3f( -0.5f, 0.5f, 0.5f);
	glVertex3f( 0.5f, 0.5f, 0.5f);
	glVertex3f( 0.5f, -0.5f, 0.5f);

	glVertex3f( -0.5f, -0.5f, -0.5f);
	glVertex3f( -0.5f, 0.5f, -0.5f);
	glVertex3f( 0.5f, 0.5f, -0.5f);
	glVertex3f( 0.5f, -0.5f, -0.5f);

	glVertex3f( -0.5f, -0.5f, -0.5f);
	glVertex3f( -0.5f, -0.5f, 0.5f);
	glVertex3f( -0.5f, 0.5f, 0.5f);
	glVertex3f( -0.5f, 0.5f, -0.5f);

	glVertex3f( 0.5f, -0.5f, -0.5f);
	glVertex3f( 0.5f, -0.5f, 0.5f);
	glVertex3f( 0.5f, 0.5f, 0.5f);
	glVertex3f( 0.5f, 0.5f, -0.5f);

 glEnd();

 glBegin(GL_TRIANGLES);
	
	glVertex3f( 0.5f, 0.5f, 0.0f);
	glVertex3f( 1.0f, 0.5f, 0.0f);
	glVertex3f( 0.5f, 0.2f, 0.5f);

	glVertex3f( 0.5f, 0.5f, 0.0f);
	glVertex3f( 1.0f, 0.5f, 0.0f);
	glVertex3f( 0.5f, 0.2f, -0.5f);


	glVertex3f( -0.5f, 0.5f, 0.0f);
	glVertex3f( -1.0f, 0.5f, 0.0f);
	glVertex3f( -0.5f, 0.2f, 0.5f);

	glVertex3f( -0.5f, 0.5f, 0.0f);
	glVertex3f( -1.0f, 0.5f, 0.0f);
	glVertex3f( -0.5f, 0.2f, -0.5f);


	glVertex3f( 0.5f, -0.5f, 0.0f);
	glVertex3f( 0.5f, -1.0f, 0.0f);
	glVertex3f( 0.3f, -0.5f, 0.5f);

	glVertex3f( 0.5f, -0.5f, 0.0f);
	glVertex3f( 0.5f, -1.0f, 0.0f);
	glVertex3f( 0.3f, -0.5f, -0.5f);


	glVertex3f( -0.5f, -0.5f, 0.0f);
	glVertex3f( -0.5f, -1.0f, 0.0f);
	glVertex3f( -0.3f, -0.5f, 0.5f);

	glVertex3f( -0.5f, -0.5f, 0.0f);
	glVertex3f( -0.5f, -1.0f, 0.0f);
	glVertex3f( -0.3f, -0.5f, -0.5f);
 glEnd();
 

 glRotated(-angle,bx,by,bz);
 glTranslatef(-dx,-dy,-dz);

 gluDeleteQuadric(quadObj1);
}

void Figure3D::DrawScene()
{	
	glLoadIdentity();
	

	GLUquadricObj *quadObj1; 

	quadObj1 = gluNewQuadric(); 	
	
	glRotated(angle,bx,by,bz);
	glTranslatef(dx,dy,dz);

	glPolygonMode(GL_FRONT_AND_BACK, GL_FILL); 
	
	glColor3d(0,1,1);

	glBegin(GL_QUADS);
	
	glVertex3f( 1.0f, -0.5f, 1.0f);
	glVertex3f( 1.0f, -0.5f, -1.0f);
	glVertex3f( -1.0f, -0.5f, -1.0f);
	glVertex3f( -1.0f, -0.5f, 1.0f);
	
	glEnd();

	glTranslatef(0.4,-0.2,0);
	glColor3d(0,1,1);
	gluQuadricDrawStyle(quadObj1, GLU_FILL); 
	gluSphere(quadObj1, 0.3, 20, 20); 
	glTranslatef(-0.4,0.2,0);

	glTranslatef(-0.4,0.4,-0.3);
	glRotated(90,1,0,0);
	gluQuadricDrawStyle(quadObj1, GLU_FILL); 
	gluCylinder(quadObj1, 0.0, 0.3, 1.0, 20, 20); 
	glRotated(-90,1,0,0);
	glTranslatef(0.4,-0.4,0.3);

	glTranslatef(0.0,0.0,0.5);
	glBegin(GL_QUADS);
	
	glVertex3f( 0.2f, -0.5f, 0.2f);
	glVertex3f( 0.2f, -0.1f, 0.2f);
	glVertex3f( -0.2f, -0.1f, 0.2f);
	glVertex3f( -0.2f, -0.5f, 0.2f);
	
	glVertex3f( 0.2f, -0.5f, 0.2f);
	glVertex3f( 0.2f, -0.1f, 0.2f);
	glVertex3f( 0.2f, -0.1f, -0.2f);
	glVertex3f( 0.2f, -0.5f, -0.2f);
	
	glVertex3f( 0.2f, -0.5f, -0.2f);
	glVertex3f( 0.2f, -0.1f, -0.2f);
	glVertex3f( -0.2f, -0.1f, -0.2f);
	glVertex3f( -0.2f, -0.5f, -0.2f);

	glVertex3f( -0.2f, -0.5f, -0.2f);
	glVertex3f( -0.2f, -0.1f, -0.2f);
	glVertex3f( -0.2f, -0.1f, 0.2f);
	glVertex3f( -0.2f, -0.5f, 0.2f);
	glEnd();
	glTranslatef(0.0,0.0,-0.5);


 glRotated(-angle,bx,by,bz);
 glTranslatef(-dx,-dy,-dz);

 gluDeleteQuadric(quadObj1);
}


//Включает общие установки
void Figure3D::Enab3D()
{	glClearColor(0.0f, 0.0f, 0.0f, 0.0f); //Черный цвет фона
	glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
	
	glLoadIdentity();   
//Вставить инициализацию

	glMatrixMode( GL_PROJECTION );
    glLoadIdentity();
	gluPerspective(50.0, 1, 0.1, 100.0);

	gluLookAt( 0,0,5, 0,0,0, 0,1,0 );
	glMatrixMode( GL_MODELVIEW );

	glEnable(GL_DEPTH_TEST);
}

//Отключает общие установки
void Figure3D::Disab3D()
{
	glDisable(GL_DEPTH_TEST);
	
	gluPerspective(20.0, 1, 0.1, 100.0);
	gluLookAt( 0,0,3, 0,0,2, 0,1,0 );
	glTranslatef(-0.1,0.1,0);
}

//Включаем установки света
void Figure3D::EnabLight()
{	

	//Настройки всех цветов

	glLightfv(GL_LIGHT1, GL_POSITION, LightPosition);   // Позиция света
	glLightfv(GL_LIGHT1,GL_AMBIENT,LightAmbient);
	glLightfv(GL_LIGHT1,GL_DIFFUSE,LightDiffuse);
	glLightfv(GL_LIGHT1,GL_SPECULAR,LightSpecular);

	//настройки разброса света
	glLightf(GL_LIGHT1,GL_SPOT_CUTOFF  ,spot);	//(0-90,180)
	//направление света
	glLightfv(GL_LIGHT1,GL_SPOT_DIRECTION ,LightNapr);


	//Локальность/удаленность
	glLightModelf(GL_LIGHT_MODEL_LOCAL_VIEWER, local);
	//Установка-оттключение освещения внутр граней
	glLightModelf(GL_LIGHT_MODEL_TWO_SIDE,twoside);

	glEnable(GL_LIGHTING);
	glEnable(GL_LIGHT1);
}

//Отключаем установки света
void Figure3D::DisabLight()
{	glDisable(GL_LIGHT1);
	glDisable(GL_LIGHTING);
}

//Включаем установки материала
void Figure3D::EnabMaterial()
{  
	glMaterialfv(GL_FRONT,GL_EMISSION, MatEmission); 
    glMaterialf(GL_FRONT, GL_SHININESS, 90.0);
	
	//Рассеяный цвет материала
	glMaterialfv(GL_FRONT, GL_AMBIENT, MatAmbient);

	//Диффузный цвет материала
	glMaterialfv(GL_FRONT, GL_DIFFUSE, MatDiffuse);

	//Отраженный цвет материала
	glMaterialfv(GL_FRONT, GL_SPECULAR , MatSpecular);

	glEnable(GL_COLOR_MATERIAL);
}
//Отключаем установки материала
void Figure3D::DisabMaterial()
{glDisable(GL_COLOR_MATERIAL);
}


//Установки света прожекторов для сцены
void Figure3D::EnabLightScene()
{	
	//Настройки всех 
//Первый--------------------------------------------------
	float LightPosition1[4]={1.5,1.5,0.0,0.0};
	float LightNapr1[4]={-1.5,-1.5,0.0,0.0};
	float LightAmbient1[4]={0.0,0.0,0.0,1.0};
//	float LightDiffuse1[4]={0.5,0.5,0.5,1.0};
	float LightSpecular1[4]={1.0,1.0,1.0,1.0};

	glLightfv(GL_LIGHT1, GL_POSITION, LightPosition1);   // Позиция света
	glLightfv(GL_LIGHT1,GL_AMBIENT,LightAmbient1);
	glLightfv(GL_LIGHT1,GL_DIFFUSE,SceneLamp1);
	glLightfv(GL_LIGHT1,GL_SPECULAR,LightSpecular1);

	//настройки разброса света
	glLightf(GL_LIGHT1,GL_SPOT_CUTOFF  ,45);	//(0-90,180)
	//направление света
	glLightfv(GL_LIGHT1,GL_SPOT_DIRECTION ,LightNapr1);

	glLightf(GL_LIGHT1,GL_SPOT_EXPONENT,4.0);

//Второй---------------------------------------------------
	float LightPosition2[4]={-1.5,1.5,-1.5,0.0};
	float LightNapr2[4]={1.5,-1.5,1.5,0.0};
	float LightAmbient2[4]={0.0,0.0,0.0,1.0};
//	float LightDiffuse2[4]={0.5,0.5,0.5,1.0};
	float LightSpecular2[4]={1.0,1.0,1.0,1.0};

	glLightfv(GL_LIGHT2, GL_POSITION, LightPosition2);   // Позиция света
	glLightfv(GL_LIGHT2,GL_AMBIENT,LightAmbient2);
	glLightfv(GL_LIGHT2,GL_DIFFUSE,SceneLamp2);
	glLightfv(GL_LIGHT2,GL_SPECULAR,LightSpecular2);

	//настройки разброса света
	glLightf(GL_LIGHT2,GL_SPOT_CUTOFF  ,45);	//(0-90,180)
	//направление света
	glLightfv(GL_LIGHT2,GL_SPOT_DIRECTION ,LightNapr2);

	glLightf(GL_LIGHT2,GL_SPOT_EXPONENT,4.0);
	
//Третий--------------------------------------------------
	float LightPosition3[4]={-1.5,1.5,1.5,0.0};
	float LightNapr3[4]={1.5,-1.5,-1.5,0.0};
	float LightAmbient3[4]={0.0,0.0,0.0,1.0};
//	float LightDiffuse3[4]={0.5,0.5,0.5,1.0};
	float LightSpecular3[4]={1.0,1.0,1.0,1.0};

	glLightfv(GL_LIGHT3, GL_POSITION, LightPosition3);   // Позиция света
	glLightfv(GL_LIGHT3,GL_AMBIENT,LightAmbient3);
	glLightfv(GL_LIGHT3,GL_DIFFUSE,SceneLamp3);
	glLightfv(GL_LIGHT3,GL_SPECULAR,LightSpecular3);

	//настройки разброса света
	glLightf(GL_LIGHT3,GL_SPOT_CUTOFF  ,45);	//(0-90,180)
	//направление света
	glLightfv(GL_LIGHT3,GL_SPOT_DIRECTION ,LightNapr3);

	glLightf(GL_LIGHT3,GL_SPOT_EXPONENT,4.0);

//Общие настройки----------------------------------------------
	//Локальность/удаленность
	glLightModelf(GL_LIGHT_MODEL_LOCAL_VIEWER, false);
	//Установка-оттключение освещения внутр граней
	glLightModelf(GL_LIGHT_MODEL_TWO_SIDE,true);


	glEnable(GL_COLOR_MATERIAL);
	glEnable(GL_LIGHTING);
	
	if (SceneLamps[0]==1) {glEnable(GL_LIGHT1);} 
	if (SceneLamps[1]==1) {glEnable(GL_LIGHT2);} 
	if (SceneLamps[2]==1) {glEnable(GL_LIGHT3);} 

//------------------------------------------------------------------
		//Первый целиндр
	GLUquadricObj *quadObj1; 

	quadObj1 = gluNewQuadric(); 

	 
	glLoadIdentity();

	glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);
	glColor3d(0,1,1);
	glTranslatef(1.5,1.5,0.0);
	glRotated(90,0,1,0);
	glRotated(-45,1,0,0);
	gluQuadricDrawStyle(quadObj1, GLU_FILL); 
	gluCylinder(quadObj1, 0.2, 0.2, 0.4, 20, 20); 

	glColor3d(1,1,0);
	glTranslatef(0,0,0.3);
	gluQuadricDrawStyle(quadObj1, GLU_FILL); 
	gluSphere(quadObj1, 0.2, 20, 20); 
	glTranslatef(0,0,-0.3);
	glColor3d(0,1,1);

	glRotated(45,1,0,0);
	glRotated(-90,0,1,0);
	glTranslatef(-1.5,-1.5,0.0);



		//Второй целиндр
	glTranslatef(-1.5,1.5,-1.5);
	glRotated(45,0,1,0);
	glRotated(45,1,0,0);
	gluQuadricDrawStyle(quadObj1, GLU_FILL); 
	gluCylinder(quadObj1, 0.2, 0.2, 0.4, 20, 20); 

	glColor3d(1,1,0);
	glTranslatef(0,0,0.1);
	gluQuadricDrawStyle(quadObj1, GLU_FILL); 
	gluSphere(quadObj1, 0.2, 20, 20); 
	glTranslatef(0,0,-0.1);
	glColor3d(0,1,1);

	glRotated(-45,1,0,0);
	glRotated(-45,0,1,0);
	glTranslatef(1.5,-1.5,1.5);

	//Третий целиндр
	glTranslatef(-1.5,1.5,1.5);
	glRotated(-45,0,1,0);
	glRotated(-45,1,0,0);
	gluQuadricDrawStyle(quadObj1, GLU_FILL); 
	gluCylinder(quadObj1, 0.2, 0.2, 0.4, 20, 20); 
	
	
	glColor3d(1,1,0);
	glTranslatef(0,0,0.3);
	gluQuadricDrawStyle(quadObj1, GLU_FILL); 
	gluSphere(quadObj1, 0.2, 20, 20); 
	glTranslatef(0,0,-0.3);
	glColor3d(0,1,1);

	glRotated(45,1,0,0);
	glRotated(45,0,1,0);
	glTranslatef(1.5,-1.5,-1.5);

	 gluDeleteQuadric(quadObj1);
	glPushMatrix();
}

void Figure3D::DisabLightScene()
{	glPopMatrix();
	if (SceneLamps[0]=1) {glDisable(GL_LIGHT1);}	
	if (SceneLamps[1]=1) {glDisable(GL_LIGHT2);}
	if (SceneLamps[2]=1) {glDisable(GL_LIGHT3);}
	glDisable(GL_LIGHTING);
	glDisable(GL_COLOR_MATERIAL);
	
}

Соседние файлы в папке GLlab5