天天看點

the shadow of pv3d (test7)

 demo:  http://www.sandy1219.com/3d/test7/test7.html

package

{

import caurina.transitions.Tweener;

import flash.display.Bitmap;

import flash.display.BitmapData;

import flash.display.BlendMode;

import flash.display.Sprite;

import flash.events.Event;

import flash.events.KeyboardEvent;

import flash.events.MouseEvent;

import flash.events.ProgressEvent;

import flash.filters.BlurFilter;

import flash.filters.GlowFilter;

import flash.geom.ColorTransform;

import flash.text.TextField;

import org.papervision3d.core.math.Number3D;

import org.papervision3d.core.math.Quaternion;

import org.papervision3d.core.proto.CameraObject3D;

import org.papervision3d.events.FileLoadEvent;

import org.papervision3d.lights.PointLight3D;

import org.papervision3d.materials.ColorMaterial;

import org.papervision3d.materials.MovieMaterial;

import org.papervision3d.materials.utils.MaterialsList;

import org.papervision3d.objects.DisplayObject3D;

import org.papervision3d.objects.parsers.DAE;

import org.papervision3d.objects.primitives.Plane;

import org.papervision3d.objects.primitives.Sphere;

import org.papervision3d.view.BasicView;

import org.papervision3d.view.layer.util.ViewportLayerSortMode;

public class CastView extends BasicView

{

public var plane:Plane;

public var s:Sphere;

public var l:PointLight3D;

public var dae:DAE;

private var cloned:DAE;

public var sun:Sphere=new Sphere(new ColorMaterial(0xE8F471), 10, 2, 2);

public var shadowCaster:ShadowCaster=new ShadowCaster("shadow1", 0, BlendMode.NORMAL, 0.75, [new BlurFilter(4, 4, 2)]);

private var movieMaterial:MovieMaterial;

[Embed(source="dae/snakeskin.jpg")]

public var texture:Class;

[Embed(source="dae/male.png")]

public var cowTexture:Class;

public var ox:Number=0;

public var sx:Number=0;

public var oy:Number=0;

public var sy:Number=0;

private var rotationY:Number=0;

public var mouseDown:Boolean=false;

public var useSphere:Boolean=false;

public var cull:Boolean=false;

private var useShader:Boolean=true;

private var isParser:Boolean = true;

public function CastView( viewportWidth:Number=640,

viewportHeight:Number=320,

scaleToStage:Boolean=true,

interactive:Boolean=false,

cameraType:String="CAMERA3D")

{

super(viewportWidth, viewportHeight, scaleToStage, interactive, cameraType);

viewport.containerSprite.sortMode=ViewportLayerSortMode.INDEX_SORT;

var shadier:ColorTransform=new ColorTransform(0.46, 0.46, 0.46);

var movie:Sprite=new Sprite();

shadowCaster.setType(ShadowCaster.DIRECTIONAL);

var bmp:BitmapData=Bitmap(new texture()).bitmapData;

movie.graphics.beginBitmapFill(bmp, null, true);

movie.graphics.drawRect(0, 0, 512, 512);

movie.graphics.endFill();

movie.transform.colorTransform=shadier;

var movieMat:MovieMaterial=new MovieMaterial(movie, false, true, true);

plane=new Plane(movieMat, 2000, 2000, 1, 1);

scene.addChild(plane);

plane.pitch(90);

viewport.getChildLayer(plane).layerIndex=-100;

camera.y=450;

scene.addChild(sun);

viewport.getChildLayer(sun).filters=[new GlowFilter(0xE8F471)];

viewport.getChildLayer(sun).layerIndex=2000;

l=new PointLight3D();

l.x=0;

l.y=400;

l.z=300;

movieMaterial=new MovieMaterial(new cowTexture());

dae=new DAE();

var mats:MaterialsList=new MaterialsList();

mats.addMaterial(movieMaterial, "mat0");

dae.addEventListener(FileLoadEvent.LOAD_COMPLETE, onLoad);

dae.addEventListener(FileLoadEvent.LOAD_PROGRESS , loadProgress)

dae.addEventListener(FileLoadEvent.ANIMATIONS_COMPLETE , animComplete)

dae.load('dae/peopleMotion.xml', mats);

addEventListener(Event.ADDED_TO_STAGE, onStage);

}

private function animComplete(e:FileLoadEvent):void

{

this.removeChild(txt);

isParser = false;

}

private function loadProgress(e:FileLoadEvent):void

{

txt.text = '加載swf中 ' + Math.floor( e.bytesLoaded/e.bytesTotal*100 ) + ' %'

}

private function onAnimProgress(e:ProgressEvent):void

{

txt.text = '解析xml中 ' + Math.floor( e.bytesLoaded/e.bytesTotal*100 ) + ' %'

}

private var txt:TextField;

public function createDirections():void

{

txt = new TextField();

txt.selectable=false;

txt.width=400;

txt.height=400;

txt.textColor = 0xffffff

txt.text='解析xml中'

txt.x = 100 ;

txt.y = 100 ;

//t.setTextFormat(new TextFormat(font, 14, 0x606060));

addChild(txt);

}

public function onStage(e:Event):void

{

createDirections();

}

public function newTween():void

{

Tweener.addTween(l, { x:Math.random() * 1000 - 500,

z:Math.random() * 800 - 400,

y:Math.random() * 200 + 200,

time:Math.random() * 4 + 2,

onComplete:newTween,

delay:Math.random() * 2});

}

private function onLoad(e:Event):void

{

dae.parser.addEventListener(ProgressEvent.PROGRESS , onAnimProgress)

scene.addChild(dae);

dae.scale=2;

dae.yaw(360);

viewport.getChildLayer(dae).layerIndex=1;

newTween();

addEventListener(Event.ENTER_FRAME, tick);

}

public function tick(e:Event):void

{

sun.copyPosition(l);

if(isParser) return ;

updateCamera();

singleRender();

shadowCaster.invalidate();

shadowCaster.castModel(dae, l, plane, !useSphere, cull);

}

private function updateCamera():void

{

if (mouseDown)

{

sx+=(ox - viewport.containerSprite.mouseX) * 2;

ox=viewport.containerSprite.mouseX;

sy+=(oy - viewport.containerSprite.mouseY);

oy=viewport.containerSprite.mouseY;

}

sx*=0.94;

sy*=0.94;

rotationY+=sy / 19000;

if (rotationY > 0.6)

{

rotationY=0.6 - sy / 19000;

sy*=-0.6;

}

else if (rotationY < -0.2)

{

rotationY=-0.2 - sy / 19000;

sy*=-0.6;

}

orbit(camera, plane, "x", sx / 19000);

orbit(camera, plane, "y", sy / 19000);

}

public function orbit(camera:CameraObject3D, target:DisplayObject3D, dir:String="y", angle:Number=0, useAxis:Number3D=null):void

{

var ax:Number3D=useAxis;

var up:Number3D=new Number3D(camera.transform.n12, camera.transform.n22, camera.transform.n32);

if (ax == null)

{

if (dir == "x")

{

ax=up;

}

else if (dir == "y")

{

var dif:Number3D=new Number3D(camera.x - target.x, camera.y - target.y, camera.z - target.z);

ax=Number3D.cross(up, dif);

}

}

ax.normalize();

var startQuat:Quaternion=new Quaternion(camera.x - target.x, camera.y - target.y, camera.z - target.z, 0);

var rotQuat:Quaternion=Quaternion.createFromAxisAngle(ax.x, ax.y, ax.z, angle);

rotQuat.normalize();

var result:Quaternion=Quaternion.multiply(Quaternion.multiply(rotQuat, startQuat), Quaternion.conjugate(rotQuat));

camera.x=target.x + result.x;

camera.y=target.y + result.y;

camera.z=target.z + result.z;

camera.lookAt(target, up);

}

}

}