|
|
« Предыдущая тема | Следующая тема » |
Опции темы | Опции просмотра |
|
|
|||||
Banned
[+4 01.02.09]
[+1 01.02.09] |
Автоперевестка таймлайна при смене fps
Например, когда мы эмбедим видео на таймлайн, то видео автоматически синхронизируется с таймлайном исходя из установленного fps.
Вопрос: можно ли как-то динамически переверстать таймлайн (растянуть/сжать простейшие анимации) при смене fps? Или каждый раз это необходимо делать руками? Пример: Есть флешка с fps=10 и 50-ью кадрами (1-й и 50-й - ключевые в анимации движения). Если менять fps на 20, то анимация движения должна быть соответственно из 100 кадров (чтобы сохранить динамику анимации) и 50-й ключевой кадр должен стать 100-м. |
|
|||||
Banned
[+4 01.02.09]
[+1 01.02.09] |
Понятно...
Я думал есть специальное свойство, а так я уже сделал нечто подобное (для любого числа слоев): fl.outputPanel.clear (); myFile=fl.getDocumentDOM() myTimeline=myFile.getTimeline() for (i=0; i<myTimeline.layers.length; i++){ curLayer=myTimeline.layers[i] myTimeline.setSelectedLayers(i) for (j=0; j<curLayer.frames.length; j++){ curFrame=curLayer.frames[j] fl.trace(i+" "+j+" "+curFrame.duration+" "+curLayer.frames.length+" keyframe") j+=curFrame.duration-1 } } А где математический аппарат? Мне, например надо округлять числа: из 2.8 сделать 3. Как? add2: вроде нашел - все просто, как валенок: Math.round() add3: вроде вышло // скрипт для автоформата таймлайна // для случая когда fps учащается до значения myNewRate // а динамику анимации надо сохранить myFile=fl.getDocumentDOM() myTimeline=myFile.getTimeline() myNewRate=18 // здесь поставить значение желаемого fps myOldRate=myFile.frameRate myCoeffRate=myNewRate/myOldRate for (i=0; i<myTimeline.layers.length; i++){ curLayer=myTimeline.layers[i] myTimeline.setSelectedLayers(i) for (j=0; j<curLayer.frames.length; j++){ curFrame=curLayer.frames[j] add=Math.round(curFrame.duration*myCoeffRate-curFrame.duration) myTimeline.insertFrames(add, false, j); j+=curFrame.duration-1 } } myFile.frameRate=myNewRate Последний раз редактировалось chingachgoog; 12.03.2008 в 20:37. |
|
|||||
Прошу прощения за тупой вопрос, но куда этот код вставлять чтобы работало?
|
|
|||||
Негуру
администратор
Регистрация: Jan 2000
Адрес: Кёнигсберг in Moscow
Сообщений: 21,879
Записей в блоге: 7
|
Сохранить в файле с расширением jsfl. Потом в меню выберите Commands > Run command... и этот файл.
Либо скачайте модуль CommandPromt, позволяющий запускать jsfl в панели ide |
|
|||||
Нужно было решить аналогичную задачу, только в обратную сторону - уменьшение FPS, т.е. "сжатие таймлайна". Немного дописал код, может кому пригодится:
fl.outputPanel.clear (); // скрипт для автоформата таймлайна // для случая когда fps изменяется, а динамику надо сохранить myFile = fl.getDocumentDOM(); myTimeline = myFile.getTimeline(); var newFPS= prompt("new FPS:"); myNewRate = (newFPS==null) ? myFile.frameRate : parseInt(newFPS); myOldRate = myFile.frameRate; myCoeffRate = myNewRate/myOldRate; var addCoef; for (i = 0; i < myTimeline.layers.length; i++){ curLayer = myTimeline.layers[i]; myTimeline.setSelectedLayers(i); for (j = 0; j < curLayer.frames.length; j++){ curFrame = curLayer.frames[j]; if(curFrame.duration==1) continue; if(myCoeffRate > 1) { addCoef = curFrame.startFrame==0 ? 1 : 0; // если первый кадр - то добавляем 1 иначе нет addFr = Math.round(curFrame.duration * myCoeffRate - curFrame.duration) +addCoef; myTimeline.insertFrames(addFr, false, j); j += curFrame.duration - 1; } else if(myCoeffRate<1) { remFr = Math.round(curFrame.duration - curFrame.duration * myCoeffRate); myTimeline.removeFrames(curFrame.startFrame, curFrame.startFrame+remFr); j += curFrame.duration + 0; } } } if (myCoeffRate!=1) myFile.frameRate = myNewRate; |
Часовой пояс GMT +4, время: 12:03. |
|
« Предыдущая тема | Следующая тема » |
|
|