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

Реализация

Разработано простое меню:

В дальнейшем, при желании, можно добавить новые фигуры.

Создание главного окна проекта:

Создание справки:

Настройка дополнительной информации практически не требуется.

Если необходимо, можно прописать подсказки для пунктов меню и действий:

Инициализация флагов при создании:

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

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