- •Проекции.
- •GluPerspective(Gldouble angley,Gldouble aspect,Gldouble znear,Gldouble zfar).
- •Void cgLlab3View::OnSize(uint nType, int cx, int cy)
- •Void cgLlab3View::OnInitialUpdate()
- •Реализация
- •Void c3dProjectDlg::DrawCoordinates()
- •Void c3dProjectDlg::SetLamps()
- •Всё выше описанное, а также очевидные вещи, которые подробно не описывались, приводят к результату:
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;