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

  • 相关阅读:
    linux系统rewrite重定向及搭建discuz
    nginx客户端请求分类
    linux系统nginx动静分离
    RDB与AOF
    AOF持久化
    redis持久化(RDB)
    redis操作
    redis搭建
    Redis简介
    小技巧从此拒绝$?
  • 原文地址:https://www.cnblogs.com/riaol/p/2382163.html
Copyright © 2011-2022 走看看