Task 3 (1126109), страница 2
Текст из файла (страница 2)
Бинарники для Windows можно скачать тут и тут. Проектдля Visual Studio работает с локальными копиями библиотек, которые предоставляются вместес шаблоном. В линукс НЕОБХОДИМА установка библиотек из репозитория (apt-get install freeglut,apt-get install glew).В линукс запускать программу рекомендуется вызовом из терминала ./main в папке bin/bin,построенного make. Запуск из иной директории может не удасться, поскольку используютсяотносительные пути к шейдерам.
При разработке своего приложения вы можете исправить это,воспользовавшись платформенно-зависимыми средствами.Перед запуском программы убедитесь, что:вы обновили драйверы видеокартывы установили необходимые библиотекиУзнать текущую версию OpenGL можно командами:Linux (необходима установка mesa-utils)glxinfo | grep -i openglWindows1) запуск glew\bin\Release\Win32\glewinfo.exe2) открываете файл glewinfo.txt и читаете, что там написано. Вас интересует в первую очередьстрока видаOpenGL version 4.4.0 is supportedДля запуска шаблона там должна быть версия не ниже 3.2.73) Для работы с векторами и матрицами можно использовать библиотеку glm, или любуюдругую на ваш вкус.4) Для загрузки .3ds моделей можно использовать библиотеку l3ds.5) Данные:Параметры основных объектов Солнечной системы в таблицеФизические параметры планет, Текстуры планет, База данных малых небесных тел, моделикосмических кораблей.6) Координаты известных объектов в заданное времяНастройки для получения значений в нашей системе координат (единицы измерения:километры, секунды):5 Ресурсы для изучения OpenGL 3 иOpenGL41) Самый главный источник информации http://www.opengl.org/documentation/2) Обучающие примеры:https://code.google.com/p/gl33lessons/http://nehe.gamedev.net/ (Перевод) http://www.opengl-tutorial.org/beginners-tutorials/ OpenGL 3.3 http://www.gamedev.ru/code/forum/?id=138435 OpenGL 4 http://www.gamedev.ru/code/articles/tags/OpenGL3) Теоретические пособия:http://duriansoftware.com/joe/An-intro-to-modern-OpenGL.-Table-of-Contents.html http://www.arcsynthesis.org/gltut/4) Полезный ресурс при выполнении бонусных заданий http://steps3d.narod.ru/6 Правила оформления работыВ присланном архиве должно быть 2 подпапки: src с исходным кодом и bin с исполняемым.Также туда может быть помещен readme c примечаниями, куда вы должны записать пункты из8бонусной части, которые вы реализовали.
В противном случае проверяющий может пропуститьналичие реализации бонуса. Также в файле нужно отобразить информацию по управлениюкамерой и настройками программы, если оно нетривиально.При разработке для Windows в папке bin должны быть exe файл, шейдеры и дополнительныебиблиотеки (см. как, например, сделано в шаблоне).При разработке для Linux в каталоге src или в корне архива должен быть Makefile, которыйсформирует аналогичный вывод в папку bin (примерно как в шаблоне).7 Подсказки к решению: база7.1 Расчет движения планетПри расчете движения планет можно использовать один из 2 вариантов:Модель Кеплера движения каждой планеты по своей орбите в отдельностиГравитационную модель взаимодействия всех планет со всеми, т.е.
приближённоерешение задачи N тел7.1.1 Глобальные координатыO - неподвижная точка и центр глобальных координат. Плоскость орбиты Земли будемсчитать плоскостью эклиптики, она также неподвижна. На плоскости эклиптики выбранонекоторое направление, соответствующее т.н. точке весеннего равноденствия. Зададим оси так:X - направление из центра Солнца в точку осеннего равноденствияZ - перепендикуляр к плоскости эклиптики, направленный в сторону земного севераY задана так, что XYZ - правый ортонормированный базис.7.1.2 О дискретизацииРекомендуется записывать все величины в системе СИ (т.е. расстояние в метрах, массу вкилограммах, время в секундах) и использовать для хранения их переменные double.При расчётах координат планет использовать шаг дискретизации ∆t по времени в 10-100 разменьше, чем время отрисовки кадра, но не более 1 часа при быстрой анимации.7.1.3 Расчет движения планеты по модели КеплераСчитаем, что центр Солнца лежит в центре глобальных координат, Солнце неподвижно.1) Орбита в глобальных координатах.9Орбита планеты является эллипсом, один из фокусов которого - центр Солнца.
Параметрыорбиты (форма и положение) однозначно определяются Кеплеровыми элементами орбиты.Нужно вычислить по ним локальный базис орбиты для удобства преобразования координат:O - геометрический центр эллипса орбиты (не Солнце)X сонаправлена с большей осью орбитыZ направлена в сторону севераY сонаправлена с меньшей осью орбиты, XYZ - ортонормированный базис2) Координаты центра планеты в плоскости ее орбитыЗадание начальных координат и начальной скорости планеты в нулевой момент времениВычисление координат планеты в следующий момент времени (текущий момент времени+ ∆t) из закона площадей (2 закон Кеплера).
Его можно использовать приближённо, т.е.считать площади треугольников, а не эллиптических секторов.Таким образом, сначала вычисляются относительные двумерные координаты планеты на орбите,затем они преобразуются в глобальные с помощью перехода между базисами.7.1.4 Гравитационная модель взаимодействияПриближённо решается задача N тел.
Солнце движется, как и планеты.Исходные данные для всех тел (Солнца,планет, спутников, ...)Координаты (3d точка)Скорость (3d вектор)Масса (скаляр)Текущие координаты всех тел вычисляются итерационно. Простейший способ вычислениякоординат тела в следующий момент времени:1. По закону всемирного тяготения вычислить равнодействующую всех сил, действующих натело, на основе его положения в текущий момент времени и получить текущее ускорение2.
Считается, что весь промежуток времени ∆t на тело действует постоянное ускорение,вычисленное на предыдущем шаге.3. Вычисляем новую скорость и новое положение путём интегрирования постоянногоускорения по времени:Velocity += Acceleration * ∆tPosition += Velocity₀ * ∆t + Acceleration * ∆t² / 210Важно использовать на текущей итерации расчёта координаты всех тел с этого же шага. Новыекоординаты должны где-то сохраняться. Координаты можно изменять только после завершениятекущей итерации для всех тел в системе!Вместо этого простейшего способа можно использовать многошаговую экстраполяцию ускорения,или записать систему дифференциальных уравнений движения системы тел и решать её однимиз более сложных численных методов (например, Рунге-Кутты 4 порядка и выше).В случае наличия большого количества тел (спутников, астероидов) нужно оптимизироватьскорость вычислений.
Например, игнорировать влияние далёких лёгких объектов, или ещё както.7.2 Генерация сферыДля генерации сферы вам необходимо создать полигональную сетку, содержащую координатыкаждой точки, нормаль в этой точке и текстурную координату. При использовании индексногобуфера (как в шаблоне) дополнительно необходимо заполнить его информацией о гранях(треугольниках). Плюс индексного подхода в отсутствии дублирования вершин.Существует несколько способов генерации сферы.Первый способ - самый очевидный.
Нужно рассмотреть сферические координаты сферы. Тогдарадиус будет фиксирован (например, 1). Точки на полярной сетке можно выбрать равномернымперебором зенита и азимута с фиксированным шагом. Текстурная координата будет совпадатьсо значениями углов, нормаль - нормированный единичный вектор, направленный по зениту иазимуту, если центр сферы находится в начале координат.Проблема первого подхода - в неравномерности расположения точек. Чтобы избежать этойпроблемы, используют итерационный процесс подразбиение некоторой аппроксимации сферы.В качестве нее обычно выбирают правильный многогранник: икосаэдр или додэкаэдр, можнокуб.Исходная фигура генерируется тривиальным фиксированным начальным набором координат.Затем каждый полигон (треугольник у икосаэдра) подразбивается. Например, можно рекурсивноразбивать каждое ребро посередине и получать 4 треугольника из одного на каждом шаге.Каждая точка проецируется на сферу (для этого ее нужно поделить на радиус в сферическойсистеме и умножить на радиус итоговой сферы), и шаг повторяется.
Нормали и текстурныекоординаты можно рассчитать по полярным углам.При втором подходе нужно следить за перестроением массива индексов (треугольников)итоговой фигуры.Можно произвести аналогичное преобразование с помощью генерации новой геометрии втесселяционных и геометрических шейдерах (за дополнительные баллы).11О работе с тесселяционными шейдерами подробно написано здесь.
Тесселяция реализуется спомощью двух шейдеров (1 и 2). После генерации всех подразбиенийв геометрическом шейдере можно пересчитать нормали и текстурные координаты.7.3 КамераНа самом деле можно себе представить, что камера помещена в центре сцены, а все остальныеобъекты движутся и вращаются вокруг нее.С камерой связана модельно-видовая матрица. Модельно-видовую матрицу нужно передать ввершинный шейдер (это уже сделано в шаблоне).Для обработки событий с клавиатуры нужно объявить функцию keyPressed, а затем указатьopengl, что эту функцию следует использовать как соответствующий обработчик.glutKeyboardFunc(keyPressed);Для обработки событий с мыши - аналогично, нужно объявить функцию mouseFunc, а затемуказать ее opengl посредством фунции glutMouseFunc.void glutMouseFunc(void (*func)(int button, int state, int x, int y));Примеры кода можно найти в методичке.При создании камеры вам пригодится аппарат линейной алгебры.














