Курсы лаборатории компьютерной графики
Обязательный полугодовой курс ВМиК МГУ
     

Задание №5. Интерактивная анимация

Начало: 5 мая 2004
Конец: 22 мая 2004

Автор задания:
Алексей Игнатенко

Введение

Цель задания - получение навыков работы с трехмерными динамическими данными, визуализация с помощью OpenGL, использование приемов работы с OpenGL для увеличения реалистичности интерактивной визуализации сцены.

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

Описание задания

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

Сцена включает в себя следующие элементы:

  • Шары (анимируются)
  • Прямоугольники (не анимируются, задают статическую часть сцены -- стены и т.п.)
  • Начальное положение и направление камеры
  • Положение точечных источников света
Каждый динамический объект имеет начальную скорость, цвет и массу.

Обязательная часть

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

Симуляция должна соответствовать законам Ньютоновской динамики

В сцене должно присутствовать освещение, т.е. визуализация должна происходить с включенным режимом освещения OpenGL, а объектам должны быть назначены материалы.

Освещение и начальное положение камеры должно соответствовать заданным в файле. Если освещение не задано, необходимо поставить источник "по умолчанию" (лучше всего параллельный)

Замечания по алгоритмам симуляции динамики

Симуляция физически-корректного движения объектов распадается на две подзадачи: определение столкновений объектов и моделирование движения под действием сил.

В конкретной постановке задачи требуется определять столкновения шаров с плоскостью (прямоугольником) и шаров с шарами.

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

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

Для нахождения пересечения двух шаров можно использовать следующий метод: если в данный момент времени шары пересекаются, откатывать время назад небольшими шагами, на каждом шаге проверяя пересечение. Таким образом можно достаточно точно найти момент времени, в который шары столкнулись.

Моделирование движения под действием сил сводится к вычислению перемещения тел (шаров) под действием силы гравитации и в моменты столкновения с другими объектами

Для получения оценки достаточно реализовать простейшую модель движения под действием силы тяжести, пренебрегая сопротивлением воздуха. Например :

Velocity_New = Velocity_Old + Acceleration * TimeStep
Position_New = Position_Old + Velocity_New * TimeStep 
, где
  • Velocity_New - скорость объекта по прошествии времени TimeStep
  • Position_New - положение объекта по прошествии времени TimeStep
  • Velocity_Old , Position_Old - соответственно текущие скорость и положение объекта

Объекты перемещаются соответственно вычисленной скорости. В моменты столкновения рассчитывается новое ускорение (a = F/m, где F - сумма сил, действующая на тело, а m - масса тела) и скорость модифицируется соответствующим образом.

Дополнительная часть

Ниже приведены возможности, за реализацию которых можно получить дополнительные баллы.
  • Улучшенная анимация. За реализацию дополнительных физических эффектов (описать в readme.txt) даются дополнительные баллы
  • Соударение шаров Реализация корректного соударения шаров (с правильным моделированием отскоков!)
  • Независимая скорость анимации Скорость анимации не зависит от скорости машины.
  • Навигация по сцене. Реализация перемещения камеры по сцене в режиме "полета".
  • Текстуры Использование текстур для объектов. Изображения текстур можно задавать в файле данных, а отображение определять автоматически.
  • Тени на плоскости Отображение теней, падающих на плоскости (тени не должны вылезать за края плоскости)
  • Полные тени Тени, падающие в том числе и на шары.
  • Зеркальные отражения на плоскости Зеркальные отражения на плоскостях. Коэффициент зеркального отражения задается в файле данных.
  • Зеркальные отражения на шарах Зеркальные отражения на шарах. Коэффициент зеркального отражения задается в файле данных. Отражения должны обновляться динамически.
  • Полупрозрачные объекты Полупрозрачность объектов задается в файле данных. Засчитываться только корректная полупрозначность (т.е. с пространственной сортировкой объектов и выводом back-to-front)
  • Устранение ступенчатости Реализация устранения ступенчатости (antialiasing) методом, предложенным в пособии или каким-либо другим также оценивается. Обратите внимание: есть разница между размытием сцены и устранением ступенчатости!.

Материалы для выполнения задания

Тестовые данные

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

(ВНИМАНИЕ: этот раздел пополнится дополнительными тестовыми данными ориентировочно к 13.05.04)

Библиотека для загрузки xml-файлов данных

Для загрузки xml-файлов данных предоставляется:

Для подключения библиотеки к своему проекту необходимо проделать следующее (Visual C++ 6.0):

  • Выбрать меню Project->Settings
  • В левом верхнем углу в выпадающем списке "Settings for" выбрать "All Configurations"
  • Справа выбрать вкладку "Link" и в выпадающем списке "Category" выбрать "Input"
  • В поле "Object/library modules" вписать "animdata.lib"
  • В поле "Additional library path" вписать путь к библиотеке animdata, подкаталогу "lib" (например "../animdata/lib")
  • Перейти к вкладке "C/C++" и в выпадающем списке "Category" выбрать "С++ language"
  • Убедиться, что отмечен пункт "Enable Exception Handling"
  • Отметить пункт "Enable Run-Time Type Information (RTTI)"
  • На той же вкладке перейти к категории "Code Generation".
  • В левом верхнем углу в выпадающем списке "Settings for" выбрать "Win32 Debug". В разделе "Use run-time library" выбрать "Debug multithreaded DLL".
  • В левом верхнем углу в выпадающем списке "Settings for" выбрать "Win32 Release". В разделе "Use run-time library" выбрать "Multithreaded DLL".
  • Нажатием на "OK" закрыть диалог

Требования к программе

Программа должна предоставлять возможность открытия произвольного файла .cganim. Имя файла можно брать из командной строки или открывать соответствующий диалог. После загрузки файла должла показываться сцена в начальном положении, без анимации.

По нажатию кпопки в окне, пункта меню, клавиши и т.п. должна запускаться анимация. Также необходимо предоставить возможность вернуть симуляцию в начальное состояние. Приветствуется возможность регулировки скорости анимации.

Скорость работы должна быть ориентировочно не менее 5 кадров/сек на современной машине бюджетного уровня (P4 2000, графический ускоритель уровне NVidia GeForce3)

Оценка

База (загрузка файла, анимация, проверка столкновения с плоскостью, освещение) 8 баллов
Улучшенная анимация 1-2 балла
Соударение шаров 3 балла
Независимая скорость анимации 1 балл
Навигация по сцене 2 балла
Текстуры 1-2 балла
Тени на плоскости 2 балла
Полные тени 4 балла
Зеркальные отражения на плоскости 2 балла
Зеркальные отражения на шарах 3-4 балла
Полупрозрачные объекты 2-4 балла
Устранение ступенчатости 2 балла

Оформление

Оформление не отличается от обычного.

ZIP-архив с исходными текстами и исполняемыми файлами, названный по схеме GZV_nnnnnnnn.zip (где G - последняя цифра номера группы, Z - номер задания, V - номер версии задания, nnnnnnnn - номер студенческого билета) присылайте на assign5@graphics.cs.msu.su

Например, студент 206 группы с номером студенческого билета 06529042, сдающий обновленную (вторую) версию программы по второму заданию, должен прислать архив с именем 622_06529042.zip.

Также смотрите здесь, какие файлы нам присылать и как их оформить Советуем очень внимательно прочитать весь FAQ

Не забудьте положить в архив файл readme.txt. В файле описать интерфейс програмы (алгоритм работы с программой, пункты меню, управляющие клавиши)

!Внимание: обратите внимание на правильное именование и структуру архива с работой, а также на содержание файла readme.txt. Если ваша работа не будет соответствовать требованиям, баллы могут быть снижены.

Результаты работы

Результаты смотрите в интернете.

Примечания

  1. Задание выполняется строго индивидуально. За совместную работу или обмен кусками кода ставится -5 баллов всем участникам, если факт командной работы не был указан в readme.txt заданий.
  2. Рекомендуется написание программы под семейство ОС Windows. Написание под другие операционные системы нежелательно и может вызвать задержки с проверкой таких работ.

ЧаВо по заданию

Я добавила все includ'ы и подключила бибилиотеку к проекту. Все нормально линковалось до тех пор, пока я не добавила строку

AnimationData *anim_data = new AnimationData;

после чего link стал выдавать кучу ошибок типа:

__winver already defined in libcmtd.lib и

defaultlib "nafxcw.lib" conflicts with use of other libs; use /NODEFAULTLIB:library
defaultlib "libc.lib" conflicts with use of other libs; use /NODEFAULTLIB:library

Что с этим делать?

Проблема действительно существует и связана с тем, что предоставленные библиотека были скомпилированы для конфигурации Single Threaded, а MFC требует конфигурацию Multithreaded DLL. Текст задания был обновлен, теперь нужно скачать библиотеки еще раз. (см. раздел "Материалы для выполнения задания"). Обратите внимание на дополнительные действия для подключения.

Библиотеки не подключаются к VC7. Что делать?

Скачайте версию библиотеки для VC7. Не забудьте настроить проект аналогично приведенной последовательности для VC6

Какие силы гравитации действуют на шары - сила, направленная вертикально вниз или притяжение к каждому из прямоугольников?

Силы, направленные вертикально вниз (по направлению (0, -1, 0). Притяжения между объектами нет.

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

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

Что делать при наличии большого числа зеркальных поверхностей, ведь если рядом поставить два зеркала, то кол-во отражений будет бесконечно большое.

Ограничивать уровень рекурсии отражения. Обычно первого (зеркала отражаются в зеркалах как не зеркальные) или второго уровня достаточно. Можно регулировать это в программе.

Надо ли (Можно ли) при столкновении придавать шарам вращательное движение, так на много реалистичнее.

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

Главная | О курсе | Лекции | Библиотека | Задания | Оценки | FAQs
  (с) Лаборатория компьютерной графики, 1997-2004
Дизайн: Алексей Игнатенко