package org.pv3d.examples.movement { import flash.events.Event; import mx.effects.easing.Cubic; import org.papervision3d.lights.PointLight3D; import org.papervision3d.materials.shadematerials.FlatShadeMaterial; import org.papervision3d.objects.DisplayObject3D; import org.papervision3d.objects.primitives.Sphere; import org.papervision3d.view.BasicView; import org.pv3d.objects.Arrow; import gs.TweenMax; /** * @author Lindquist */ public class FollowCam extends BasicView { private var dummyObject:DisplayObject3D; private var dummyPosition:DisplayObject3D; private var light:PointLight3D; private var origin:DisplayObject3D; public function FollowCam(viewportWidth:Number = 640, viewportHeight:Number = 320, scaleToStage:Boolean = true, interactive:Boolean = false, cameraType:String = "CAMERA3D") { super(viewportWidth, viewportHeight, scaleToStage, interactive, cameraType); light = new PointLight3D(); origin = new DisplayObject3D(); dummyObject = new DisplayObject3D(); dummyPosition = new DisplayObject3D(); cameraAsFrustumCamera3D.near = 10; cameraAsFrustumCamera3D.far = 20000; cameraAsFrustumCamera3D.fov = 120; for (var i:Number = 0;i < 50; i++) { var cy:Arrow = new Arrow(new FlatShadeMaterial(light, 0xcc0000, 0x000000)); // cy.x = (Math.random() * 4000 -2000) * 2; // cy.y = (Math.random() * 4000 -2000) * 2; // cy.z = (Math.random() * 4000 -2000) * 2; cy.x = Math.cos(i) * 2000 - 1000; cy.y = 4000 / 50 * i - 2000; cy.z = Math.sin(i) * 2000 - 1000; cy.lookAt(origin); scene.addChild(cy); } var sphereMaterial:FlatShadeMaterial = new FlatShadeMaterial(light, 0x00cc00, 0x000000); sphereMaterial.doubleSided = true; var sphere:Sphere = new Sphere(sphereMaterial, 6100, 30, 30); scene.addChild(sphere); loopTweenMax(); addEventListener(Event.ENTER_FRAME, onRender); } private function loopTweenMax():void { var bt:Array = []; for (var i:Number = 0;i < 3; i++) { bt.push({ x:Math.random() * 6000 - 3000, y:Math.random() * 6000 - 3000, z:Math.random() * 6000 - 3000 }); } TweenMax.to(dummyObject, Math.random() * 30 + 20, { x:Math.random() * 6000 - 3000, y:Math.random() * 6000 - 3000, z:Math.random() * 6000 - 3000, bezierThrough:bt, ease:Cubic.easeInOut, onUpdate:onTweenUpdate, onComplete:loopTweenMax }); } private function onTweenUpdate():void { camera.lookAt(dummyPosition); camera.copyPosition(dummyPosition); camera.moveBackward(500); light.copyTransform(camera); } private function onRender(event:Event):void { singleRender(); dummyPosition.copyPosition(dummyObject); } } }