четверг, 11 марта 2010 г.

Кручу-верчу. Реалистичная анимация вращения шара во Flash

Катящиеся по плоскости в произвольном направлении шары присутствуют во многих играх, и нам, как разработчикам, хочется сделать их перемещение как можно более достоверным. Если с обсчетом движения проблем нет - вращением в играх можно пренебречь, физическая модель получается достаточно простой, то в отрисовке катящегося шара с каким-то рисунком на поверхности пренебрежение вращением сильно ухудшает визуальную сторону игры. Использование 3D-движков с настоящими текстурами не всегда оправдано в flash-играх (почти никогда не оправдано, по-моему), но всегда можно схитрить, добавив к физике немного математики.


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

Сначала объяснение "на пальцах", потом реализация.

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

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

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

В результате наклон данного единичного вектора относительно оси z будет пропорционален индексу кадра анимации ( с коэффициентом, зависящим от общего количества кадров), а из смещений по осям x и y получим угол, на который надо развернуть этот кадр перед выводом на экран.

Результат: (клик мышкой по swf вызывает движение шара в сторону курсора)




Скачать исходный код

Комментариев нет:

Отправить комментарий