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