Идея, приведенная ниже, взята из декомпилированной swf одного из вариантов бильярда (к сожалению, сейчас уже не помню, какого).
Сначала объяснение "на пальцах", потом реализация.
Итак, для начала подготовим в 3D-редакторе или программе Swift-3D анимацию вращения шара с простой текстурой - например, окружностями на "полюсах" или полосой по "экватору" - главное, чтобы при вращении шара в одном из направлений (во втором случае - при вращении вдоль экватора), его вид оставался неизменным. Для большего эффекта нужны два набора анимаций для отображения вращения в перпендикулярных направлениях.
Определим для каждой анимации единичный вектор в пространстве, указывающий направление вращения, которое отображает эта анимация.
Теперь в каждый момент времени будем вычислять положение этого вектора в пространстве. Для этого будем:
- переводить его координаты в систему координат, в которой ось y направлена по движению шара,
- вычислять смещение, вызванное поворотом шара (для простоты угол поворота определим как линейную функцию от величины смещения шара на плоскости),
- возвращаться в основную систему координат
В результате наклон данного единичного вектора относительно оси z будет пропорционален индексу кадра анимации ( с коэффициентом, зависящим от общего количества кадров), а из смещений по осям x и y получим угол, на который надо развернуть этот кадр перед выводом на экран.
Результат: (клик мышкой по swf вызывает движение шара в сторону курсора)
Скачать исходный код
Комментариев нет:
Отправить комментарий