demo: http://www.sandy1219.com/3d/test7/test7.html
<textarea cols="80" rows="20" name="code" class="c-sharp">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); } } } </textarea>