3D星形贴图

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

  

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

时间: 2024-11-19 22:31:02

3D星形贴图的相关文章

[ActionScript 3.0] AS3 3D星形贴图

1 package 2 { 3 import flash.display.Bitmap; 4 import flash.display.BitmapData; 5 import flash.display.MovieClip; 6 import flash.display.Sprite; 7 import flash.display.TriangleCulling; 8 import flash.events.Event; 9 import flash.geom.Vector3D; 10 11

JFreeChart在Struts2中实现3D饼状图统计

在Struts2中,用JFreeChart实现3D饼状图统计 前段时间学习了一下JFreeChart,现在来整理一下自己所作的实例. 下面分别用两种方式来实现: 一种是以java应用程序的方式,一种是以web项目程序的方式 需要加入的jar包有:  jcommon-1.0.17.jar . jfreechart-1.0.14.jar(前两个是JFreeChart中所带的,在下载的JFreeChart的lib目录下) . struts2-jfreechart-plugin-2.3.16.3.jar

3d轮播图的效果实现

最近工程比较松,所以自己研究了一下3d轮播图的实现原理,其实说白了也不是很难就是在x,y,z轴上的平移和整个平面的旋转变换达到的效果, 下面是实现代码 html部分 <div class="stage"> <div class="contains"> <div style="transform: rotateY(0deg) translateZ(400px);">关于我</div> <div

Web全栈之路 1.CSS3中3D立方体以及3D轮播图

1.3D坐标系 3D坐标可以用左手来模拟,其中大拇指方向默认是X轴正方向,食指方向是Y轴正方向,中指方向是Z轴正方向.注意:当设置transform:rotateX(90deg)时,相当于将X轴转动90°,此时Z轴正方向向上,所以设置transform:translateZ(150px)时,就产生了3D立方体的上面,具体原理可以通过chrome浏览器审查元素来调试. 2.3D视图 transform-style:flat(默认,二维效果) / preserve-3d(三维效果).设置一个元素的t

一组神奇的 3D Gif 动图

虽然 gif 动图/动画似乎是无处不在现在了,但有些聪明人已经把 gif 动图的视觉体验提高了一个层级.在一组图片上仔细添加一组纯色(通常是白色)的竖线,就产生了一个令人难以置信的立体效果了.当图中人物或物体移动到前景(foreground),他们似乎要穿过屏幕,直击看客. 添加的白条是跨入前景的视觉标记.一旦物体"进入"线条前面,就挡住了白条,看客的大脑立即把画面转为三维场景了.优秀的 3D gif 制作者利用这个效果,从电影或视频剪辑中选择一些场景和物体(无论人物.动物.怪物或投射

iMindmap 10世界上最专业的手绘3D思维导图软件

下载iMindmap 10.0.4 - 世界上最专业的手绘3D思维导图软件 iMindMap是由Tony Buzan开发的思维导图软件,帮助用户在思考和实现思想的过程中更有效地创建和工作.这是一个非常强大的软件,为用户提供了很多工具来帮助将想法转换成图像. iMindMap思维导图软件的新点 iMindMap 10被认为是计算机最全面的思维导图工具.新的iMindMap 10界面经过改进和重新设计,可以更清晰地显示,关注主要功能并提高用户生产力. 新时间地图视图:缩短思维导图和时间线项目计划之间

妙味课堂实战功能开发视频教程 3D翻转焦点图/瀑布流/拖拽购物车/模块化开发等实战教程

<HTML5梦工厂 - 码农俱乐部视频>├<第八期码农俱乐部-技术之夜-3D翻转焦点图>│  ├1-码农俱乐部技术之夜-3D翻转焦点图_.mkv│  ├2-码农俱乐部技术之夜-3D翻转焦点图_.mkv│  ├3-码农俱乐部技术之夜-3D翻转焦点图_.mkv│  └lesson8.zip├<第二期码农俱乐部-技术之夜-瀑布流效果>│  ├1-码农俱乐部技术之夜-瀑布流效果1(原理介绍)_.mkv│  ├2-码农俱乐部技术之夜-瀑布流效果2(布局和数据的获取)_.mkv│ 

featureCarousel.js 3d轮播图插件

jQuery Feature Carousel 插件是国外的一比较优秀的旋转木马图片插件. 点击这里进入原文. 插件特点: 1.处理div的3d旋转木马效果. 2.支持一个中心,2个侧面的功能 3.中心区域可点击 4.显示隐藏文本功能(可以使用css显示在图片的任何位置) 5.可以修改速度,效果,等很多的参数. 6.支持 Chrome,FireFox,Safari和IE6 +浏览器. 7.需要 jquery v1.3+ 8.支持图片预加载 怎么使用: 1.引入jQuery v1.3+和 caro

实现的3d轮播图

1 <!DOCTYPE html> 2 <html lang="en"> 3 <head> 4 <meta charset="UTF-8"> 5 <title>Title</title> 6 <style> 7 *{ 8 padding: 0; 9 margin: 0; 10 } 11 .stage{ 12 display: flex; 13 14 perspective: 1500