- •Оглавление введение
- •Основные принципы и средства создания анимированных объектов.
- •Понятие анимации.
- •Способы создания анимированных переходов между состояниями объектов.
- •Программная анимация.
- •Существующие средства для создания программной анимации.
- •Проектирование компонента для анимирования переходов между состояниями объектов.
- •Определение основных требований к разрабатываемому компоненту.
- •Определение основных математических законов используемых для генерации промежуточных состояний объектов.
- •Введение обратных функций для увеличения возможностей по построению анимации.
- •Реализация компонента для анимирования переходов между состояниями объектов.
- •Выбор средств для реализации спроектированного компонента.
- •Реализация математических функций для анимирования переходов между состояниями объектов.
- •Реализация обратных функций.
- •Расчётная работа на тему: «Реализовать функциональности копирования типов элемента для редактора баз знаний».
Реализация математических функций для анимирования переходов между состояниями объектов.
Приведём реализацию описанных математических функций используемых для построения промежуточных состояний объекта. В приведённой реализации использовалась модуль для математических вычислений из библиотеки Ogre, распространённой библиотеки для трёхмерной графики с открытым исходным кодом.
Для линейной функции реализация наиболее проста и выглядит как показано ниже.
def deltaLinearAnimation(self, progress):
return progress
Здесь видно, что значение параметра определяющего состояние объекта изменяется по линейной зависимости от части прошедшего времени в заданном интервале. В данной функции и далее progress – это часть заданного интервала времени, которая прошла с момента изменения состояния.
Реализация для квадратичной функции и функции от аргумента пятой степени были объединены в один метод, принимающий на вход требуемую степень аргумента. Таким образом становится возможным задавать абсолютно любые степенные функции.
def deltaPowerOfNAnimation(self, progress, power):
return Math.Pow(progress, power)
Вычисление функции определяющей дугу окружности выглядит следующим образом:
def deltaCircleAnimation(self, progress):
return 1 - Math.Sin(Math.ACos(progress))
Следующим является метод для вычисления анимации по закону синуса:
def deltaSineAnimation(self, progress):
return 1 - Math.Sin((1 - progress) * Math.PI / 2)
Реализация функции описывающей возрастающие колебательные движения:
def deltaElasticAnimation(self, progress, x):
return Math.Pow(2, 10 * (progress - 1))
* Math.Cos(20 * Math.PI * x / 3 * progress)
Заключительной является так называемая функция «back». Её реализация представлена ниже.
def deltaBackAnimation(self, progress, x):
return Math.Pow(progress, 2) * ((x + 1) * progress - x)
Из всех приведённых методов становится видно, что все они реализуются подобным образом, что означает лёгкость добавления новых математических функций, если в этом возникнет необходимость. Таким образом, набор математических законов, по которым происходит построение цепочки промежуточных состояний объекта, теоретически может быть расширен до любых необходимых размеров.
Реализация обратных функций.
Реализация обратных функций не отличается особенной сложностью, всё что нужно сделать для их внедрения в компонент, это организовать определённые вычисления в зависимости от выбранного типа обратной функции, так же как происходит выбор анимирующей функции по заданному типу.
Такая реализация приведена ниже:
def animateValue(self, toValue, progress, animationType,
easeAnimationType):
delta = 1
if easeAnimationType == self.EASE_IN:
delta = self.deltaAnimation(progress, animationType)
elif easeAnimationType == self.EASE_OUT:
delta = 1 - self.deltaAnimation(1 - progress, animationType)
elif easeAnimationType == self.EASE_IN_OUT:
if progress < 0.5:
delta = self.deltaAnimation(2 * progress, animationType) / 2
else:
delta = (2 - self.deltaAnimation(2 * (1 - progress),
animationType)) / 2
return int(toValue * delta)
Приведённый метод вычисляет значение величины определяющей состояние объекта по заданному начальному и конечному значению состояния, части прошедшего промежутка времени, типу анимации и типу обратной функции. Здесь метод deltaAnimation – это метод применяющий ту или иную анимирующую функцию в зависимости от переданного типа. Его реализация выглядит следующим образом:
def deltaAnimation(self, progress, animationType):
delta = 1
if animationType == self.LINEAR:
delta = self.deltaLinearAnimation(progress)
elif animationType == self.CIRCLE:
delta = self.deltaCircleAnimation(progress)
elif animationType == self.ELASTIC:
delta = self.deltaElasticAnimation(progress, 1.5)
elif animationType == self.POWER_OF_TWO:
delta = self.deltaPowerOfNAnimation(progress, 2)
elif animationType == self.POWER_OF_FIVE:
delta = self.deltaPowerOfNAnimation(progress, 5)
elif animationType == self.SINE:
delta = self.deltaSineAnimation(progress)
elif animationType == self.BACK:
delta = self.deltaBackAnimation(progress, 2.5)
return delta
Из описанных фрагментов кода, видно, что кроме лёгкости добавления новых анимирующих функций, так же просто добавлять всякого рода модифицирующие функции, к которым относятся обратные функции. Это ещё больше расширяет возможности разрабатываемого компонента.
