|
|
|||||
помогите улучшить эффект с Blur
Всем доброго дня.
Я собрал из простеньких скриптов небольшой разблюриватель, который размывает объект в зависимости от его скорости движения. Но проблема в том, что расстояние от начала и до конца размытия определяется в мувике с задержкой в один кадр, и из-за этого качество размытия ухудшается (размытие идет с ощутимой задержкой, видной глазу) как можно это улучшить? Последний раз редактировалось Кот Баюн; 08.12.2013 в 09:15. |
|
|||||
неужели такой исходник сложный
что прям совсем никто не знает |
|
|||||
Смутно это всё как-то.....
|
|
|||||
Смутно что?
Код в исходнике или сам принцип? Добавлено через 13 минут Размываемый мувик имеет instance name fon. На нем есть определенные скрипты, которые движут его влево-вправо, вверх-вниз (мышкой) Далее. На Stage в левом углу есть такой черный квадратик, зовется размывалка. В первом кадре размывалки написано - здесь отслеживается начальная точка, откуда надо размывать во втором кадре код - _root.speedX2 = _root.fon._x; _root.speedXRaznost = _root.speedX1-_root.speedX2; _root.speedY2 = _root.fon._y; _root.speedYRaznost = _root.speedY1-_root.speedY2; потом между точками 1 и 2 находится разность. Полученное число и есть BlurX и BlurY в фильтре. Если число отрицательно, оно умножается на -1, потому что Blur не будет работать с минусом. 1-й и 2-й кадр в размывалке зациклены на бесконечность. На первом кадре таймлайна код import flash.filters.BlurFilter; this.onEnterFrame = function() { var blur_blurX:Number = _root.speedXRaznost; var blur_blurY:Number = _root.speedYRaznost; var blur_quality:Number = 1; var filter_blur:BlurFilter = new BlurFilter(blur_blurX, blur_blurY, blur_quality); fon.filters = [filter_blur]; trace(_root.speedXRaznost); if (_root.speedXRaznost<0) { _root.speedXRaznost=_root.speedXRaznost*-1; } if (_root.speedYRaznost<0) { _root.speedYRaznost=_root.speedYRaznost*-1; } }; Нужно, чтобы задержка высчитывалась программно, с помощью какого-нибудь таймера, вроде setInterval Тогда будет гладко. |
|
|||||
Модрон-ветеринар
|
Как-то у вас все сложно. Лишние сущности - мувики дополнительные с кадрами, разблюриватели. Умножение на "-1" с условием (когда есть же метод Math.abs).
См. пример, может так? Движение просто по onMouseMove осуществялется, дельта - это и есть скорость, нормализуем blurX и blurY на 256, используя параметр этой дельты-скорости. Если нужна задержка какая-то то можно ввести и ее. Главное - понять, задержка между какими именно событиями вам нужна. "blur2" - покомпактнее, см. его
__________________
Идите первым! |
|
|||||
С onMouseMove мне метод не подходит.
У моего объекта область движения ограничена примерно на 100-200 пикселей с краев экрана. Соответственно, при движении мыши от края до края он часть пространства стоит неподвижно. А его вместо этого будет блюрить. Потому и расчет идет от разности точек А и Б. И почему-то этот метод дает чересчур длинные неправдоподобные хвосты. Особенно на медленных движениях. В моем коде я вижу только единственный недостаток - один кадр при скорости 25к/с слишком мало, для того чтобы флеш успел поймать значения переменных, посчитать разность между точками а и б и разблюрить. Из-за этого происходит задержка, слишком заметная глазу. Увеличение fps например, до 50, решает эту проблему, глаз не замечает скачка. Но 50 я не могу себе позволить, будет потом анимация и видео, сделанное на 25. Поэтому хотелось бы вместо зацикливания двух кадров, задать, чтобы точки А и Б отлавливались с программным таймером примерно раз в пол-кадра. Кстати, какая версия у этих исходников? Последний раз редактировалось Кот Баюн; 10.12.2013 в 15:42. |
|
|||||
Модрон-ветеринар
|
Цитата:
CS5. Не открывается? Привожу код: import flash.filters.BlurFilter; var blurQuality:Number = 3; var currentPosition:Array = [fon._x, fon._y]; var blurMax:Number = 300; //коэффициент "неразмытости" this.onEnterFrame = setBlur; this.onMouseMove = thisMouseMove; function thisMouseMove() { fon._x = this._xmouse; fon._y = this._ymouse; } function getDelta():Array { var currentDelta:Array = [currentPosition[0] - fon._x, currentPosition[1] - fon._y]; currentPosition[0] = fon._x; currentPosition[1] = fon._y; return currentDelta; } function setBlur () { var deltaXY:Array = getDelta(); //узнаем две дельты ("скорости") - по X и Y var blurX:Number = Math.abs(deltaXY[0] * 256 / blurMax); var blurY:Number = Math.abs(deltaXY[1] * 256 / blurMax); //устанавливаем ограничение blurX = blurX > 256 ? 256 : blurX; blurY = blurY > 256 ? 256 : blurY; var filterBlur:BlurFilter = new BlurFilter(blurX, blurY, blurQuality); fon.filters = [filterBlur]; }
__________________
Идите первым! |
|
|||||
Модрон-ветеринар
|
Смотрите такой вариант. Пересохранено для CS4, если что.
Что касается FPS, то представленный вариант хорошо работает и при 24 к/сек.
__________________
Идите первым! Последний раз редактировалось mooncar; 10.12.2013 в 18:51. |
|
|||||
Спасибо за помощь))
Будем искать) Теперь надо переустановить CS)) У меня три версии флеша, одна 8.0, две другие адобовские. Адобовские упали. Надо что-то придумывать. |
|
|||||
Модрон-ветеринар
|
Мой код из поста №7 будет работать по меньшей мере в обеих адобовских. Там только нет ограничения движения.
__________________
Идите первым! |
Часовой пояс GMT +4, время: 04:05. |
|
« Предыдущая тема | Следующая тема » |
|
|