2012-06-29 4 views
6

que tengo una imagen de mapa de bits AS3 que me gustaría para sesgar este modo:El uso de un 3DMatrix 4x4 en AS3 para sesgar imágenes

Sólo quisiera para sesgar la parte inferior de la imagen, y deja la parte superior solo. Basado en mi investigación que he hecho hasta ahora, parece que quisiera utilizar la clase Matrix3D, pero no estoy muy seguro de cómo implementarlo efectivamente.

Gracias a una respuesta más adelante, este artículo es un excelente recurso para entender la clase Matrix3D con una matriz 3x3: http://www.senocular.com/flash/tutorials/transformmatrix/ Sin embargo tan impresionante como el tutorial es, que no proporciona la capacidad para sesgar la imagen de arriba. Lo que estoy buscando es un tutorial similar sobre cómo usar una matriz 4x4. Todo lo que me gustaría saber es dónde poner los números en la matriz, y debería ser capaz de descubrir todo lo demás.

Aquí hay un código de ejemplo en lo que tengo hasta para:

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); 
} 

sería apreciada maravillosamente Cualquier consejo!

+0

Tal vez sea más fácil utilizar la rotación 3D para acercar la parte inferior al visor. No estoy seguro si la herramienta de rotación 3D viene con un equivalente de AS3, pero si no puede intentar implementar un motor 3D básico. – Marty

+0

Qué tipo de restricciones desea controlar, es decir, si le preocupa poder definir explícitamente el ancho de la parte inferior del trapezoide. Si no es como sugiere Marty, debería poder usar rotationX http://help.adobe.com/en_US/FlashPlatform/reference/actionscript/3/flash/display/DisplayObject.html#rotationX, de lo contrario, creo que usar una Matriz 3D funcionaría http://help.adobe.com/en_US/FlashPlatform/reference/actionscript/3/flash/geom/Matrix3D.html#appendRotation() translate gira alrededor de X translate y luego tempBitmap.transform.matrix3D = your3DMatrix. – shaunhusain

+0

Si le preocupa el control estricto de cualquiera de las limitaciones del tamaño del mapa de bits que deben ser más exactas en lugar de tener en cuenta, esto probablemente requerirá un poco más de matemática. – shaunhusain

Respuesta

4

Si desea una forma rápida usando Matrix3D, aquí es un ejemplo de la clase de valores que debe utilizar:

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; 

Pero pronto se dará cuenta de que este enfoque distorsiona la imagen de una manera no lo hace querer. Por ejemplo, se horizontalmente exprima su imagen en un lado (como desee), pero el contenido de la imagen se extenderá verticalmente también. Difícil de explicar, pero una vez que pruebe el método anterior, notará cómo la imagen se estira verticalmente.

El mismo tipo de efecto se puede obtener utilizando rotationX combinado con PerspectiveProjection y scaleY.

Si desea una solución más elegante, tanto en código como en resultados de imágenes, pruebe DistortImage. El método no es directo (usa una malla de subimágenes), pero tiene excelentes resultados.

+0

+1 para DistortImage, es una gran pequeña clase. – Cay

2

Sólo puedo recomendar a leer la mejor información única que he encontrado en esto:
Understanding the Transformation Matrix

La lectura de este, creo, que realmente podía entender todo acerca de transformar la matriz. Es de Flash 8 (AS2), pero su información teórica también servirá con AS3.

Cuestiones relacionadas