Моделирование и визуализация трехмерного объекта сложной формы

Автор работы: Пользователь скрыл имя, 20 Ноября 2010 в 19:56, Не определен

Описание работы

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

Файлы: 1 файл

курсач(2 вариант)1.doc

— 232.00 Кб (Скачать файл)

Оглавление

Введение.

1.Теоритическая  часть.

1.1.  Аффинные преобразования.

1.2. OpenGL.

1.3. Ортографическая проекция.

2. Программа.

3.Результаты  работы программы.

4. Заключение. 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

      Введение.

  Постановка задачи.

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

     Исходными данными для выполнения курсовой работы являются: трехмерный объект, виды его трансформаций и/или перемещений  в пространстве, тип проекции.

Вид объекта.

     2 – гантеля (две сферы + цилиндр); 

Тип перемещений и трансформаций объекта.

     8 – выполняется масштабирование  объекта вдоль осей x и y, вращение объекта вокруг оси y.; тип проекции – кабине;

     Результаты  проделанной работы должны быть представлены в виде пояснительной записки и программы, работу которой необходимо продемонстрировать непосредственно на компьютере. Текст записки должен содержать описание геометрической модели объекта, используемые формулы, распечатки получаемых изображений объекта (изображение объекта сразу после запуска программы, изображение объекта после выполнения над ним заданных действий). В приложении к записке следует привести текст разработанной программы с комментариями. 

Для решения  была выбрана среда программирования OpenGL. По следующим критериям:

  1. Простота освоения
  2. Наличие эффективных решений
  3. «Мощность программной среды»
  4. Удобство программирования графических объектов.

1.Теоретическая часть.

1а.  Аффинные преобразования.

Определение 1.

Преобразование  плоскости называется аффинным, если оно взаимно однозначно и образом любой прямой является прямая. Преобразование называется взаимно однозначным, если оно разные точки переводит в разные, и в каждую точку переходит какая-то точка. 

Частным случаем  аффинных преобразований являются просто движения (без какого-либо сжатия или растяжения). Движения — это параллельные переносы, повороты, различные симметрии и их комбинации.

Другой важный случай аффинных преобразований —  это растяжения и сжатия относительно прямой. Преобразование - это отображение множества на само себя. Отображение называется взаимооднозначным (биективным), если разные элементы переходят в разные, и в каждый элемент, какой-то элемент переходит.

Определение 2.

Множество движений есть подмножество множества аффинных преобразований. 

Кроме движений плоскости аффинные преобразования содержат еще сжатия и растяжения относительно прямой. Если мы применим растяжение относительно одной прямой, а потом относительно другой прямой, то снова получим аффинное преобразование, так как и первое, и второе растяжение сохраняло прямые и разные точки переводило в разные.

       Любое аффинное преобразование в трехмерном пространстве может быть представлено в виде суперпозиции вращений, растяжений, отражений и переносов. Поэтому вполне уместно, сначала подробно описать матрицы именно этих преобразований (ясно, что в данном случае порядок матриц должен быть равен четырем).

       А. Матрицы вращения в пространстве.

       Матрица вращения вокруг оси абсцисс на угол  j:

1      0            0         0

  1. cos j sin j 0

                        0    -sin j cos j    0

0         0         0         1

              Матрица вращения вокруг оси ординат на угол y:      

cos y      0   -sin y   0

    0         1 0 1

sin y     0 cos y    0

0         0         0         1 
 
 

       Матрица вращения вокруг оси аппликат на угол c:

cos c   sin c     0      0

                        c cos c 0      0

0         0 1     0

0       0          0      1

       Полезно обратить внимание на место знака  “ - ” в каждой из трех приведенных  матриц.

       Б. Матрица растяжения-сжатия:

a 0 0 0

0 b 0 0

                        0 0 g 0

0 0 0 1

где

       a > 0 – коэффициент растяжения (сжатия) вдоль оси абсцисс;

       b > 0 – коэффициент растяжения (сжатия) вдоль оси ординат;

       g > 0 – коэффициент растяжения (сжатия) вдоль оси аппликат.

В. Матрицы отражения

           Матрица отражения относительно  плоскости ху:

                                                          1 0 0 0

      0 1 0 0

0 0 -1 0

0 0 0 1 
 

         Матрица отражения  относительно плоскости yz:

-1 0 0 0

      [Mx]=  0 1 0 0

0 0 1 0

0 0 0 1

           Матрица отражения относительно плоскости zx:

1 0 0 0

      [My]=     0 -1 0 0

0 0 1 0

0 0 0 1

       Г. Матрица переноса (здесь (l, m, n) - вектор переноса):

1 0 0 0                               

    0 1 0 0

0 0 1 0

l m n 1 

1б.  OpenGL

     OpenGL (Open Graphics Library — открытая графическая  библиотека) — спецификация, определяющая  независимый от языка программирования  кросс-платформенный программный  интерфейс для написания приложений, использующих двумерную и трёхмерную  компьютерную графику.

     Включает  более 250-ти функций для рисования  сложных трёхмерных сцен из простых  примитивов. Используется при создании компьютерных игр, САПР, виртуальной  реальности, визуализации в научных  исследованиях. На платформе Windows конкурирует  с Direct3D.

      Каркасная модель — модель объекта в трехмерной графике, представляющая собой совокупность вершин и ребер, которая определяет форму отображаемого многогранного объекта. 

1в.  Ортографическая  проекция

Ортографическая проекция-  это изображение какого-нибудь предмета на плоскости, посредством проектирования отдельных его точек при помощи перпендикуляров к этой плоскости. В О. проекции предметы представляются такими, какими они представлялись бы наблюдателю, смотрящему на них с бесконечного расстояния.

2.Программа

       Любое аффинное преобразование в трехмерном пространстве может быть представлено в виде суперпозиции вращений, растяжений, отражений и переносов. Поэтому вполне уместно, сначала подробно описать матрицы именно этих преобразований (ясно, что в данном случае порядок матриц должен быть равен четырем). 
 
 
 
 

Программа

Текст программы:

//--------------------------------------------------------------------------- 

#include <windows.h> // Заголовочные файлы для Windows  

#include "C:\Dev-Cpp\include\gl\gl.h" // Заголовочные файлы для библиотеки OpenGL32 

#include "C:\Dev-Cpp\include\gl\glu.h" // Заголовочные файлы для библиотеки GLu32  

#include "C:\Dev-Cpp\include\gl\glaux.h" // Заголовочные файлы для библиотеки GLaux 

HDC   hDC=NULL;  // Постоянный контекст рендеринга

HGLRC  hRC=NULL; // Приватный контекст устройства GDI

HWND  hWnd=NULL; // Здесь будет хранится дескриптор окна

HINSTANCE hInstance;    // Здесь будет хранится дескриптор приложения 

bool keys[256];    // Массив, используемый для операций с клавиатурой

bool active=TRUE;  // Флаг активности окна, установленный в true по умолчанию

bool fullscreen=FALSE;           // Флаг режима окна, установленный в полноэкранный по умолчаниюfloat i=0;

static GLfloat rtri;   // Угол для фигуры

LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM); 

// Прототип функции WndProc

GLvoid ReSizeGLScene(GLsizei width, GLsizei height)  // Изменить размер и инициализировать окно GL

{

      if (height==0)    // Предотвращение деления на ноль

      

        height=1;         

      }

      glViewport(0,0,width,height);  // Сброс текущей области вывода

      glMatrixMode(GL_PROJECTION); // Выбор матрицы проекций

      glLoadIdentity();           // Сброс матрицы проекции

  gluPerspective(45.0f,(GLfloat)width//(GLfloat)height,0.1f,100.0f);

   // Вычисление соотношения геометрических размеров для окна

      glMatrixMode(GL_MODELVIEW);  // Выбор матрицы вида модели

      glLoadIdentity();       // Сброс матрицы вида модели

}

int InitGL(GLvoid)  // Все установки касаемо OpenGL происходят  здесь

{

glShadeModel(GL_SMOOTH);// Разрешить плавное цветовое сглаживание

      glClearColor(0.0f, 0.0f, 0.0f, 0.5f);// Очистка экрана в черный  цвет

      glClearDepth(1.0f);       // Разрешить очистку буфера глубины

Информация о работе Моделирование и визуализация трехмерного объекта сложной формы