2010-07-20 2 views
2

Я хотел бы попросить вас поделиться некоторыми идеями о том, как реализовать поддержку анимации в своем приложении OpenGL. Например, если бы мы хотели, чтобы в случае какого-либо события, инициированного пользователем, анимируйте частицу Ball на экране, как нам нужно организовать наш код? :Анимация в OpenGL

  1. Установить Анимационное свойство как элемент объекта частицы шарика? (Который содержит набор матриц для применения к модели владельца, задержка между ними, анимация воспроизведения или нет и т. Д.)
  2. Нужно иметь некоторое центральное хранилище, которое содержит связь между частицей шара и прикладной анимацией к нему (я, честно говоря, предпочел бы это). ?
  3. Somethihg else ...?

И после чего о рендеринге? Как сделать это жидким и быстрым? (Я знаю, что это очень чувствительно к контексту, но просто для того, чтобы дать представление ..)

ответ

3

Я бы определить Animation класс, который может осуществлять следующие анимации:

  • Rotation/перевод/масштаб анимации
  • Ключевой кадр анимации
  • Skinning анимация

Из Конечно, одна из описанных выше методов анимации требует некоторого общего доступа к объекту Объект класс.

RotoTranslation анимации требуется доступ к Object Model View матрицы; Ключевой фрейм анимации требует доступа к буферам вершин модели; Скиннинг анимации требует доступа к состоянию рендеринга объекта Объект (атрибуты шейдеров и программы или атрибуты вершин с использованием расширений).

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

Анимационный класс использует набор экземпляров интерполятора для выполнения анимации (изменение значений для интерполяции). Как значения выбираются, доступны и изменены (диапазоны), должны быть определены на Объект класс.

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

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


Конечно, все зависит от ваших реальных потребностей.

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

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

+0

Вау, спасибо за подробное объяснение ваших идей. – Tigran

1

OpenGL не поддерживает анимацию; вам нужно будет написать свою собственную фреймворк (например, используя GLX, see this article) или использовать существующую инфраструктуру, такую ​​как ones mentioned here.

+0

Я знаю, и на самом деле был вопрос, как организовать код для его реализации. Спасибо за lnks. – Tigran

4

Что касается «жидкости и скорости», вы можете взглянуть на различные easing equations, чтобы применить к вашему значению интерполяции анимации.

Смежные вопросы