
- •Введение
- •1. Исходные данные на проектирование
- •2. Выбор решения
- •2.1. Определение модулей программы
- •2.2. Создание и редактирование модели заданного объекта средствами Blender
- •3. Библиотека OpenGl
- •4. Схема программы
- •4.1. Схема работы приложения
- •Инициализация программы void Init() Опрос клавиатуры и мыши Пользователь хочет закрыть окно? Конец Вывод кадра void Main()
- •Init() – установка начального освещения, позиции камеры, загрузки модели
- •5.2. Функциональная структура программы
- •Заключение
- •Литература
- •Приложения Приложение 1. Листинг программы
- •Приложение 2. Скриншоты работающей программы
4. Схема программы
4.1. Схема работы приложения
Начало
Инициализация программы void Init() Опрос клавиатуры и мыши Пользователь хочет закрыть окно? Конец Вывод кадра void Main()
4.2. Схема данных программы
Пользователь
Операционная система Windows
Устройства ввода
Монитор
Приложение Obj.exe
CObj – класс для хранения 3d модели
Run() – цикл обработки сообщений Windows
struct cmd – буфер клавиатуры
struct bubbles[] - структура, содержащая позицию пузырьков(для аним)
IN_MouseMove();
Key_Event() - обработка движения мыши и нажатий кнопок клавиатуры
Init() – установка начального освещения, позиции камеры, загрузки модели
Main() – отрисовка одного кадра с анимацией
4.3. Схема работы приложения в среде Windows
Начало
Инициализация окна
Выделение памяти
Загрузка модели
Сканирование событий
Событие
Обработка события и вывод кадра
cmd[27]=1?
Конец
4.4. А
Конец
Открытие файла
Конец
файла
Считывание строки файла obj
“v “
“f “
“vn“
“vt“
Грани
Вершины
Нормали
лгоритм загрузки модели obj
Начало
Текстурные коородинаты
Переход на следующую строку
5. Описание программы
5.1. Описание функций и структур программы
В программе используются следующие структуры и данные:
Буфер нажатий кнопок (0-не нажата кнопка, 1-нажата)
char cmd[1024];
Углы поворота
float angles[3];
Позиция камеры
float org[3];
Скорость камеры
float orgspeed[3];
Ускорение камеры
float orgvel[3];
Пузырьки
struct _bubble {
//Координаты
float x,y,z;
//Скорость
float vx,vy,vz;
} bubble[100];
Структуры для математического описания векторов
struct Vector3
{
float m_fVec[3];
Vector3(float * fVec)
{
memcpy(m_fVec, fVec, sizeof(float[3]));
}
};
struct Vector2
{
float m_fVec[2];
Vector2(float * fVec)
{
memcpy(m_fVec, fVec, sizeof(float[2]));
}
};
Структура индексов вершин граней (нужна для отображения через opengl)
struct SObjFace
{
unsigned int m_uiVertIdx[3];
unsigned int m_uiTexCoordIdx[3];
unsigned int m_uiNormalIdx[3];
SObjFace(int * ipData)
{
//Копируем данные в нужном порядке
m_uiVertIdx[0] = ipData[0]-1;
m_uiVertIdx[1] = ipData[1]-1;
m_uiVertIdx[2] = ipData[2]-1;
m_uiTexCoordIdx[0] = ipData[3]-1;
m_uiTexCoordIdx[1] = ipData[4]-1;
m_uiTexCoordIdx[2] = ipData[5]-1;
m_uiNormalIdx[0] = ipData[6]-1;
m_uiNormalIdx[1] = ipData[7]-1;
m_uiNormalIdx[2] = ipData[8]-1;
}
};
В программе используются следующие функции:
Функция обработки движения мыши – используется для поворота камеры
void IN_MouseMove();
Функция, которая обрабатывает нажатия кнопок, вызывается каждый кадр для события нажатия и отпускания кнопок
void Key_Event (int key, int key1, int down, unsigned time);
Функция, обрабатывающая события мыши
void IN_MouseEvent (int mstate);
Функции для перемещения камеры
void forward();
void backword();
void left();
void right();
Вызывается когда окно получает фокус ввода
void IN_ActivateMouse(void);
Вызывается когда окно теряет фокус ввода
void IN_DeactivateMouse (void)
Функция главного цикла программы (отрисовывает 1 кадр)
void Main()
Функция Начальной инициализации ламп, мешей
void Init()
Точка входа в программу (main или WinMain). Основная функция
int WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int)
В программе используются следующие классы:
Класс Capp – Класс создания приложения Obj.exe
Функции класса:
void Init() - инициализация приложения
bool CreateWnd() – создание окна Windows заданных размеров
void CreateFnt() – создание шрифта
void Print() – печать строки на экран
void Log() – написать строку в файл
void Destroy() – закрыть приложение
float GetFPS() – получить кол-во кадров в секунду
HWND GetHwnd() – получить указатель окна
void Run() - запустить бесконечный цикл обработки сообщений Windows
Данные класса:
unsigned sys_msg_time; - системное время
unsigned sys_frame_time; - время отображаемого кадра
Класс CImage – Класс загрузки текстур
bool Load() – загрузка изображения
void Bind() - назначить текстуру на обьект
void UnBind() – снять назначение текстуры с обьекта
void VFlip() – перевернуть картинку вертикально
static void ScreenShot(char * szDstFile = "screenshot.tga") – сделать скриншот
Класс Clog – Класс, который позволяет вывести логотип приложения (картинку с надписью «КИРИЛЛ»)
bool Init() – инициализация логотипа
void Write() – вывод логотипа
Класс CTimer – класс замера времени
void Init() – инициализация таймера
float GetFPS() – получение количества кадров в секунду
unsigned int GetMS() – получение количества миллисекунд, прошедших с последнего вызова
float GetSeconds() - получение количества секунд, прошедших с последнего вызова
Класс CWindow – Класс для создания окна (window)
static bool Create() – создание окна
static void Resize() – реализация окна
static void Destroy() – закрытие окна
static void CreateFnt() – создание шрифта
static void Print() – вывод символов на экран
static void BufferSwap() – смена буферов
Класс CModel – Класс загрузки 3d моделей
virtual bool Load() – загружает модель из файла
virtual void Render() – рендеринг модели
Класс CObj – Основной класс
bool Load(const char * szFilename, char *szTexName) – загрузка модели и текстуры
void PartBind() – установка текстуры для всех частиц
void RenderPart() – рендеринг частиц
void Render() – рендеринг обычной модели
void SetSkin() – установление другой текстуры для модели
//Конструктор по умолчанию
CObj() – конструктор по умолчанию
CObj(const char * szFilename, char *szTexName) – конструктор с загрузкой файла модели и текстуры