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

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

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

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

Файлы: 1 файл

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

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

      glEnable(GL_DEPTH_TEST);   // Разрешить тест глубины

      glDepthFunc(GL_LEQUAL);    // Тип теста глубины

      glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST);

      // Улучшение в вычислении перспективы

      return TRUE;  // Инициализация прошла успешно

}

                   static float Route=0.15;

                   static float Depth=-6.0;

                   static float MasRotate[3]={0.0f,0.0f,0.0f};

            int DrawGLScene(GLvoid)

{

      glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

      glLoadIdentity();

      glTranslatef(-2.3f,0.0f,Depth);

      glRotatef(rtri,MasRotate[0],MasRotate[1],MasRotate[2]);

   

    glColor3f(1.0f,0.0f,0.0f);  

    auxWireSphere(1.0);

    glTranslatef(4.4f,0.0f,0.0f);

    auxWireSphere(1.0);            

     glColor3f(2.0f,2.0f,0.0f); 

     glTranslatef(-1.7f,0.0f,0.0f);

     glRotatef(180,1,1,0);

    auxWireCylinder(0.4, 3.0);

     rtri-=Route;

     return TRUE;

}

GLvoid KillGLWindow(GLvoid) // Корректное разрушение окна

      {

    if (fullscreen )              // Мы в полноэкранном режиме?

      {

             ChangeDisplaySettings(NULL,0);

// Если да, то  переключаемся обратно в оконный  режим

            ShowCursor(TRUE);          // Показать курсор мышки

      }

      if (hRC)// Существует ли Контекст Рендеринга?

      {

            If  (!wglMakeCurrent(NULL,NULL))

                             // Возможно ли освободить RC и DC?

            {

                  MessageBox(NULL,"Release Of DC And RC Failed.","SHUTDOWN ERROR",MB_OK | MB_ICONINFORMATION);

            }

            if (!wglDeleteContext(hRC)) // Возможно ли удалить RC?

            {

                  MessageBox(NULL,"Release Rendering Context Failed.","SHUTDOWN ERROR",MB_OK | MB_ICONINFORMATION);

            }

            hRC=NULL; // Установить RC в NULL

      }

      if (hDC && !ReleaseDC(hWnd,hDC))// Возможно ли уничтожить DC?

      {

            MessageBox(NULL,"Release Device Context Failed.","SHUTDOWN ERROR",MB_OK | MB_ICONINFORMATION);

            hDC=NULL;// Установить DC в NULL

      }

      if (hWnd && !DestroyWindow(hWnd)) // Возможно ли уничтожить окно?

      {

            MessageBox(NULL,"Could Not Release hWnd.","SHUTDOWN ERROR",MB_OK | MB_ICONINFORMATION);

            hWnd=NULL;// Установить hWnd в NULL

      }

      if (!UnregisterClass("OpenGL",hInstance))

                  // Возможно ли  разрегистрировать класс

      {

            MessageBox(NULL,"Could Not Unregister Class.","SHUTDOWN ERROR",MB_OK | MB_ICONINFORMATION);

            hInstance=NULL; // Установить hInstance в NULL

      }

}

BOOL CreateGLWindow(char* title, int width, int height, int bits, bool fullscreenflag)

{

      GLuint  PixelFormat; // Хранит результат после  поиска

      WNDCLASS  wc; // Структура класса окна

      DWORD dwExStyle; // Расширенный стиль окна

      DWORD dwStyle; // Обычный стиль окна

      RECT WindowRect;

      WindowRect.left=(long)0;          // Установить левую составляющую в 0

      WindowRect.right=(long)width; // Установить правую составляющую                              

             в Width

      WindowRect.top=(long)0;// Установить верхнюю составляющую  в 0

      WindowRect.bottom=(long)height;

      // Установить нижнюю составляющую в Height

      Fullscreen=fullscreenflag;

            // Устанавливаем значение глобальной переменной fullscreen

      hInstance= GetModuleHandle(NULL);

// Считаем дескриптор нашего приложения

      wc.style= CS_HREDRAW | CS_VREDRAW | CS_OWNDC; 

   // Перерисуем при перемещении и создаём скрытый DC

      wc.lpfnWndProc= (WNDPROC) WndProc; 

   // Процедура обработки сообщений

      wc.cbClsExtra= 0; // Нет дополнительной информации для окна

      wc.cbWndExtra= 0;// Нет дополнительной информации для окна

      wc.hInstanc = hInstance; // Устанавливаем дескриптор

      wc.hIcon= LoadIcon(NULL, IDI_WINLOGO);

       // Загружаем иконку по умолчанию

      wc.hCursor = LoadCursor(NULL, IDC_ARROW);

        // Загружаем указатель мышки

      wc.hbrBackground= NULL;// Фон не требуется для GL

      wc.lpszMenuName= NULL;// Меню в окне не будет

      wc.lpszClassName = "OpenGL";// Устанавливаем имя классу 

      if (!RegisterClass(&wc))  // Пытаемся зарегистрировать класс окна

      {

            MessageBox(NULL,"Failed To Register The Window Class.","ERROR",MB_OK|MB_ICONEXCLAMATION);

            return FALSE; // Выход и  возвращение функцией значения false

      }

      if (fullscreen)// Полноэкранный режим?

      {

            DEVMODE dmScreenSettings;// Режим  устройства

            memset(&dmScreenSettings,0,sizeof(dmScreenSettings));

      // Очистка для хранения установок

            dmScreenSettings.dmSize=sizeof(dmScreenSettings); 

      // Размер структуры Devmode

            dmScreenSettings.dmPelsWidth= width;// Ширина экрана

            dmScreenSettings.dmPelsHeight= height;// Высота экрана

            dmScreenSettings.dmBitsPerPel= bits;// Глубина цвета

            dmScreenSettings.dmFields=DM_BITSPERPEL|DM_PELSWIDTH|DM_PELSHEIGHT;           // Режим Пикселя

            // Пытаемся установить  выбранный режим и получить  результат.  Примечание: CDS_FULLSCREEN убирает  панель управления.

            if(ChangeDisplaySettings(&dmScreenSettings,CDS_FULLSCREEN)!=DISP_CHANGE_SUCCESSFUL)

            {

            // Если переключение  в полноэкранный режим невозможно, будет предложено два варианта: оконный режим или выход.

                  if (MessageBox(NULL,"The Requested Fullscreen Mode Is Not Supported By\nYour Video Card. Use Windowed Mode Instead?","NeHe GL",MB_YESNO|MB_ICONEXCLAMATION)==IDYES)

                  {

                        fullscreen=FALSE;

// Выбор оконного режима (fullscreen = false)

                  }

                  else

                  {

      // Выскакивающее окно, сообщающее  пользователю о закрытие окна.

                        MessageBox(NULL,"Program Will Now Close.","ERROR",MB_OK|MB_ICONSTOP);

                        return FALSE;// Выход и  возвращение функцией false

                  }

            }

      }

            dwExStyle=WS_EX_APPWINDOW | WS_EX_WINDOWEDGE;   // Расширенный стиль окна

            dwStyle=WS_OVERLAPPEDWINDOW;       // Обычный стиль окна 

      AdjustWindowRectEx(&WindowRect, dwStyle, FALSE, dwExStyle); 

            // Подбирает окну подходящие размеры

      if (!(hWnd=CreateWindowEx( dwExStyle,// Расширенный стиль для окна

            "OpenGL", // Имя  класса

                title,        // Заголовок окна

            dwStyle |   // Выбираемые стили для окна

            WS_CLIPSIBLINGS |// Требуемый  стиль для окна

            WS_CLIPCHILDREN, // Требуемый  стиль для окна

            0, 0,                         // Позиция окна

            WindowRect.right-WindowRect.left,

      // Вычисление подходящей ширины

            WindowRect.bottom-WindowRect.top,

      // Вычисление подходящей высоты

            NULL, // Нет родительского

            NULL, // Нет меню

            hInstance, // Дескриптор приложения

                     NULL))) // Не передаём ничего до WM_CREATE (???)

      {

            KillGLWindow(); // Восстановить экран

            MessageBox(NULL,"Window Creation Error.","ERROR",MB_OK|MB_ICONEXCLAMATION);

            return FALSE;  // Вернуть false

      }

      static PIXELFORMATDESCRIPTOR pfd=

      // pfd сообщает Windows каким будет вывод на экран каждого пикселя

      {

            sizeof(PIXELFORMATDESCRIPTOR),

                         // Размер дескриптора  данного формата пикселей

            1,      // Номер версии

            PFD_DRAW_TO_WINDOW | // Формат для Окна

            PFD_SUPPORT_OPENGL |// Формат для OpenGL

            PFD_DOUBLEBUFFER, // Формат для двойного буфера

            PFD_TYPE_RGBA,   // Требуется RGBA формат

            bits,    // Выбирается бит глубины цвета

            0, 0, 0, 0, 0, 0,   // Игнорирование цветовых битов

            0,     // Нет буфера прозрачности

            0,    // Сдвиговый бит игнорируется

            0,    // Нет буфера накопления

            0, 0, 0, 0,   // Биты накопления игнорируются

            16,    // 16 битный Z-буфер (буфер глубины)

            0,    // Нет буфера трафарета

            0,    // Нет вспомогательных буферов

            PFD_MAIN_PLANE, // Главный слой рисования

            0,    // Зарезервировано

            0, 0, 0    // Маски слоя игнорируются

      };

      if (!(hDC=GetDC(hWnd)))

// Можем ли  мы получить Контекст Устройства?

      {

            KillGLWindow(); // Восстановить экран

            MessageBox(NULL,"Can't Create A GL Device Context.","ERROR",MB_OK|MB_ICONEXCLAMATION);

            return FALSE;// Вернуть false

      }

      if (!(PixelFormat=ChoosePixelFormat(hDC,&pfd)))

      // Найден ли подходящий формат  пикселя?

      {

            KillGLWindow(); // Восстановить экран

            MessageBox(NULL,"Can't Find A Suitable PixelFormat.","ERROR",MB_OK|MB_ICONEXCLAMATION);

            return FALSE;// Вернуть false

      }

      if(!SetPixelFormat(hDC,PixelFormat,&pfd))

            // Возможно ли  установить Формат Пикселя?

      {

            KillGLWindow(); // Восстановить экран

            MessageBox(NULL,"Can't Set The PixelFormat.","ERROR",MB_OK|MB_ICONEXCLAMATION);

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