⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 color3d.as

📁 flex3d 的源码
💻 AS
字号:
/**
* project3D Engine
* A material that uses a light's position (Vector) to color its faces
* @author John Sword
* @version 2 - AS3
*/

package engine.materials
{
	
	import engine.materials.Material;
	import engine.geom.Face;
	import engine.math.VectorUtils;
	import flash.display.Sprite;
	import flash.display.Graphics;
	import engine.geom.Vector;
	
	public class Color3D extends Material
	{

		public var alpha:Number = 1;
		public var red:int = 255;
		public var green:int = 255;
		public var blue:int = 255;
		
		private var lightPos:Vector = new Vector(1,1,1);
		private static const cos:Function = Math.cos;
		private static const norm:Function = VectorUtils.Normalize;
		private static const dot:Function = VectorUtils.dot;
		
		/**
		*  
		*/
		public function Color3D ( lp:Vector, r:int=255, g:int=255, b:int=255 )
		{
			super( null );
			lightPos = lp;
			red = r;
			green = g;
			blue = b;
		}
		
		public override function render ( face:Face, screen:Sprite ) : void
		{
			// get vertices x,y positions
			var v0:Object = face.v1;
			var v1:Object = face.v2;
			var v2:Object = face.v3;

			var x0:Number = v0.x,
			y0:Number = v0.y,
			z0:Number = v0.z,
			x1:Number = v1.x,
			y1:Number = v1.y,
			z1:Number = v1.z,
			x2:Number = v2.x,
			y2:Number = v2.y,
			z2:Number = v2.z;

			var MAXLIGHT:Number = 32;
			// calculate polygon normal
			// norm = CrossProduct( SubVect(p2 ,p1), SubVect( p0,p1) ); 
			var nx:Number = ( ( y0 - y1 ) * ( z0 - z2 ) ) - ( ( z0 - z1 ) * ( y0 - y2 ) );
			var ny:Number = ( ( z0 - z1 ) * ( x0 - x2 ) ) - ( ( x0 - x1 ) * ( z0 - z2 ) );
			var nz:Number = ( ( x0 - x1 ) * ( y0 - y2 ) ) - ( ( y0 - y1 ) * ( x0 - x2 ) );
			var PlaneNormal:Vector = new Vector ( nx, ny, nz );
			//var PlaneNormal:Vector = VectorUtils.cross( 
			//	VectorUtils.difference( v2,v1 ), VectorUtils.difference( v0,v1 ));
			// fix light
			if ( lightPos.x == 0 ) lightPos.x = 1;
			if ( lightPos.y == 0 ) lightPos.y = 1;
			if ( lightPos.z == 0 ) lightPos.z = 1;
			// first get light's position
			var lightNormal:Vector = new Vector ( -lightPos.x, lightPos.y, -lightPos.z );
			// calculate normals
			PlaneNormal = norm ( PlaneNormal );
			lightNormal = norm ( lightNormal );
			// calculate angle of insidence
			var vdot:Number = dot ( PlaneNormal,lightNormal );	
			var light:Number = cos ( MAXLIGHT + vdot );
			
			if(light<0)light=0; // black is black
			
			var cr:Number = (red * light);
			var cg:Number = (green * light);
			var cb:Number = (blue * light);
			
			var fColor:Number = cr << 16 | cg << 8 | cb;
	
			// Draw triangle
			var g:Graphics = screen.graphics;
			g.beginFill( fColor, alpha );
			g.lineStyle( wireSize, wireColor, wireAlpha );
			
			x0 = v0.screen.x;
			y0 = v0.screen.y;
			x1 = v1.screen.x;
			y1 = v1.screen.y;
			x2 = v2.screen.x;
			y2 = v2.screen.y;
			
			g.moveTo( x0, y0 );
			g.lineTo( x1, y1 );
			g.lineTo( x2, y2 );
			//g.lineTo( x0, y0 );
			//g.endFill();
		}
		
	}
	
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -