Использование 4x4 3DMatrix в AS3 для искажения изображений

У меня есть растровое изображение AS3, которое я хотел бы исказить так:

Я хотел бы только исказить нижнюю часть изображения и оставить верхнюю часть в покое. Основываясь на моих исследованиях, которые я сделал до сих пор, похоже, что я хотел бы использовать класс Matrix3D, но я не совсем уверен, как его эффективно реализовать.

благодаря ответу ниже, эта статья является отличным ресурсом для понимания класса Matrix3D с 3x3 матрица: http://www.senocular.com/flash/tutorials/transformmatrix/ Тем не менее, как удивительный, как этот учебник, он не обеспечивает возможность перекоса изображения выше. То, что я ищу, - это аналогичный учебник о том, как использовать матрицу 4x4. Все, что я хотел бы знать, это где поместить числа в матрицу, и я должен быть в состоянии выяснить все остальное.

вот пример кода на то, что у меня есть для:

var tempLoader:Loader=new Loader();
var tempBitmap:Bitmap;
var fattenTheBottom:Number;
tempLoader.load(new URLRequest("image.png"));
tempLoader.contentLoaderInfo.addEventListener(Event.COMPLETE,castBitmap);
function castBitmap(e:Event):void
{
    tempLoader.contentLoaderInfo.removeEventListener(Event.COMPLETE,castBitmap);
    tempBitmap = Bitmap(tempLoader.content);
    // Make the image into a trapezoid here using fattenTheBottom
    addChild(tempBitmap);
}

любой совет был бы чудесно ценю!

2 ответов


если вы хотите быстрый способ использования Matrix3D, вот пример того, какие значения вы должны использовать:

var m3d:Matrix3D = new Matrix3D(Vector.<Number>([
    1, 0,    0,    0, 
    0, 1.15, 0.25, 0.00005,
    0, 0,    1,    0,
    0, 0,    0,    1
]));
tempBitmap.transform.matrix3D = m3d;

но скоро вы заметите, что этот подход искажает изображение способами, которые вы не хотите. Например, это будет горизонтально сожмите изображение с одной стороны (как вы хотите), но содержимое изображения будет растянуто вертикально как хорошо. Трудно объяснить, но как только вы попробуете вышеуказанный метод, вы заметите, как изображение вертикально растягивается.

такой же эффект можно получить с помощью rotationX в сочетании с PerspectiveProjection и scaleY.

если вы хотите более элегантное решение, как в коде, так и в результатах изображения, попробуйте DistortImage. Метод там не прямолинейный (использует сетку подизображений), но имеет отличные результаты.


Я могу только рекомендовать вам прочитать лучшую информацию только я когда-либо находил об этом:
понимание матрицы преобразования

читая это, я думаю, вы действительно могли бы понять все о transform matrix. Это от Flash 8 (AS2), но это теоретическая информация будет служить также с использованием AS3.