Трехмерная визуализация при помощи OpenGL

 

opengl

Данная статья посвящена простому примеру использования открытой графической библиотеки (OpenGL), построению простейшего трехмерного графика по двухмерному массиву точек со значениями по третей координате.

 

В наше время многие уже отказались от "самописного" программного обеспечения на OpenGL с использованием инструментария C/C++, т.к. многим просто достаточно использовать autocad или прочие программы для построения трехмерных изображений, так же реализующие простейшие трехмерные преобразования (вращение, перемещение в плоскости и т.д.). Литературы уже тоже предостаточно для изучения принципов OpenGL. Тем не менее иногда необходимо сделать своеобразный функционал, не поддерживаемый ни одной библиотекой или программой, а может просто встроить трехмерную картинку в среду разработки. В данной статье рассмотрен простой пример использования библиотеки, а так же затронуты несколько основных моментов.

 

3d 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 безвозвратно устарела...