📄 color3d.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 + -