Трехмерная визуализация при помощи OpenGL
Данная статья посвящена простому примеру использования открытой графической библиотеки (OpenGL), построению простейшего трехмерного графика по двухмерному массиву точек со значениями по третей координате.
В наше время многие уже отказались от "самописного" программного обеспечения на OpenGL с использованием инструментария C/C++, т.к. многим просто достаточно использовать autocad или прочие программы для построения трехмерных изображений, так же реализующие простейшие трехмерные преобразования (вращение, перемещение в плоскости и т.д.). Литературы уже тоже предостаточно для изучения принципов OpenGL. Тем не менее иногда необходимо сделать своеобразный функционал, не поддерживаемый ни одной библиотекой или программой, а может просто встроить трехмерную картинку в среду разработки. В данной статье рассмотрен простой пример использования библиотеки, а так же затронуты несколько основных моментов.
Немного о самой программе и ее исходном коде.
void CMfcView::DrawGraph_Textured(double m, double mx, double my, double mz)
void CMfcView::DrawGraph_Wire(double m, double mx, double my, double mz)
void CMfcView::DrawGraph(double m, double mx, double my, double mz)
файла MfcView.cpp отвечают за отрисовку трехмерного графика различным способом - при помощи текстур, накладывают проволочный каркас между точками и обычная отрисовка графика.
Структура каждой функции довольна простая, выбираем масштаб по оси Z
float Matrix_z[4];
for (int i = 0; i < Matrix.y - 1; i++)
for (int j = 0; j < Matrix.x - 1; j++)
{
Matrix_z[0] = Matrix.mat[i*Matrix.x + j];
Matrix_z[1] = Matrix.mat[(i+1)*Matrix.x + j];
Matrix_z[2] = Matrix.mat[i*Matrix.x + (j+1)];
Matrix_z[3] = Matrix.mat[(i+1)*Matrix.x + (j+1)];
glColor3d(1,0,0);
if (m*(i+1) <= Matrix.y && m*(j+1) <= Matrix.x)
{
glBegin(GL_TRIANGLES);
glVertex3d( mx*m*j, my*m*i, mz*Matrix_z[0]);
glVertex3d( mx*m*(j+1), my*m*i, mz*Matrix_z[2]);
glVertex3d( mx*m*(j+1), my*m*(i+1), mz*Matrix_z[3]);
glEnd();
glBegin(GL_TRIANGLES);
glVertex3d( mx*m*j, my*m*i, mz*Matrix_z[0]);
glVertex3d( mx*m*j, my*m*(i+1), mz*Matrix_z[1]);
glVertex3d( mx*m*(j+1), my*m*(i+1), mz*Matrix_z[3]);
glEnd();
}
}
void CMfcView::DrawGraph_Dephed1(double m, double mx, double my, double mz, float Sum, float Dif)
Более сложная функция, рисует график, причем цвет каждой точки выбирается исходя из значения точки в двумерном массиве, mx, my, mz - масштабы по соответствующим осям. Между glBegin b glEnd описываем координаты трех точек, между которыми проводим полигон (соединяем). С помощью двух циклов в начале мы проходимся по всем рядом стоящим трем точкам на нашем графике и соединяем их полигонами, таким образом и получается трехмерный график.
void CMfcView::display()
Собственно рисует нашу сцену, сохранет все вращения и перемещиния объектов.
int CMfcView::SetWindowPixelFormat(HDC hDC)
Создает в окне стандартными средствами MFC поля для деятельности OpenGL.
Ссылка на исходный код и саму программу. Программа была написана довольно давно, поэтому использовался инструментарий MFC в среде visual studio. В более современных средах смысл не поменялся :) Программное обеспечение с примерами лежит в папке Release.
P.S. Код я писал еще студентом, со всеми вытекающими последствиями. Яркий пример того, что может сделать студент при большом желании и небольшом опыте :). Но программа абсолютно исправно работает, я ее иногда использую и сейчас, из нее можно подчеркнуть много полезного. Впрочем и сама технология MFC безвозвратно устарела...