Главная » Статьи » Учебник: практика

Плавный переход между анимациями
Одна из тривиальных задач в игре - создание плавного перехода между анимациями. Несколько странно, но в панде нет прямого инструмента для реализации такого эффекта, поэтому приходится прибегать некоторым ухищрениям. Ниже приведён пример как этого добиться. Перед запуском скопируйте папку models из примера Roaming Ralph в папку, где у вас будет файл с данным скриптом.

from direct.directbase.DirectStart import *
from direct.interval.IntervalGlobal import *
from direct.actor.Actor import Actor

ralph = Actor('models/ralph',
              {'walk' : 'models/ralph-walk',
               'run' : 'models/ralph-run',               
               })
ralph.reparentTo(render)

ralph.setBlend(frameBlend=1,blendType=1)
ralph.enableBlend()

ralph.loop('walk')
ralph.loop('run')

i1 = Sequence(LerpAnimInterval(ralph, 1, 'walk', 'run'),
              Wait(3),
              LerpAnimInterval(ralph, 1, 'run', 'walk'),
              Wait(3))
i1.loop()

base.disableMouse()
base.camera.setPos(15,-15,8)
base.camera.lookAt(0,0,2)
run()

Рассмотрим код подробнее.

Импортируем необходимые модули:

from direct.directbase.DirectStart import *
from direct.interval.IntervalGlobal import *
from direct.actor.Actor import Actor

Загружаем модель с двумя анимациями. И репарентим к рендеру:

ralph = Actor('models/ralph',
              {'walk' : 'models/ralph-walk',
               'run' : 'models/ralph-run',               
               })
ralph.reparentTo(render)

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

ralph.setBlend(frameBlend=1,blendType=1)
ralph.enableBlend()

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

ralph.loop('walk')
ralph.loop('run')

Создаём последовательность из двух интервалов. LerpAnimInterval как раз и управляет параметром ControlEffect позволяя сделать плавный переход от 1 до 0 для первой анимации и от 0 до 1 для второй. Т.е. визуально мы увидим что первая анимация затухает, а вторая в то же время вступает в силу. Влияние обоих анимаций смешивается на модели. Наши интервалы в течение 1 секунды меняют анимацию, потом ждут 3 секунды. Последовательность по очереди запускает интервалы:

i1 = Sequence(LerpAnimInterval(ralph, 1, 'walk', 'run'),
              Wait(3),
              LerpAnimInterval(ralph, 1, 'run', 'walk'),
              Wait(3))

Зацикливаем последовательность: i1.loop()

Отключаем дефолтное управление мышью и устанавливаем камеру в сторонке; направляем её на модель; запускаем основную подпрограмму:

base.disableMouse()
base.camera.setPos(15,-15,8)
base.camera.lookAt(0,0,2)
run()

Категория: Учебник: практика | Добавил: ninth (28.02.2009)
Просмотров: 5872 | Комментарии: 1 | Рейтинг: 5.0/4
Всего комментариев: 1
1 3dmax  
0
ОО то что надо :). Разберемся.

Добавлять комментарии могут только зарегистрированные пользователи.
[ Регистрация | Вход ]
Онлайн всего: 1
Гостей: 1
Пользователей: 0