- •Оглавление введение
- •Основные принципы и средства создания анимированных объектов.
- •Понятие анимации.
- •Способы создания анимированных переходов между состояниями объектов.
- •Программная анимация.
- •Существующие средства для создания программной анимации.
- •Проектирование компонента для анимирования переходов между состояниями объектов.
- •Определение основных требований к разрабатываемому компоненту.
- •Определение основных математических законов используемых для генерации промежуточных состояний объектов.
- •Введение обратных функций для увеличения возможностей по построению анимации.
- •Реализация компонента для анимирования переходов между состояниями объектов.
- •Выбор средств для реализации спроектированного компонента.
- •Реализация математических функций для анимирования переходов между состояниями объектов.
- •Реализация обратных функций.
- •Расчётная работа на тему: «Реализовать функциональности копирования типов элемента для редактора баз знаний».
-
Реализация математических функций для анимирования переходов между состояниями объектов.
Приведём реализацию описанных математических функций используемых для построения промежуточных состояний объекта. В приведённой реализации использовалась модуль для математических вычислений из библиотеки 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
Из описанных фрагментов кода, видно, что кроме лёгкости добавления новых анимирующих функций, так же просто добавлять всякого рода модифицирующие функции, к которым относятся обратные функции. Это ещё больше расширяет возможности разрабатываемого компонента.