Экспорт анимированных объектов в Flash 8

Ни для кого не секрет, что в последние годы, популярность продуктов Macromedia очень возросла, в частности Flash завоевал львиную долю интернета в области векторных изображений. На сегодняшний день Flash может позволить некоторые простейшие 3д вычисления, с помощью которых не составит особого труда спроектировать на экран простую 3д модель. В паутине существует множество “open source” 3д движков, однако далеко не во всех есть поддержка загрузки моделей из внешних источников, и уж совсем нет поддержки анимации этих моделей. Именно этими проблемами мы здесь и займемся.

Сразу предупреждаю: Здесь не будут описываться тонкости языка Action Script 2 (Flash 8), однако будет доступен исходник “3d движка” для флеша с поддержкой загрузки анимационных моделей, который вы сможете использовать в своё удовольствие.

Структура модели: Для наглядности привожу простой пример структуры модели, вы же можете использовать более оптимизированные в плане повышения скорости, структуры.

Модель представляет собой двумерный массив, A[I,J] i-ым элементом которого является номер кадра, а j-ым координаты точкек. Т. о. получается что при расчете проекции, от нас потребуется лишь пробежать по всем j элементам массива, при этом в каждом следующем кадре увеличивать i.

Настройка сцены и “правильной” анимации:

Создаем необходимую нам модель, к примеру Biped. Для упрощения экспорта, нам необходимо сделать несколько точек, которые мы и будем экспортировать. Для этого создаем Dummy (Можно использовать любой из Helpers), в ключевых местах, (это сгибы и окончания) в нашем случае, в локтях, кистях, на шее, тазе, и ногах. Так как наша модель симметричная, достаточно будет создать 7 Dummy, выделить Dummy на руках и ногах, и скопировать их с помощью mirror.

После этого необходимо привязать каждую Dummy к соответствующей части тела. Для этого заходим в меню Animation->Constraints->Attachment Constraints.

После этого Dummy должен поменять угол:

Когда все завершено, приступаем к долгожданной анимации, я использовал стандартную ходьбу biped-а:

Выделяем любую часть тела biped-а переходим в вкладку Motion, в ней ищем кнопку Footstep Mode, создаем несколько шагов(Create Multiple Footsteps…), а дальше создаем ключи анимации(Create Keys for Inactive Footsteps). Да и не забудьте поставить здесь же в Modes and Display -> опцию InPlace Mode если хотите чтобы модель шла на месте. Теперь оставляем диапазон кадров, для того чтобы можно было в дальнейшем зациклить нашу анимацию Time Configuration:

Так как в нашем движке есть интерполяция, не забудьте уменьшить количество кадров отрезка времени, Re-scale Time->Length:

MaxScript:

Далее запускаем MaxScript 
В нем пишем:
rollout main "Flash 3d export v0.01" (
    --создаем список для отображения экспортиркемых объектов
    --три кнопки для добавления/удаления из списка и экспорта соответсвенно
    --а так же поле ввода, для сохранения в файл
    listbox ListObjects "Objets to export:" width:180 align:#center
    button add "add Selected" pos:[10,165]  width:85
    button remove "Remove" pos:[105,165] width:85
    edittext edit "Path\FileName" text:"C:\\Model.m3d" wodth:180 align:#center  
    button export "Export!" pos:[10,215] width:180
    --обрабатываем события у кнопок
    on add pressed do ( --добавление
        ListObjects.items = for o in selection collect o.name --добавляем в список выделенные объекты
        ListObjects.items = sort ListObjects.items --далее сортируем
    )
    on remove pressed do ( --удаление
        for i=1 to ListObjects.items.count do ( --пробегаем по всем элементам списка
            temp = ListObjects.items --заводим временную переменную
            deleteItem temp 1 --удаляем всегда первый элемент, так как послу удаления меняются индексы у элементов
            ListObjects.items = temp --возвращаем изначальный массив
        )
    )
    on export pressed do ( --экспорт
        sliderTime = 0 --переходим на первый кадр
        txt = createFile edit.text --задаем соответсвие для файла с адресом edit.text   
        while sliderTime &<& animationRange.end do ( --пока не достигнем последнего кадра
            for i=1 to ListObjects.items.count do( --по всем элементам списка
                px = ceil((getNodeByName ListObjects.items[i]).pos.x*1000)/1000 --округляем до тысячных
                py = ceil((getNodeByName ListObjects.items[i]).pos.y*1000)/1000 --округляем до тысячных
                pz = ceil((getNodeByName ListObjects.items[i]).pos.z*1000)/1000 --округляем до тысячных
                p = (px as string)+" "+(py as string)+" "+(pz as string)+"*" --преобразуем в строковый тип
                format p to: txt --сохраняем строку в файл txt
            ) 
            if sliderTime &<& animationRange.end-1 then format "\n" to: txt --сохраняем символ конца строки в файл txt
            sliderTime += 1 --переходим на следующий кадр
        )   
    )   
)
createDialog main width:200 height:245 --создаем собственно форму

или загружаем скрипт export.ms, и компилируем: File->Evaluate All

Затем нужно выделить необходимые Dummy и нажать на кнопку add Selected после чего выделенные объекты должны появиться в списке объектов для экспорта. Теперь остаётся лишь нажать на кнопку Export!.

Flash 8:

Открываем файл Main.fla, щелкаем по первому фрейму и открываем вкладку Actions

Там вы найдете такую строку: _3dScene.addObject(10,800,0, 0, 10, 100, 0, "guy_lv2"); - это означает что мы создаем объект с координатами x=10, y=800,z=0 , цвет=0, толщина=10, здоровье=100, текущий кадр = 0 , и url = “guy_lv2” модели соответственно. Вам же вместо “guy_lv2” следует написать название вашей модели без расширения.
Потом скопировать вашу модель в папку models/имя_модели.m3d и там же создать файл имя_модели.e3d, для того чтобы задать какие линии мы будем рисовать.
Вот здесь нам придется сделать все вручную, сначала объясню задачу.
Пока flash видит только координаты точек (x,y,z) из наборов точек, однако он не сможет нарисовать линии не зная взаимосвязей м/у точками, именно это и предстоит нам задать. Здесь я так и не смог автоматизировать процесс, придется делать вручную:

Мы видим расположение наших точек. Для нашей модели видно, что самым оптимальным способом задания связей будет нахождение самого длинного непрерывного отрезка. Это отрезок point01-> point10-> point02-> point03-> point11, запишем его через запятую в только что созданный файл: имя_ модели.e3d, затем надо ввести знак разбиения, пусть будет “&”.

guy_lv1.e3d: 1,10,2,3,11,&,…

Дальше вводим оставшиеся отрезки таким же образом:

guy_lv1.e3d: 1,10,2,3,11,&,9,6,5,7,8,&,2,5,4

Сохраняем файл и запускаем Flash. Вот что получилось у меня, вы же можете не зацикливаться на человекоподобных, а создавать сложные по структуре объекты

Скачать main.fla, export.ms.

Архив файлов урока

Примечание: ресурсы Flash очень ограничены и после порядка 300 точек клип начинает существенно тормозить.

Спасибо за интерес, если возникнут какие-то трудности, обращайтесь буду рад помочь.

420 0 850 30
24
2006-07-24
А почему ссылка на сцены не рботает?
2006-07-24
ццылка неработает, а урок понравился, Модераторы!!!! ццылку почините!! поставил пятерки. но без ццылки урок терятет часть крутости.
2006-07-24
ТАК!!! Ссылку исправили все должно скачиваться!
2006-07-24
Вот, кто спам в Интернете разводит. Ух, как я не люблю рекламу и банеры, особо которые на флэш сделаны.
2006-07-24
Но, начальная картинка урока мне понравилась )
2006-07-24
Moon Man в первую очередь этот урок предназначен для флешеров, специализирующихся на разработке Flash-игр, а уж потом, для web дизайнеров и баннермейкеров.
2006-07-24
Всем внимание кто уже скачал Архив файлов урока, и у него не работает main.fla, удалите строку "C:\for Render.ru\classes" в File/publishion settings->Flash иначе флэш не сможет загрузить классы, я уже сообщил об этом редактору, но не знаю когда это исправят.
2006-07-24
Исправлено. Архив - обновлен.
2006-07-24
Убедительная просьба тех кто голосует отрицательно, оставлять комментарии.
2006-07-25
Только не надо думать, что, если я не люблю спамеров в Интернете, то и голосую также.
2006-07-25
Moon Man я тоже их не люблю!
2006-07-27
Почему так мало комментариев, неужели так мало любителей флеша, или все всё умеют?
2006-07-27
Очень неплохой урок. Хотя мне, как нелюбителю флэша, не нужен.
2006-07-27
Это очень интересно, надо попробывать на досуге.
2006-08-01
Интересно! Я в основном через Plasma и Illustrate! перегонял. Но здесь круче - и повертеть можно, и скорость повысить. А можно так, чтобы линии заливались, на подобие старых векторных игр? И меняли свою толщину. И цвет. Успехов!
2006-08-02
Crio не понял вопрос, что значит заливались?
2006-08-02
Обязательно попробую.
2006-08-04
Что-то на подобии полигона.
2006-09-04
Спасиб большое за урок!!!!давно искал как 3d совместить с флэш...мне понравился урок)
2006-09-11
Думаю пригодиться!
2006-09-12
Обалденно. Давно хотел это сделать. Автору благодарность.
2006-09-12
Автору респект. такие уроки должны побеждать.
2006-10-25
Захотелось флеш попробовать.
2008-11-06
А у меня скрипт не работает. Совсем. Вылазит ошибка.
RENDER.RU