Добавил:
Studfiles2
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз:
Предмет:
Файл:Тихомиров Ю. Программирование трёхмерной графики / Files / Projections / ProjectionsView
.cpp// ProjectionsView.cpp : implementation of the COpenGLView class
//
#include "stdafx.h"
#include "Projections.h"
#include "ProjectionsDoc.h"
#include "ProjectionsView.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// CProjectionsView
IMPLEMENT_DYNCREATE(CProjectionsView, COpenGLView)
CProjectionsView::CProjectionsView()
{
}
CProjectionsView::~CProjectionsView()
{
}
BEGIN_MESSAGE_MAP(CProjectionsView, COpenGLView)
//{{AFX_MSG_MAP(CProjectionsView)
ON_WM_SIZE()
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CProjectionsView diagnostics
#ifdef _DEBUG
void CProjectionsView::AssertValid() const
{
CView::AssertValid();
}
void CProjectionsView::Dump(CDumpContext& dc) const
{
CView::Dump(dc);
}
CProjectionsDoc* CProjectionsView::GetDocument() // non-debug version is inline
{
ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CProjectionsDoc)));
return (CProjectionsDoc*)m_pDocument;
}
#endif //_DEBUG
/////////////////////////////////////////////////////////////////////////////
// CProjectionsView drawing
void CProjectionsView::OnInitialUpdate()
{
COpenGLView::OnInitialUpdate();
// Определяем цвет фона используемый по умолчанию
glClearColor(1.0f, 0.96f, 0.866f, 1.0f);
}
void CProjectionsView::OnDraw(CDC* pDC)
{
CProjectionsDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
GLfloat x = 2.0f, y = 2.0f, z = 3.0f;
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glColor3f(1.0f, 0.3f, 0.5f);
glEnable(GL_DEPTH_TEST);
glShadeModel(GL_FLAT);
glPushMatrix();
glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);
//glTranslatef(-0.5f, 0.5f, 0.0f);
//glRotatef( 20.0f, 1.0f, 0.0f, 0.0f);
//glRotatef(-30.0f, 0.0f, 1.0f, 0.0f);
//glRotatef(-45.0f, 0.0f, 0.0f, 1.0f);
// Определяем координаты осей
glLineWidth(2.0f);
glBegin(GL_LINES);
glColor3f(0.0f, 0.0f, 1.0f);
glVertex3f(0.0f, 0.0f, 0.0f);
glVertex3f( x, 0.0f, 0.0f);
glColor3f(1.0f, 0.0f, 0.0f);
glVertex3f(0.0f, 0.0f, 0.0f);
glVertex3f(0.0f, y, 0.0f);
glColor3f(0.0f, 0.8f, 0.0f);
glVertex3f(0.0f, 0.0f, 0.0f);
glVertex3f(0.0f, 0.0f, z);
glEnd();
glLineStipple(2, 0x1C47);
glEnable(GL_LINE_STIPPLE);
glBegin(GL_LINES);
glColor3f(0.0f, 0.0f, 1.0f);
glVertex3f( 0.0f, 0.0f, 0.0f);
glVertex3f(-x, 0.0f, 0.0f);
glColor3f(1.0f, 0.0f, 0.0f);
glVertex3f(0.0f, 0.0f, 0.0f);
glVertex3f(0.0f, -y, 0.0f);
glColor3f(0.0f, 0.8f, 0.0f);
glVertex3f(0.0f, 0.0f, 0.0f);
glVertex3f(0.0f, 0.0f, -z);
glEnd();
glDisable(GL_LINE_STIPPLE);
glShadeModel(GL_SMOOTH);
// Определяем координаты вершин для треугольников
glBegin(GL_QUAD_STRIP);
glColor3f(1.0f, 0.0f, 1.0f);
glVertex3f(-0.5f, 0.5f, 1.5f);
glVertex3f(-0.5f, -0.5f, 1.5f);
glVertex3f( 0.5f, 0.5f, 1.5f);
glVertex3f( 0.5f, -0.5f, 1.5f);
glVertex3f( 0.5f, 0.5f, -2.5f);
glVertex3f( 0.5f, -0.5f, -2.5f);
glVertex3f(-0.5f, 0.5f, -2.5f);
glVertex3f(-0.5f, -0.5f, -2.5f);
glVertex3f(-0.5f, 0.5f, 1.5f);
glVertex3f(-0.5f, -0.5f, 1.5f);
glEnd();
glBegin(GL_QUADS);
glVertex3f(-0.5f, 0.5f, 1.5f);
glVertex3f( 0.5f, 0.5f, 1.5f);
glVertex3f( 0.5f, 0.5f, -2.5f);
glVertex3f(-0.5f, 0.5f, -2.5f);
glEnd();
glBegin(GL_QUADS);
glVertex3f(-0.5f, -0.5f, 1.5f);
glVertex3f( 0.5f, -0.5f, 1.5f);
glVertex3f( 0.5f, -0.5f, -2.5f);
glVertex3f(-0.5f, -0.5f, -2.5f);
glEnd();
glPopMatrix();
glFinish();
SwapBuffers(::wglGetCurrentDC());
}
/////////////////////////////////////////////////////////////////////////////
// CProjectionsView message handlers
void CProjectionsView::OnSize(UINT nType, int cx, int cy)
{
COpenGLView::OnSize(nType, cx, cy);
m_width = cx;
m_height = cy;
glViewport(5, 5, m_width - 10, m_height - 10);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
// Диметрическая поверхность
GLfloat mDim[4][4] = {
0.925820f, 0.133631f, -0.353553f, 0.0f,
0.0f, 0.935414f, 0.353553f, 0.0f,
0.377964f, -0.327321f, 0.866025f, 0.0f,
0.0f, 0.0f, 0.0f, 3.0f
};
// Изометрическая проекция
GLfloat mIso[4][4] = {
0.707107f, 0.408248f, -0.577353f, 0.0f,
0.0f, 0.816597f, 0.577345f, 0.0f,
0.707107f, -0.408248f, 0.577353f, 0.0f,
0.0f, 0.0f, 0.0f, 3.0f
};
// Произвольная проекция
GLfloat mTwo[4][4] = {
0.5f, 0.0f, 0.866f,-2.0f,
0.0f, 1.0f, 0.0f, -1.0f,
-0.866f, 0.0f, 0.5f, 1.0f,
-0.866f, 0.0f, 0.5f, 2.0f
};
GLfloat aspect = 1.0f;
glLoadMatrixf(&mDim[0][0]);
glOrtho(-2.0f, 3.0f,
-3.0, 2.0f,
-20.0, 20.0);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
gluLookAt(5.0f, 5.0f, 10.0f, 0.0f, 0.0f, 0.0f, 1.0f, 1.0f, 1.0f);
}
Соседние файлы в папке Projections