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

Void c3dProjectDlg::DrawCoordinates()

{

glViewport(0, m_rImageRect.Height() - 100, 100,100);

glBegin(GL_LINES);

glColor3f(1.0f, 0.0f, 0.0f);

glVertex3f(0.0f, 0.0f, 0.0f);

glVertex3f(0.0f, 1.0f, 0.0f);

glColor3f(0.0f, 1.0f, 0.0f);

glVertex3f(0.0f, 0.0f, 0.0f);

glVertex3f(1.0f, 0.0f, 0.0f);

glColor3f(0.0f, 0.0f, 1.0f);

glVertex3f(0.0f, 0.0f, 0.0f);

glVertex3f(0.0f, 0.0f, 1.0f);

glEnd();

}

При создании приложения также необходимо настроить свет и материалы:

//make settings for drawing

wglMakeCurrent(clientDC.m_hDC, m_hRC);

SetMaterial();

SetLamps();

wglMakeCurrent(clientDC.m_hDC, NULL);

Методы настройки света и материалов:

//make settings for 3 lamps

Void c3dProjectDlg::SetLamps()

{

//lamp1

GLfloat light1_ambient[] = { 1.0f, 1.0f, 1.0f, 1.0f };

GLfloat light1_diffuse[] = { 1.0f, 1.0f, 1.0f, 1.0f };

GLfloat light1_specular[] = { 1.0f, 1.0f, 1.0f, 1.0f };

GLfloat light1_position[] = { 1.0f, 1.0f, 1.0f, 1.0f };

//lamp2

GLfloat light2_ambient[] = { 1.0f, 1.0f, 1.0f, 1.0f };

GLfloat light2_diffuse[] = { 1.0f, 1.0f, 1.0f, 1.0f };

GLfloat light2_specular[] = { 1.0f, 0.0f, 1.0f, 0.0f };

GLfloat light2_position[] = { -1.0f, -1.0f, -1.0f, 1.0f };

//lamp3

GLfloat light3_ambient[] = { 0.8f, 0.9f, 1.0f, 1.0f };

GLfloat light3_diffuse[] = { 0.5f, 0.75f, 0.75f, 1.0f };

GLfloat light3_specular[] = { 0.22f, 1.0f, .035f, 1.0f };

GLfloat light3_position[] = { 0.25f, 0.0f, -0.25f, 1.0f };

//direction for all lamps

GLfloat spot_direction[] = { 0.25f, 0.25f, 0.25f };

glLightfv(GL_LIGHT1, GL_AMBIENT, light1_ambient);

glLightfv(GL_LIGHT1, GL_DIFFUSE, light1_diffuse);

glLightfv(GL_LIGHT1, GL_SPECULAR, light1_specular);

glLightfv(GL_LIGHT1, GL_POSITION, light1_position);

glLightf(GL_LIGHT1, GL_CONSTANT_ATTENUATION, 1.5f);

glLightf(GL_LIGHT1, GL_LINEAR_ATTENUATION, 0.5f);

glLightf(GL_LIGHT1, GL_QUADRATIC_ATTENUATION, 0.2f);

glLightf(GL_LIGHT1, GL_SPOT_CUTOFF, 100.0f);

glLightfv(GL_LIGHT1, GL_SPOT_DIRECTION, spot_direction);

glLightf(GL_LIGHT1, GL_SPOT_EXPONENT, 128.0f);

glLightfv(GL_LIGHT2, GL_AMBIENT, light2_ambient);

glLightfv(GL_LIGHT2, GL_DIFFUSE, light2_diffuse);

glLightfv(GL_LIGHT2, GL_SPECULAR, light2_specular);

glLightfv(GL_LIGHT2, GL_POSITION, light2_position);

glLightf(GL_LIGHT2, GL_CONSTANT_ATTENUATION, 1.5f);

glLightf(GL_LIGHT2, GL_LINEAR_ATTENUATION, 0.5f);

glLightf(GL_LIGHT2, GL_QUADRATIC_ATTENUATION, 0.2f);

glLightf(GL_LIGHT2, GL_SPOT_CUTOFF, 100.0f);

glLightfv(GL_LIGHT2, GL_SPOT_DIRECTION, spot_direction);

glLightf(GL_LIGHT2, GL_SPOT_EXPONENT, 128.0f);

glLightfv(GL_LIGHT3, GL_AMBIENT, light3_ambient);

glLightfv(GL_LIGHT3, GL_DIFFUSE, light3_diffuse);

glLightfv(GL_LIGHT3, GL_SPECULAR, light3_specular);

glLightfv(GL_LIGHT3, GL_POSITION, light3_position);

glLightf(GL_LIGHT3, GL_CONSTANT_ATTENUATION, 3.7f);

glLightf(GL_LIGHT3, GL_LINEAR_ATTENUATION, 4.0f);

glLightf(GL_LIGHT3, GL_QUADRATIC_ATTENUATION, 0.2f);

glLightf(GL_LIGHT3, GL_SPOT_CUTOFF, 100.0f);

glLightfv(GL_LIGHT3, GL_SPOT_DIRECTION, spot_direction);

glLightf(GL_LIGHT3, GL_SPOT_EXPONENT, 128.0f);

}

//set material of the figure

void C3DProjectDlg::SetMaterial()

{

float mat_dif[]={0.8f,0.6f,0.8f};

float mat_amb[]= {0.2f,0.6f,0.2f};

float mat_spec[]={0.5f,0.7f,1.0f};

float shininess=0.5f;

glMaterialfv(GL_FRONT_AND_BACK,GL_AMBIENT,mat_amb);

glMaterialfv(GL_FRONT_AND_BACK,GL_DIFFUSE,mat_dif);

glMaterialfv(GL_FRONT_AND_BACK,GL_SPECULAR,mat_spec);

glMaterialf(GL_FRONT_AND_BACK,GL_SHININESS,shininess);

glShadeModel (GL_SMOOTH);

}

Пересчёт и события изменения:

void C3DProjectDlg::OnHScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar)

{

RecalcEdit();

InvalidateRect(&m_rImageRect);

CDialog::OnHScroll(nSBCode, nPos, pScrollBar);

}

void C3DProjectDlg::RecalcEdit()

{

//Rotate

SetDlgItemInt(IDC_XROTATEEDIT, m_ctrlXRotate.GetPos());

SetDlgItemInt(IDC_YROTATEEDIT, m_ctrlYRotate.GetPos());

SetDlgItemInt(IDC_ZROTATEEDIT, m_ctrlZRotate.GetPos());

SetDlgItemInt(IDC_ANGLEROTATEEDIT, m_ctrlAngleRotate.GetPos());

//Translate

SetDlgItemInt(IDC_XTRANSLATEEDIT, m_ctrlXTranslate.GetPos());

SetDlgItemInt(IDC_YTRANSLATEEDIT, m_ctrlYTranslate.GetPos());

SetDlgItemInt(IDC_ZTRANSLATEEDIT, m_ctrlZTranslate.GetPos());

//Eye

SetDlgItemInt(IDC_EYEXEDIT, m_ctrlEyeX.GetPos());

SetDlgItemInt(IDC_EYEYEDIT, m_ctrlEyeY.GetPos());

SetDlgItemInt(IDC_EYEZEDIT, m_ctrlEyeZ.GetPos());

//Center

SetDlgItemInt(IDC_CENTERXEDIT, m_ctrlCenterX.GetPos());

SetDlgItemInt(IDC_CENTERYEDIT, m_ctrlCenterY.GetPos());

SetDlgItemInt(IDC_CENTERZEDIT, m_ctrlCenterZ.GetPos());

//Up

SetDlgItemInt(IDC_UPXEDIT, m_ctrlUpX.GetPos());

SetDlgItemInt(IDC_UPYEDIT, m_ctrlUpY.GetPos());

SetDlgItemInt(IDC_UPZEDIT, m_ctrlUpZ.GetPos());

//Projection

SetDlgItemInt(IDC_ANGLEYEDIT, m_ctrlAngleY.GetPos());

SetDlgItemInt(IDC_ASPECTEDIT, m_ctrlAspect.GetPos());

SetDlgItemInt(IDC_ZNEAREDIT, m_ctrlZNear.GetPos());

SetDlgItemInt(IDC_ZFAREDIT, m_ctrlZFar.GetPos());

//number of points

SetDlgItemInt(IDC_NUMOFPOINTSEDIT, m_ctrlNumOfPoints.GetPos());

}

void C3DProjectDlg::OnLamp1()

{

m_bLamp1 = !m_bLamp1;

InvalidateRect(&m_rImageRect);

}

void C3DProjectDlg::OnLamp2()

{

m_bLamp2 = !m_bLamp2;

InvalidateRect(&m_rImageRect);

}

void C3DProjectDlg::OnLamp3()

{

m_bLamp3 = !m_bLamp3;

InvalidateRect(&m_rImageRect);

}

void C3DProjectDlg::OnLighton()

{

CWnd* pWnd;

m_bLightOn = !m_bLightOn;

pWnd = GetDlgItem(IDC_LAMP1);

pWnd->EnableWindow(m_bLightOn);

pWnd = GetDlgItem(IDC_LAMP2);

pWnd->EnableWindow(m_bLightOn);

pWnd = GetDlgItem(IDC_LAMP3);

pWnd->EnableWindow(m_bLightOn);

InvalidateRect(&m_rImageRect);

}

void C3DProjectDlg::SetTransformations()

{

glMatrixMode(GL_MODELVIEW);

glLoadIdentity();

//set all transformations, making by user

glTranslatef(m_ctrlXTranslate.GetPos()/100.0f, m_ctrlYTranslate.GetPos()/100.0f, m_ctrlZTranslate.GetPos()/100.0f);

glRotatef(m_ctrlAngleRotate.GetPos()*1.0f, m_ctrlXRotate.GetPos()/100.0f, m_ctrlYRotate.GetPos()/100.0f, m_ctrlZRotate.GetPos()/100.0f);

gluLookAt(m_ctrlEyeX.GetPos()/100.0f, m_ctrlEyeY.GetPos()/100.0f, m_ctrlEyeZ.GetPos()/100.0f, m_ctrlCenterX.GetPos()/100.0f, m_ctrlCenterY.GetPos()/100.0f, m_ctrlCenterZ.GetPos()/100.0f, m_ctrlUpX.GetPos()/100.0f, m_ctrlUpY.GetPos()/100.0f, m_ctrlUpZ.GetPos()/100.0f);

glMatrixMode(GL_PROJECTION);

glLoadIdentity();

//set perspective projection

gluPerspective(m_ctrlAngleY.GetPos(), m_ctrlAspect.GetPos(), m_ctrlZNear.GetPos(), m_ctrlZFar.GetPos());

glMatrixMode(GL_MODELVIEW);

}

void C3DProjectDlg::EnableLamps()

{

//on lamps

if (m_bLightOn)

glEnable(GL_LIGHTING);

if (m_bLamp1)

glEnable(GL_LIGHT1);

if (m_bLamp2)

glEnable(GL_LIGHT2);

if (m_bLamp3)

glEnable(GL_LIGHT3);

}

void C3DProjectDlg::DisableLamps()

{

//off lamps

if (m_bLightOn)

glDisable(GL_LIGHTING);

if (m_bLamp1)

glDisable(GL_LIGHT1);

if (m_bLamp2)

glDisable(GL_LIGHT2);

if (m_bLamp3)

glDisable(GL_LIGHT3);

}

При помощи ClassWizard компонентам конкретные действия, например:

Определяем protected-атрибуты:

HICON m_hIcon;

HGLRC m_hRC;

CRect m_rImageRect;

tFigure m_fDrawFigure;

И public-атрибуты:

enum { IDD = IDD_MY3DPROJECT_DIALOG };

CSliderCtrl m_ctrlXRotate;

CSliderCtrl m_ctrlXTranslate;

CSliderCtrl m_ctrlYRotate;

CSliderCtrl m_ctrlYTranslate;

CSliderCtrl m_ctrlZRotate;

CSliderCtrl m_ctrlZTranslate;

CSliderCtrl m_ctrlAngleRotate;

CSliderCtrl m_ctrlCenterY;

CSliderCtrl m_ctrlEyeZ;

CSliderCtrl m_ctrlEyeY;

CSliderCtrl m_ctrlEyeX;

CSliderCtrl m_ctrlUpZ;

CSliderCtrl m_ctrlUpY;

CSliderCtrl m_ctrlUpX;

CSliderCtrl m_ctrlCenterZ;

CSliderCtrl m_ctrlCenterX;

CSliderCtrl m_ctrlZNear;

CSliderCtrl m_ctrlZFar;

CSliderCtrl m_ctrlAspect;

CSliderCtrl m_ctrlAngleY;

CSliderCtrl m_ctrlZMove;

CSliderCtrl m_ctrlYMove;

CSliderCtrl m_ctrlXMove;

BOOL m_bLamp1;

BOOL m_bLamp2;

BOOL m_bLamp3;

BOOL m_bLightOn;

BOOL m_bDrawScelet;

Соседние файлы в папке Лабораторная работа №31