Добавил:
Studfiles2
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз:
Предмет:
Файл:Лабораторная работа №51 / GLlab5 / Figure3D
.cpp// 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