zoukankan      html  css  js  c++  java
  • flash 3d基础学习

          3d图形在原有的平面x,y的基础上加入深度z轴,使用几何透视法重新计算物体x,y坐标。

    坐标系统

    flash 3d中默认使用右手坐标系统,x坐标从左到右,y坐标从上到下,z从外到里指向屏幕.如图:

    透视法

    远小近大的原理,物体越远越靠近消失点,缩放比例更小。

    透视公式

    scale = fl/(fl+z),z坐标越大,公式分母越大,缩放比例越小。

    例子,首先创建一个ball类。

    package
    {
    	import flash.display.ColorCorrection;
    	import flash.display.Sprite;
    	
    	/**
    	 *  @author:Gaara
    	 *  2012-3-5
    	 *
    	 **/
    	public class Ball extends Sprite
    	{
    		public function Ball(x:Number,y:Number,z:Number,color:int=0x00FF00,radius:Number=5)
    		{
    			super();
    			
    			this._x = x;
    			this._y = y;
    			this._z = z;
    			
    			graphics.beginFill(color);
    			graphics.drawCircle(0,0,radius);
    			graphics.endFill();
    		}
    		
    		public var _x:Number;
    		public var _y:Number;
    		public var _z:Number;		
    	}
    }
    

     创建主类

    package
    {
    	import flash.display.Sprite;
    	import flash.events.Event;
    	
    	/**
    	 *  @author:Gaara
    	 *  2012-3-5
    	 *
    	 **/
    	[SWF(width="800", height="600" ,frameRate="12", backgroundColor="#000000")]
    	public class TestCos extends Sprite
    	{
    		/** 绘制小球  **/
    		private var ballVec:Vector.<Ball> = new Vector.<Ball>;
    		
    		/**观察者与屏幕距离  **/
    		private const D:Number = 200;
    		
    		/**旋转角度  **/
    		private var angelT:Number = 0.001;
    		
    		private var radian:Number = angelT * 180 /Math.PI;
    		
    		private var vpX:Number = 100;
    		private var vpY:Number = -50;
    		
    		public function TestCos()
    		{
    			
    			this.x = stage.stageWidth / 2;
    			this.y = stage.stageHeight / 2;
    			
    			var ball0:Ball = new Ball(100,100,0);
    			var ball1:Ball = new Ball(0,100,0);
    			var ball2:Ball = new Ball(0,0,0);
    			var ball3:Ball = new Ball(100,0,0);
    			var ball4:Ball = new Ball(100,100,100,0xFF0000);
    			var ball5:Ball = new Ball(0,100,100,0xFF0000);
    			var ball6:Ball = new Ball(0,0,100,0xFF0000);
    			var ball7:Ball = new Ball(100,0,100,0xFF0000);
    			
    			ballVec.push(ball0);
    			ballVec.push(ball1);
    			ballVec.push(ball2);
    			ballVec.push(ball3);
    			ballVec.push(ball4);
    			ballVec.push(ball5); 
    			ballVec.push(ball6);
    			ballVec.push(ball7);
    			
    			for each (var ball:Ball in ballVec) 
    			{
    				addChild(ball);
    			}
    			
    			this.addEventListener(Event.ENTER_FRAME,onAdd);
    		}
    		
    		protected function onAdd(event:Event):void
    		{					
    			for each (var ball:Ball in ballVec) 
    			{
    				var _x:Number = ball._x*Math.cos(radian) - ball._y*Math.sin(radian);
    				var _y:Number = ball._y*Math.cos(radian) + ball._x*Math.sin(radian);
    				
    				ball._x = _x ;
    				ball._y = _y ;
    				
    				var myRadio:Number = D/(D + ball._z);
    				var pX:Number = (_x - vpX) * myRadio;
    				var pY:Number = (_y - vpY) * myRadio;
    				ball.x = vpX + pX;  
    				ball.y = vpY + pY;
    				
    				trace("myRadio:" + myRadio+" px:" + pX +" py:" + pY);
    				ball.scaleX = ball.scaleY =  myRadio;
    	
    				ball.alpha = 100 * myRadio;
    			}
    		}
    	}
    }
    

  • 相关阅读:
    Java-IO之DeflaterOutputStream和InflaterOutputStream
    myeclipse 破解步骤
    通过Nginx,Tomcat访问日志(access log)记录请求耗时
    关于封装了gevent的request grequest库的使用与讨论
    关于python性能相关测试cProfile库
    python threading模块使用 以及python多线程操作的实践(使用Queue队列模块)
    python格式化字符串Type Error: Format Requires Mapping 的问题
    关于flask自带web应用服务器Werkzeug 使用requests请求时出现的错误。
    关于python 自带csv库的使用心得 附带操作实例以及excel下乱码的解决
    pycharm5.0 快捷键大全osx
  • 原文地址:https://www.cnblogs.com/riaol/p/2382163.html
Copyright © 2011-2022 走看看