码迷,mamicode.com
首页 > 其他好文 > 详细

3D星形贴图

时间:2019-05-22 22:38:18      阅读:142      评论:0      收藏:0      [点我收藏+]

标签:i+1   pack   height   display   开发   声明   bool   i++   pen   

3D星形贴图:

/**
 *
 * *---------------------*
 * |  *** 3D星形贴图 ***  |
 * *---------------------*
 *
 * 编辑修改收录:fengzi(疯子、wu341、wgq341)
 *
 * 不会写代码,我是代码搬运工。
 *
 * 联系方式:QQ(493712833)。
 *
 * 随   笔: https://www.cnblogs.com/fengziwu/
 *
 * 版权协议:请自觉遵守LGPL协议,欢迎修改、复制、转载、传播给更多需要的人。
 * 免责声明:任何因使用此软件导致的纠纷与软件/程序开发者无关。
 * 日   期: 2019.05.08
 *
 */
package fengzi.bmd
{
    import flash.display.Bitmap;
    import flash.display.BitmapData;
    import flash.display.MovieClip;
    import flash.display.Sprite;
    import flash.display.TriangleCulling;
    import flash.events.Event;
    import flash.geom.Vector3D;
   
    public class StarTexture extends Sprite
    {
        private var _bmpd:BitmapData;
        private var _pointContainer:Sprite;
        private var _graphicContainer:Sprite;
        private var _pointArr:Array = [];
        private var _objArr:Array = [];
        private var _num:int = 5;
        private var _boo:Boolean;//是否是离五角星中心点较近的顶点
        private var _radius1:Number;//五角星中心点离较远顶点的距离(可看作五角星外接圆的半径)
        private var _radius2:Number;//五角星中心点离较近顶点的距离(可看作五角星内接圆的半径)
        private var _focus:Number = 400;
		
		/***
		* 3D星形贴图
		* @param   img         图片对象
		* @param   _radius1    五角星中心点离较远顶点的距离(可看作五角星外接圆的半径)
		* @param   _radius2    五角星中心点离较近顶点的距离(可看作五角星内接圆的半径)
		***/
        public function StarTexture(img:*,_radius1:Number = 100,_radius2:Number = 40)
        {
			this._radius1=_radius1;
			this._radius2=_radius2;
            initViews(img);
            initEventListeners();
        }
        private function initViews(img:*):void
        {
            _pointContainer = new Sprite();
            _graphicContainer = new Sprite();
            _pointContainer.x = _graphicContainer.x =img.width*0.5;
            _pointContainer.y = _graphicContainer.y = img.height*0.5;
		    _bmpd = new BitmapData(img.width,img.height,false,0)
			_bmpd.draw(img)
            this.addChild(_pointContainer);
            this.addChild(_graphicContainer);
            createStar();
        }
        private function initEventListeners():void
        {
            this.addEventListener(Event.ENTER_FRAME,onEnterFrame);
        }
        private function onEnterFrame(e:Event):void{
            for(var i:int=0;i<_pointArr.length;i++){
                _pointArr[i].Z = (_pointArr[i] as MovieClip).transform.getRelativeMatrix3D(_pointContainer).position.z;
                _pointArr[i].X = (_pointArr[i] as MovieClip).transform.getRelativeMatrix3D(_pointContainer).position.x*(_focus/(_focus+_pointArr[i].Z));
                _pointArr[i].Y = (_pointArr[i] as MovieClip).transform.getRelativeMatrix3D(_pointContainer).position.y*(_focus/(_focus+_pointArr[i].Z));
                (_pointArr[i] as MovieClip).transform.matrix3D.appendRotation((mouseX-_pointContainer.x)/50,Vector3D.Y_AXIS);
                (_pointArr[i] as MovieClip).transform.matrix3D.appendRotation((_pointContainer.y-mouseY)/50,Vector3D.X_AXIS);
            }
            _graphicContainer.graphics.clear();
            _objArr = [];
            for(i=0;i<_num*2;i++){
                var vertices:Vector.<Number> = new Vector.<Number>();
                vertices.push(_pointArr[_num*2].X,_pointArr[_num*2].Y,_pointArr[i].X,_pointArr[i].Y,_pointArr[(i+1)%(_num*2)].X,_pointArr[(i+1)%(_num*2)].Y,_pointArr[(i+2)%(_num*2)].X,_pointArr[(i+2)%(_num*2)].Y);
                var indices:Vector.<int> = new Vector.<int>([0,1,2,0,2,3]);
                var uvtData:Vector.<Number> = Vector.<Number>([0,0,1,0,1,1,0,1]);//不能new,如果new会导致运行flash.display.Graphics.drawTriangles()运行错误:ArgumentError: Error #2004: 某个参数无效。tell me why?
                var Z:Number = _pointArr[i].Z + _pointArr[(i+1)%(_num*2)].Z;
                _objArr.push({V:vertices,I:indices,U:uvtData,Z:Z});
            }
            _objArr.sortOn("Z",18);
            for(i =0;i<_objArr.length;i++){
                _graphicContainer.graphics.beginBitmapFill(_bmpd);
                _graphicContainer.graphics.drawTriangles(_objArr[i].V,_objArr[i].I,_objArr[i].U,TriangleCulling.NONE);
                _graphicContainer.graphics.endFill();
            }
        }
        private function createStar():void
        {
            for(var i:int = 0;i<_num*2;i++){
                var mc:MovieClip = new MovieClip();
                _pointContainer.addChild(mc);
                if(_boo){
                    mc.x=_radius2*Math.cos(2*Math.PI/(_num*2)*i);
                    mc.y=_radius2*Math.sin(2*Math.PI/(_num*2)*i);
                }else{
                    mc.x=_radius1*Math.cos(2*Math.PI/(_num*2)*i);
                    mc.y=_radius1*Math.sin(2*Math.PI/(_num*2)*i);
                }
                mc.z = 0;
                _pointArr.push(mc);
                _boo = !_boo;
            }
            var centerMC:MovieClip = new MovieClip();
            _pointContainer.addChild(centerMC);
            centerMC.x = 0;centerMC.y = 0;centerMC.z = -60;
            _pointArr.push(centerMC);
        }
    }
}

  

3D星形贴图

标签:i+1   pack   height   display   开发   声明   bool   i++   pen   

原文地址:https://www.cnblogs.com/fengziwu/p/10908855.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!