3D模型贴图类,这个类能实现任意形状的贴图,效果还不错哦
- package {
- import flash.display.Sprite;
- import flash.display.BitmapData;
- import flash.display.MovieClip;
- import flash.geom.Matrix;
- public class DistortImage {
- var _mc:MovieClip;
- var texture:BitmapData;
- var _vseg:Number;
- var _hseg:Number;
- var _w:Number;
- var _h:Number;
- var _aMcs:Array;
- var _p:Array;
- var _tri:Array;
- var _xMin:Number;
- var _yMin:Number;
- var _xMax:Number;
- var _yMax:Number;
- var _hsLen:Number;
- var _vsLen:Number;
- function DistortImage(mc:MovieClip, ptexture:BitmapData, vseg:Number, hseg:Number) {
- _mc = mc;
- if (ptexture is BitmapData) {
- texture = ptexture;
- } else if (ptexture is MovieClip) {
- texture = new BitmapData(ptexture.width, ptexture.height);
- texture.draw(ptexture);
- }
- _vseg = vseg || 0;
- _hseg = hseg || 0;
- _w = texture.width;
- _h = texture.height;
- _aMcs = new Array();
- _p = new Array();
- _tri = new Array();
- this.__init();
- }
- public function setImg(point1,point2,point3, point4) {
- var _loc8 = _w;
- var _loc9 = _h;
- var _loc13 = point4.x - point1.x;
- var _loc11 = point4.y - point1.y;
- var _loc12 = point3.x - point2.x;
- var _loc10 = point3.y - point2.y;
- var _loc7 = _p.length;
- while (--_loc7 > -1) {
- var _loc2 = _p[_loc7];
- var _loc6 = (_loc2.x - _xMin) / _loc8;
- var _loc3 = (_loc2.y - _yMin) / _loc9;
- var _loc4 = point1.x + _loc3 * _loc13;
- var _loc5 = point1.y + _loc3 * _loc11;
- _loc2.sx = _loc4 + _loc6 * (point2.x + _loc3 * _loc12 - _loc4);
- _loc2.sy = _loc5 + _loc6 * (point2.y + _loc3 * _loc10 - _loc5);
- }
- this.__render();
- }
- private function __init() {
- _p = new Array();
- _tri = new Array();
- var _loc13 = _w / 2;
- var _loc14 = _h / 2;
- _xMin = _yMin = 0;
- _xMax = _w;
- _yMax = _h;
- _hsLen = _w / (_hseg + 1);
- _vsLen = _h / (_vseg + 1);
- for (var i = 0; i < _hseg + 2; ++i) {
- for (var j = 0; j < _vseg + 2; ++j) {
- var h:Number = i * _hsLen;
- var v:Number = j * _vsLen;
- var matrix:Object={x:h,y:v,sx:h,sy:v};
- _p.push(matrix);
- }
- }
- var _loc4;
- var _loc5;
- var _loc6;
- for (var _loc3 = 0; _loc3 < _vseg + 1; ++_loc3) {
- for (var _loc2 = 0; _loc2 < _hseg + 1; ++_loc2) {
- _loc4 = _p[_loc2 + _loc3 * (_hseg + 2)];
- _loc5 = _p[_loc2 + _loc3 * (_hseg + 2) + 1];
- _loc6 = _p[_loc2 + (_loc3 + 1) * (_hseg + 2)];
- this.__addTriangle(_loc4, _loc5, _loc6);
- _loc4 = _p[_loc2 + (_loc3 + 1) * (_vseg + 2) + 1];
- _loc5 = _p[_loc2 + (_loc3 + 1) * (_vseg + 2)];
- _loc6 = _p[_loc2 + _loc3 * (_vseg + 2) + 1];
- this.__addTriangle(_loc4, _loc5, _loc6);
- }
- }
- this.__render();
- }
- private function __addTriangle(point1:Object,point2:Object,point3:Object) {
- var _loc3;
- var _loc4;
- var _loc10;
- var _loc6;
- var _loc5;
- var _loc11;
- var _loc2 = new Matrix();
- _loc3 = point1.x;
- _loc4 = point1.y;
- _loc10 = point2.x;
- _loc6 = point2.y;
- _loc5 = point3.x;
- _loc11 = point3.y;
- _loc2.tx = -_loc4 * (_w / (_loc6 - _loc4));
- _loc2.ty = -_loc3 * (_h / (_loc5 - _loc3));
- _loc2.a = _loc2.d = 0;
- _loc2.b = _h / (_loc5 - _loc3);
- _loc2.c = _w / (_loc6 - _loc4);
- _tri.push([point1, point2, point3, _loc2]);
- }
- private function __render() {
- var _loc14;
- var _loc4;
- var _loc5;
- var _loc6;
- var _loc8;
- var _loc9;
- var _loc13 = 1 / _h;
- var _loc12 = 1 / _w;
- var _loc3 = _mc;
- _loc3.graphics.clear();
- var _loc7;
- var _loc2:Matrix =new Matrix();
- var _loc10:Matrix =new Matrix();
- var _loc11 = _tri.length;
- while (--_loc11 > -1) {
- _loc7 = _tri[_loc11];
- _loc4 = _loc7[0];
- _loc5 = _loc7[1];
- _loc6 = _loc7[2];
- _loc10 = _loc7[3];
- _loc8 = _loc4.sx;
- _loc2.a = (_loc5.sx - _loc4.sx) * _loc12;
- _loc9 = _loc4.sy;
- _loc2.b = (_loc5.sy - _loc4.sy) * _loc12;
- _loc2.c = (_loc6.sx - _loc8) * _loc13;
- _loc2.d = (_loc6.sy - _loc9) * _loc13;
- _loc2.tx = _loc8;
- _loc2.ty = _loc9;
- _loc2 = this.__concat(_loc2, _loc10);
- _loc3.graphics.beginBitmapFill(texture, _loc2, false, false);
- _loc3.graphics.moveTo(_loc8, _loc9);
- _loc3.graphics.lineTo(_loc5.sx, _loc5.sy);
- _loc3.graphics.lineTo(_loc6.sx, _loc6.sy);
- _loc3.graphics.endFill();
- }
- }
- private function __concat(m1:Matrix, m2:Matrix) {
- var _loc2 = new Matrix();
- _loc2.a = m1.c * m2.b;
- _loc2.b = m1.d * m2.b;
- _loc2.c = m1.a * m2.c;
- _loc2.d = m1.b * m2.c;
- _loc2.tx = m1.a * m2.tx + m1.c * m2.ty + m1.tx;
- _loc2.ty = m1.b * m2.tx + m1.d * m2.ty + m1.ty;
- return _loc2;
- }
- }
- }