On May 3, 2006, at 10:14 AM, [EMAIL PROTECTED] wrote:

Hi
Anyone been able to use the convolution filter to create realistic motion blur effects?

I do not believe a convolution operation cannot perform a zoom and spin blur alone. Those need to be performed separately on every single pixel in an image. You can get a similar result from transforming the bitmap using a transformation matrix that's offset from the center of the zoom or spin, rotating or scaling the copied bitmap and overlaying the pixels onto the original.

Motion blur can be done to an extent. The problem that you will find is that it doesn't work for fast curved motion. Slower curved motion it works fine.

The code below is what I posted on my now-defunct site shiftedPixels. It's a simplified method to do motion blur by using sampled locations and linearly interpolating filter-applied copies of the source.

A better choice would be to use a spline-based sampling system on your object and motion blur along points of the spline using a surve or slerp method. Of course, doing so will be much slower due to point- on-curve routines.

cheers,

Jon

//      --------------------------------------------------------
//      Temporal Anti-aliasing (motion blur)
//      jon bradley, 2005
//
//      Create a movie clip on your stage named "src".
//      Copy the following code in the first frame.
//      Set the frame rate of your file high, like 120.
//      --------------------------------------------------------

import flash.display.BitmapData;
import flash.filters.*;
import flash.geom.*;

_quality = "medium";
src.startDrag(true);
Mouse.hide();
src._visible = false;


// set up the filters:
colorM = new ColorMatrixFilter ([1,0,0,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0.4,0]);
blurFilter = new BlurFilter(5, 5, 1);

src.cacheAsBitmap = true;

var blurImg:BitmapData = new BitmapData(550, 400, true, 0xFFFFFF);
blurImg.transparent = false;

var blurClip:MovieClip = createEmptyMovieClip("blurClip", 99947);
blurClip.attachBitmap(blurImg, 0);
blurClip.cacheAsBitmap = true;

var rect = new flash.geom.Rectangle(0,0,Stage.width, Stage.height);
var pt = new flash.geom.Point(0,0);

//      Linear interpolation to get points between object position points
//      A more accurate choice would be to use spline interpolation based on
//      a motion path of the object - of course this will run much slower.
function lerp(t,a,b)
{
        return a+t*(b-a);
}

var x = _xmouse;
var y = _ymouse;

function updateBlur()
{
        var m = src.transform.matrix;
        var xa = _xmouse;
        var dx = Math.sqrt(Math.abs(xa*xa - x*x));
        var ya = _ymouse;
        var dy = Math.sqrt(Math.abs(ya*ya - y*y));
        
        blurFilter.blurX = dx/20;
        blurFilter.blurY = dy/20;
        
        var i = 15;
        var t = 1/i;
        while (i--)
        {
                m.tx = lerp( (i+1)*t, xa, x);
                m.ty = lerp( (i+1)*t, ya, y);
                blurImg.draw(src,m);
        }
        
        blurImg.applyFilter(blurImg, rect, pt, colorM);
        blurImg.draw(src,m);
        blurImg.applyFilter(blurImg, rect, pt, blurFilter);
        
        x = _xmouse;
        y = _ymouse;
}

//      Pprocessor intensive - stick with onEnterFrame
//      blurInterval = setInterval(updateBlur,0);

onEnterFrame = function()
{
        src._x = _xmouse;
        src._y = _ymouse;
        updateBlur();
}

//      END CODE
_______________________________________________
[email protected]
To change your subscription options or search the archive:
http://chattyfig.figleaf.com/mailman/listinfo/flashcoders

Brought to you by Fig Leaf Software
Premier Authorized Adobe Consulting and Training
http://www.figleaf.com
http://training.figleaf.com

Reply via email to