3D模型贴图类

3D模型贴图类,这个类能实现任意形状的贴图,效果还不错哦
  1. package {
  2.   import flash.display.Sprite;
  3.   import flash.display.BitmapData;
  4.   import flash.display.MovieClip;
  5.   import flash.geom.Matrix;
  6.   public class DistortImage {
  7.     var _mc:MovieClip;
  8.     var texture:BitmapData;
  9.     var _vseg:Number;
  10.     var _hseg:Number;
  11.     var _w:Number;
  12.     var _h:Number;
  13.     var _aMcs:Array;
  14.     var _p:Array;
  15.     var _tri:Array;
  16.     var _xMin:Number;
  17.     var _yMin:Number;
  18.     var _xMax:Number;
  19.     var _yMax:Number;
  20.     var _hsLen:Number;
  21.     var _vsLen:Number;
  22.     function DistortImage(mc:MovieClip, ptexture:BitmapData, vseg:Number, hseg:Number) {
  23.       _mc = mc;
  24.       if (ptexture is BitmapData) {
  25.         texture = ptexture;
  26.       } else if (ptexture is MovieClip) {
  27.         texture = new BitmapData(ptexture.width, ptexture.height);
  28.         texture.draw(ptexture);
  29.       }
  30.       _vseg = vseg || 0;
  31.       _hseg = hseg || 0;
  32.       _w = texture.width;
  33.       _h = texture.height;
  34.       _aMcs = new Array();
  35.       _p = new Array();
  36.       _tri = new Array();
  37.       this.__init();
  38.     }
  39.     public function setImg(point1,point2,point3, point4) {
  40.       var _loc8 = _w;
  41.       var _loc9 = _h;
  42.       var _loc13 = point4.x - point1.x;
  43.       var _loc11 = point4.y - point1.y;
  44.       var _loc12 = point3.x - point2.x;
  45.       var _loc10 = point3.y - point2.y;
  46.       var _loc7 = _p.length;
  47.       while (--_loc7 > -1) {
  48.         var _loc2 = _p[_loc7];
  49.         var _loc6 = (_loc2.x - _xMin) / _loc8;
  50.         var _loc3 = (_loc2.y - _yMin) / _loc9;
  51.         var _loc4 = point1.x + _loc3 * _loc13;
  52.         var _loc5 = point1.y + _loc3 * _loc11;
  53.         _loc2.sx = _loc4 + _loc6 * (point2.x + _loc3 * _loc12 - _loc4);
  54.         _loc2.sy = _loc5 + _loc6 * (point2.y + _loc3 * _loc10 - _loc5);
  55.       }
  56.       this.__render();
  57.     }
  58.     private function __init() {
  59.       _p = new Array();
  60.       _tri = new Array();
  61.       var _loc13 = _w / 2;
  62.       var _loc14 = _h / 2;
  63.       _xMin = _yMin = 0;
  64.       _xMax = _w;
  65.       _yMax = _h;
  66.       _hsLen = _w / (_hseg + 1);
  67.       _vsLen = _h / (_vseg + 1);
  68.       for (var i = 0; i < _hseg + 2; ++i) {
  69.         for (var j = 0; j < _vseg + 2; ++j) {
  70.           var h:Number = i * _hsLen;
  71.           var v:Number = j * _vsLen;
  72.           var matrix:Object={x:h,y:v,sx:h,sy:v};
  73.           _p.push(matrix);
  74.         }
  75.       }
  76.       var _loc4;
  77.       var _loc5;
  78.       var _loc6;
  79.       for (var _loc3 = 0; _loc3 < _vseg + 1; ++_loc3) {
  80.         for (var _loc2 = 0; _loc2 < _hseg + 1; ++_loc2) {
  81.           _loc4 = _p[_loc2 + _loc3 * (_hseg + 2)];
  82.           _loc5 = _p[_loc2 + _loc3 * (_hseg + 2) + 1];
  83.           _loc6 = _p[_loc2 + (_loc3 + 1) * (_hseg + 2)];
  84.           this.__addTriangle(_loc4, _loc5, _loc6);
  85.           _loc4 = _p[_loc2 + (_loc3 + 1) * (_vseg + 2) + 1];
  86.           _loc5 = _p[_loc2 + (_loc3 + 1) * (_vseg + 2)];
  87.           _loc6 = _p[_loc2 + _loc3 * (_vseg + 2) + 1];
  88.           this.__addTriangle(_loc4, _loc5, _loc6);
  89.         }
  90.       }
  91.       this.__render();
  92.     }
  93.     private function __addTriangle(point1:Object,point2:Object,point3:Object) {
  94.       var _loc3;
  95.       var _loc4;
  96.       var _loc10;
  97.       var _loc6;
  98.       var _loc5;
  99.       var _loc11;
  100.       var _loc2 = new Matrix();
  101.       _loc3 = point1.x;
  102.       _loc4 = point1.y;
  103.       _loc10 = point2.x;
  104.       _loc6 = point2.y;
  105.       _loc5 = point3.x;
  106.       _loc11 = point3.y;
  107.       _loc2.tx = -_loc4 * (_w / (_loc6 - _loc4));
  108.       _loc2.ty = -_loc3 * (_h / (_loc5 - _loc3));
  109.       _loc2.a = _loc2.d = 0;
  110.       _loc2.b = _h / (_loc5 - _loc3);
  111.       _loc2.c = _w / (_loc6 - _loc4);
  112.       _tri.push([point1, point2, point3, _loc2]);
  113.     }
  114.     private function __render() {
  115.       var _loc14;
  116.       var _loc4;
  117.       var _loc5;
  118.       var _loc6;
  119.       var _loc8;
  120.       var _loc9;
  121.       var _loc13 = 1 / _h;
  122.       var _loc12 = 1 / _w;
  123.       var _loc3 = _mc;
  124.       _loc3.graphics.clear();
  125.       var _loc7;
  126.       var _loc2:Matrix =new  Matrix();
  127.       var _loc10:Matrix =new  Matrix();
  128.       var _loc11 = _tri.length;
  129.       while (--_loc11 > -1) {
  130.         _loc7 = _tri[_loc11];
  131.         _loc4 = _loc7[0];
  132.         _loc5 = _loc7[1];
  133.         _loc6 = _loc7[2];
  134.         _loc10 = _loc7[3];
  135.         _loc8 = _loc4.sx;
  136.         _loc2.a = (_loc5.sx - _loc4.sx) * _loc12;
  137.         _loc9 = _loc4.sy;
  138.         _loc2.b = (_loc5.sy - _loc4.sy) * _loc12;
  139.         _loc2.c = (_loc6.sx - _loc8) * _loc13;
  140.         _loc2.d = (_loc6.sy - _loc9) * _loc13;
  141.         _loc2.tx = _loc8;
  142.         _loc2.ty = _loc9;
  143.         _loc2 = this.__concat(_loc2, _loc10);
  144.         _loc3.graphics.beginBitmapFill(texture, _loc2, falsefalse);
  145.         _loc3.graphics.moveTo(_loc8, _loc9);
  146.         _loc3.graphics.lineTo(_loc5.sx, _loc5.sy);
  147.         _loc3.graphics.lineTo(_loc6.sx, _loc6.sy);
  148.         _loc3.graphics.endFill();
  149.       }
  150.     }
  151.     private function __concat(m1:Matrix, m2:Matrix) {
  152.       var _loc2 = new Matrix();
  153.       _loc2.a = m1.c * m2.b;
  154.       _loc2.b = m1.d * m2.b;
  155.       _loc2.c = m1.a * m2.c;
  156.       _loc2.d = m1.b * m2.c;
  157.       _loc2.tx = m1.a * m2.tx + m1.c * m2.ty + m1.tx;
  158.       _loc2.ty = m1.b * m2.tx + m1.d * m2.ty + m1.ty;
  159.       return _loc2;
  160.     }
  161.   }
  162. }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值