- •Проекции.
- •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()
- •Всё выше описанное, а также очевидные вещи, которые подробно не описывались, приводят к результату:
Реализация
Разработано простое меню:
В дальнейшем, при желании, можно добавить новые фигуры.
Создание главного окна проекта:
Создание справки:
Настройка дополнительной информации практически не требуется.
Если необходимо, можно прописать подсказки для пунктов меню и действий:
Инициализация флагов при создании:
m_bLamp1(FALSE), m_bLamp2(FALSE), m_bLamp3(FALSE), m_bLightOn(FALSE), m_bDrawScelet(FALSE)
Инициализация контекста OpenGl:
PIXELFORMATDESCRIPTOR pfd =
{
sizeof(PIXELFORMATDESCRIPTOR), // Structure size.
1, // Structure version number.
PFD_DRAW_TO_WINDOW | // Property flags.
PFD_SUPPORT_OPENGL,
PFD_TYPE_RGBA,
24, // 24-bit color.
0, 0, 0, 0, 0, 0, // Not concerned with these.
0, 0, 0, 0, 0, 0, 0, // No alpha or accum buffer.
32, // 32-bit depth buffer.
0, 0, // No stencil or aux buffer.
PFD_MAIN_PLANE, // Main layer type.
0, // Reserved.
0, 0, 0 // Unsupported.
};
CClientDC clientDC(this);
int pixelFormat =
ChoosePixelFormat(clientDC.m_hDC, &pfd);
BOOL success =
SetPixelFormat(clientDC.m_hDC, pixelFormat, &pfd);
m_hRC = wglCreateContext(clientDC.m_hDC);
Начальные значения всех показателей:
//Rotate
m_ctrlAngleRotate.SetRange(0,360,true);
m_ctrlAngleRotate.SetPos(0);
m_ctrlXRotate.SetRange(-100, 100,true);
m_ctrlXRotate.SetPos(0);
m_ctrlYRotate.SetRange(-100, 100,true);
m_ctrlYRotate.SetPos(0);
m_ctrlZRotate.SetRange(-100, 100,true);
m_ctrlZRotate.SetPos(4);
//Translate
m_ctrlXTranslate.SetRange(-100, 100,true);
m_ctrlXTranslate.SetPos(0);
m_ctrlYTranslate.SetRange(-100, 100,true);
m_ctrlYTranslate.SetPos(1);
m_ctrlZTranslate.SetRange(-100, 100,true);
m_ctrlZTranslate.SetPos(0);
//projection
m_ctrlAngleY.SetRange(0,180,true);
m_ctrlAngleY.SetPos(109);
m_ctrlAspect.SetRange(1,90,true);
m_ctrlAspect.SetPos(1);
m_ctrlZNear.SetRange(0,100,true);
m_ctrlZNear.SetPos(0);
m_ctrlZFar.SetRange(0,100,true);
m_ctrlZFar.SetPos(100);
//LookAt
m_ctrlEyeX.SetRange(-100,100,true);
m_ctrlEyeX.SetPos(-74);
m_ctrlEyeY.SetRange(-100,100,true);
m_ctrlEyeY.SetPos(0);
m_ctrlEyeZ.SetRange(-100,100,true);
m_ctrlEyeZ.SetPos(42);
m_ctrlCenterX.SetRange(-100,100,true);
m_ctrlCenterX.SetPos(0);
m_ctrlCenterY.SetRange(-100,100,true);
m_ctrlCenterY.SetPos(0);
m_ctrlCenterZ.SetRange(-100,100,true);
m_ctrlCenterZ.SetPos(0);
m_ctrlUpX.SetRange(-100,100,true);
m_ctrlUpX.SetPos(48);
m_ctrlUpY.SetRange(-100,100,true);
m_ctrlUpY.SetPos(100);
m_ctrlUpZ.SetRange(-100,100,true);
m_ctrlUpZ.SetPos(-28);
m_ctrlNumOfPoints.SetRange(4, 24,true);
m_ctrlNumOfPoints.SetPos(4);
Инициализация фигуры:
//set image rect
GetClientRect(&m_rImageRect);
m_rImageRect.right /= 2;
//recalc all EditBox`s
RecalcEdit();
m_fDrawFigure = PYRAMID;
CWnd* pWnd = GetDlgItem(IDC_DRAWSCELET);
pWnd->EnableWindow(FALSE);
m_ctrlNumOfPoints.EnableWindow(FALSE);
Рисование с помощью Вьюпорта:
wglMakeCurrent(pDC->m_hDC, m_hRC);
//set a drawing rect
glViewport(0, 0, m_rImageRect.Width(), m_rImageRect.Height());
//draw 3D picture
DrawWithOpenGL();
wglMakeCurrent(pDC->m_hDC, NULL);
Выбор фигуры для рисования и настройка:
void C3DProjectDlg::DrawWithOpenGL()
{
//set all transformations(rotate, translate,...)
SetTransformations();
//on lamps
EnableLamps();
switch (m_fDrawFigure)
{
case PYRAMID :
Draw3DFigure();//drawing 3D figure
break;
}
//drawing coordinate lines
DrawCoordinates();
//off lamps
DisableLamps();
}
Непосредственно метод рисования фигуры:
//draw figure
void C3DProjectDlg::Draw3DFigure()
{
//draw figure
glBegin(GL_TRIANGLE_STRIP );
glColor3f(1.0f, 0.0f, 0.0f);
glVertex3f(0.0f, 0.0f, 0.0f);
glVertex3f(0.5f, 0.0f, 0.0f);
glVertex3f(0.25f, 0.5f, 0.0f);
glColor3f(1.0f, 1.0f, 0.0f);
glVertex3f(0.25f, 0.0f, 0.5f);
glColor3f(0.0f, 1.0f, 0.0f);
glVertex3f(0.0f, 0.0f, 0.0f);
glColor3f(0.0f, 1.0f, 1.0f);
glVertex3f(0.5f, 0.0f, 0.0f);
glEnd();
glColor3f(0.0f, 0.0f, 0.0f);
//draw rifflings of the figure
glBegin(GL_LINE_STRIP );
glVertex3f(0.0f, 0.0f, 0.0f);
glVertex3f(0.5f, 0.0f, 0.0f);
glVertex3f(0.25f, 0.5f, 0.0f);
glVertex3f(0.0f, 0.0f, 0.0f);
glVertex3f(0.25f, 0.0f, 0.5f);
glVertex3f(0.5f, 0.0f, 0.0f);
glVertex3f(0.25f, 0.5f, 0.0f);
glVertex3f(0.25f, 0.0f, 0.5f);
glEnd();
}
Метод рисования координатных осей (для удобства восприятия):
//drawing coordinate lines