2012-06-29 20 views
6

Tôi có một hình ảnh bitmap AS3 mà tôi muốn nghiêng như vậy:Sử dụng một 3DMatrix 4x4 trong AS3 để nghiêng hình ảnh

tôi sẽ chỉ muốn nghiêng phần dưới cùng của hình ảnh, và rời khỏi phần trên một mình. Dựa trên nghiên cứu của tôi mà tôi đã làm cho đến nay, có vẻ như tôi muốn sử dụng lớp Matrix3D, nhưng tôi không hoàn toàn chắc chắn làm thế nào để thực hiện nó một cách hiệu quả.

Nhờ một câu trả lời dưới đây, bài viết này là một nguồn tài nguyên tuyệt vời để hiểu được lớp Matrix3D với một ma trận 3x3: http://www.senocular.com/flash/tutorials/transformmatrix/ Tuy nhiên như tuyệt vời như hướng dẫn có nghĩa là, nó không cung cấp khả năng nghiêng hình trên. Những gì tôi đang tìm kiếm là một hướng dẫn tương tự về cách sử dụng ma trận 4x4. Tất cả những gì tôi muốn biết là đặt những con số vào ma trận, và tôi sẽ có thể tìm ra mọi thứ khác.

Dưới đây là một số mã ví dụ về những gì tôi đã có như vậy vì:

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

Lời khuyên nào sẽ được đánh giá cao tuyệt vời!

+0

Có thể sẽ dễ dàng hơn khi sử dụng xoay vòng 3D để đưa phần dưới cùng gần hơn với người xem? Bạn không chắc chắn nếu công cụ xoay 3D đi kèm với một AS3 tương đương, nhưng nếu không bạn có thể thử thực hiện một công cụ 3D cơ bản. – Marty

+0

Loại khó khăn nào bạn muốn có thể kiểm soát, đó là bạn quan tâm đến việc có thể xác định rõ chiều rộng của phần dưới cùng của hình thang. Nếu không phải là Marty gợi ý bạn sẽ có thể chỉ sử dụng rotationX http://help.adobe.com/en_US/FlashPlatform/reference/actionscript/3/flash/display/DisplayObject.html#rotationX nếu không tôi nghĩ rằng việc sử dụng 3DMatrix sẽ hoạt động http://help.adobe.com/en_US/FlashPlatform/reference/actionscript/3/flash/geom/Matrix3D.html#appendRotation() dịch xoay quanh X dịch rồi tempBitmap.transform.matrix3D = your3DMatrix. – shaunhusain

+0

Nếu bạn quan tâm đến việc kiểm soát chặt chẽ bất kỳ ràng buộc nào về kích thước của Bitmap cần chính xác hơn là nhãn cầu, điều này có thể sẽ đòi hỏi nhiều hơn một chút toán học. – shaunhusain

Trả lời

4

Nếu bạn muốn một cách nhanh chóng sử dụng Matrix3D, đây là một ví dụ về các loại giá trị mà bạn nên sử dụng:

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; 

Nhưng chẳng mấy chốc bạn sẽ nhận thấy rằng phương pháp này làm méo mó hình ảnh theo những cách bạn không muốn. Ví dụ: theo chiều ngang sẽ nén hình ảnh của bạn ở một bên (như bạn muốn), nhưng nội dung của hình ảnh sẽ được kéo dài theo chiều dọc. Khó giải thích, nhưng một khi bạn thử phương pháp trên, bạn sẽ thấy hình ảnh đang được kéo dài theo chiều dọc.

Cùng một loại hiệu ứng có thể thu được bằng cách sử dụng rotationX kết hợp với PerspectiveProjectionscaleY.

Nếu bạn muốn có giải pháp thanh lịch hơn, cả về mã và kết quả hình ảnh, hãy thử xem DistortImage. Phương pháp không có thẳng về phía trước (sử dụng một mạng lưới các ảnh con), nhưng có kết quả tuyệt vời.

+0

+1 cho DistortImage, đó là một lớp nhỏ tuyệt vời. – Cay

2

Tôi chỉ có thể khuyên bạn nên đọc các thông tin tốt nhất duy nhất mà tôi từng được tìm thấy về vấn đề này:
Understanding the Transformation Matrix

Đọc này, tôi nghĩ rằng, bạn thực sự có thể hiểu mọi thứ về chuyển đổi ma trận. Đó là từ Flash 8 (AS2), nhưng đó là thông tin lý thuyết sẽ phục vụ cũng như sử dụng AS3.

Các vấn đề liên quan