Автор работы: Пользователь скрыл имя, 20 Ноября 2010 в 19:56, Не определен
Для выполнения курсовой работы студенту необходимо написать программу, осуществляющую визуализацию заданного трехмерного объекта (метод визуализации – каркасный, т.е. без удаления невидимых линий) и позволяющую пользователю управлять перемещениями и трансформациями объекта и/или наблюдателя.
glEnable(GL_DEPTH_TEST);
glDepthFunc(GL_LEQUAL);
glHint(GL_PERSPECTIVE_
//
Улучшение в вычислении
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_
glLoadIdentity();
glTranslatef(-2.3f,0.0f,
glRotatef(rtri,
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(
}
if (!wglDeleteContext(hRC)) // Возможно ли удалить RC?
{
MessageBox(
}
hRC=NULL; // Установить RC в NULL
}
if (hDC && !ReleaseDC(hWnd,hDC))// Возможно ли уничтожить DC?
{
MessageBox(NULL,"
hDC=NULL;// Установить DC в NULL
}
if (hWnd && !DestroyWindow(hWnd)) // Возможно ли уничтожить окно?
{
MessageBox(NULL,"
hWnd=NULL;// Установить hWnd в NULL
}
if
(!UnregisterClass("OpenGL",
// Возможно ли разрегистрировать класс
{
MessageBox(NULL,"
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;
WindowRect.right=(long)
в Width
WindowRect.top=(long)0;/
WindowRect.bottom=(long)
// Установить нижнюю составляющую в Height
Fullscreen=
// Устанавливаем значение глобальной переменной 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,"
return FALSE; // Выход и возвращение функцией значения false
}
if (fullscreen)// Полноэкранный режим?
{
DEVMODE dmScreenSettings;// Режим устройства
memset(&
// Очистка для хранения установок
dmScreenSettings.
// Размер структуры Devmode
dmScreenSettings.
dmScreenSettings.
dmScreenSettings.
dmScreenSettings.
// Пытаемся установить выбранный режим и получить результат. Примечание: CDS_FULLSCREEN убирает панель управления.
if(
{
// Если переключение
в полноэкранный режим
if (MessageBox(NULL,"The Requested
Fullscreen Mode Is Not Supported By\nYour Video Card. Use Windowed Mode
Instead?","NeHe GL",MB_YESNO|MB_
{
fullsc
// Выбор оконного режима (fullscreen = false)
}
else
{
// Выскакивающее окно, сообщающее пользователю о закрытие окна.
Messag
return FALSE;// Выход и возвращение функцией false
}
}
}
dwExStyle=WS_EX_
dwStyle=WS_
AdjustWindowRectEx(&
// Подбирает окну подходящие
if
(!(hWnd=CreateWindowEx(
"OpenGL", // Имя класса
title, // Заголовок окна
dwStyle | // Выбираемые стили для окна
WS_CLIPSIBLINGS |// Требуемый стиль для окна
WS_CLIPCHILDREN, // Требуемый стиль для окна
0, 0, // Позиция окна
WindowRect.right-
// Вычисление подходящей ширины
WindowRect.bottom-
// Вычисление подходящей высоты
NULL, // Нет родительского
NULL, // Нет меню
hInstance, // Дескриптор приложения
NULL))) // Не передаём ничего до WM_CREATE (???)
{
KillGLWindow(); // Восстановить экран
MessageBox(NULL,"
return FALSE; // Вернуть false
}
static
// pfd сообщает Windows каким будет вывод на экран каждого пикселя
{
sizeof(
// Размер дескриптора данного формата пикселей
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,"
return FALSE;// Вернуть false
}
if
(!(PixelFormat=
// Найден ли подходящий формат пикселя?
{
KillGLWindow(); // Восстановить экран
MessageBox(NULL,"
return FALSE;// Вернуть false
}
if(!SetPixelFormat(hDC,
// Возможно ли установить Формат Пикселя?
{
KillGLWindow(); // Восстановить экран
MessageBox(NULL,"
Информация о работе Моделирование и визуализация трехмерного объекта сложной формы