Archive for November, 2008
Distance to Mouse using a dummy 3d object
package { import flash.events.Event; import org.papervision3d.core.math.Number3D; import org.papervision3d.objects.DisplayObject3D; import org.papervision3d.objects.primitives.Sphere; import org.papervision3d.view.BasicView; [SWF(width="640", height="480", backgroundColor="#000000", frameRate="60")] public class DistanceFrom3DMouse extends BasicView { private var sphere:Sphere = new Sphere(); private var mouseDO3D:DisplayObject3D = new Sphere(); public function DistanceFrom3DMouse () { sphere.x = -500; sphere.y = 200; // scene.addChild(mouseDO3D); uncomment to see mouse sphere scene.addChild(sphere); startRendering(); } override protected function onRenderTick(event:Event=null):void { var ray:Number3D = camera.unproject(viewport.containerSprite.mouseX, viewport.containerSprite.mouseY); ray.normalize(); ray.multiplyEq(sphere.distanceTo(camera)); ray = Number3D.add(ray, camera.position); mouseDO3D.position = ray; var distance:Number = sphere.distanceTo(mouseDO3D); renderer.renderScene(scene, camera, viewport); } } }
I’m open to suggestions for a better way to do this
Distance from Mouse using screen coordinates
package { import flash.events.Event; import org.papervision3d.objects.primitives.Sphere; import org.papervision3d.view.BasicView; [SWF(width="640", height="480", backgroundColor="#000000", frameRate="60")] public class DistanceFrom2DMouse extends BasicView { private var sphere:Sphere = new Sphere(); public function DistanceFrom2DMouse() { sphere.x = -500; sphere.y = -300; sphere.autoCalcScreenCoords = true; scene.addChild(sphere); startRendering(); } override protected function onRenderTick(event:Event=null):void { var distanceX:Number = viewport.containerSprite.mouseX - sphere.screen.x; var distanceY:Number = viewport.containerSprite.mouseY - sphere.screen.y; var distance:Number = Math.sqrt(distanceX * distanceX + distanceY * distanceY); renderer.renderScene(scene, camera, viewport); } } }
Plane3D intersect point
A Plane3D (known commonly as a “Plane” in geometry) is an infinite flat surface. In this example, the Plane3D spans across the x-axis and the z-axis (like a floor) represented by this Number3D:
private const XZPLANE:Number3D = new Number3D(0, 1, 0);
The second number (1), means the Plane3D rotates around the Y-axis. You can think of it like the “1″ is the direction the Plane3D is facing, in this case, “up”. To face toward you, you would set 0, 0, 1. So the Plane3D would point to the monitor (like a wall). To face left to right, you would set 1, 0, 0 (like an alley?).
In this example, the camera is moved up slightly to have more of a bird’s eye view of the Plane3D. You won’t see it at first, but after you click around for awhile, you’ll start to notice where the Plane3D exists.
package { import flash.events.Event; import flash.events.KeyboardEvent; import flash.events.MouseEvent; import flash.ui.Keyboard; import org.papervision3d.core.geom.renderables.Vertex3D; import org.papervision3d.core.math.Number3D; import org.papervision3d.core.math.Plane3D; import org.papervision3d.objects.DisplayObject3D; import org.papervision3d.objects.primitives.Cylinder; import org.papervision3d.scenes.Scene3D; import org.papervision3d.view.BasicView; import org.papervision3d.view.stats.StatsView; [SWF(width="640", height="480", backgroundColor="#000000", frameRate="60")] public class Plane3DExample extends BasicView { private const XZPLANE:Number3D = new Number3D(0, 1, 0); private var plane3D:Plane3D = new Plane3D(XZPLANE, Number3D.ZERO); private var isRotating:Boolean = false; public function Plane3DExample() { camera.y = 200; startRendering(); stage.addEventListener(MouseEvent.CLICK, clickHandler); stage.addEventListener(KeyboardEvent.KEY_DOWN, keyDownHandler); } private function keyDownHandler(event:KeyboardEvent):void { //toggle rotating if(event.keyCode == Keyboard.CONTROL) { isRotating = (isRotating == false) ? true : false; } //rebuild scene if(event.keyCode == Keyboard.SHIFT) { scene = new Scene3D(); } } private function clickHandler(event:MouseEvent):void { var ray:Number3D = camera.unproject(viewport.containerSprite.mouseX, viewport.containerSprite.mouseY); ray = Number3D.add(ray, camera.position); var cameraVertex3D:Vertex3D = new Vertex3D(camera.x, camera.y, camera.z); var rayVertex3D:Vertex3D = new Vertex3D(ray.x, ray.y, ray.z); var intersectPoint:Vertex3D = plane3D.getIntersectionLine(cameraVertex3D, rayVertex3D); var cylinder:Cylinder = new Cylinder(null, 10, 100, 1, 1); cylinder.x = intersectPoint.x; cylinder.y = intersectPoint.y; cylinder.z = intersectPoint.z; //the closer to the center, the larger the tower cylinder.scale = 1000 / cylinder.distanceTo(new DisplayObject3D()); //readjust y based on scale (half height times scale) cylinder.y += 50 * cylinder.scale; scene.addChild(cylinder); } override protected function onRenderTick(event:Event=null):void { if(isRotating) { camera.moveForward(1000); camera.yaw(.5); camera.moveBackward(1000); } renderer.renderScene(scene, camera, viewport); } } }
Glow Filter on a ViewportLayer
package { import flash.filters.GlowFilter; import org.papervision3d.materials.ColorMaterial; import org.papervision3d.objects.primitives.Sphere; import org.papervision3d.view.BasicView; import org.papervision3d.view.layer.ViewportLayer; [SWF(width="640", height="480", backgroundColor="#000000", frameRate="60")] public class GlowSnippet extends BasicView { public function GlowSnippet() { var material:ColorMaterial = new ColorMaterial(0xcc0000); var sphere:Sphere = new Sphere(material); var viewportLayer:ViewportLayer = new ViewportLayer(viewport, sphere); viewport.containerSprite.addLayer(viewportLayer); var glowFilter:GlowFilter = new GlowFilter(0xcccc00, 1, 20, 20, 4, 3); viewportLayer.filters = [glowFilter]; scene.addChild(sphere); singleRender(); } } }
Search
Recommended Books
Speaking at FITC Toronto
Recent Posts
- Moving to johnlindquist.com
- AsyncCommand with Robotlegs, Signals, Flight, MinimalComps
- Search Widget – Robotlegs, Signals, Flight, Minimal Comps, Yahoo Astra
- FDT Super Awesome March Deal
- haXe Tutorial
- AS3 Signals Tutorial
- Preferred Video Tutorial Resolution?
- TweenMax – Tweening a timeline (Advanced Tweening)
- Robotlegs + Flight + Union Platform
- Back in the saddle
- Eclipse Theme Designer Preview
- RobotLegs Hello World Video Tutorial
- 10 Things Every Senior Flash Developer Should Know
- Efflex – 3D Effects for Flex
- MorphController – Mighty Morphing Papervision3D
Recent Comments
- software akuntansi terbaik on Back in the saddle
- loan rates on Augmented Reality – Recursive Webcam
- loan rates on Looking around the inside of a Sphere
- reverse phone lookup on Looking around the inside of a Sphere
- Oidhreachta on The Spotlight Effect (Dimming the unselected)
- Hosting company on archive
- aanbae on Back in the saddle
- Domain registration on Looking around the inside of a Sphere
- website designing company on Looking around the inside of a Sphere
- Honda Motor on Augmented Reality – Recursive Webcam
Categories
Archives
Preferred Video Tutorial Resolution
- 1024x768 (53%, 85 Votes)
- 1280x1024 (15%, 24 Votes)
- 1920x1080 (15%, 24 Votes)
- 800x600 (13%, 20 Votes)
- 480x320 (4%, 6 Votes)
- 640x480 (0%, 2 Votes)
Total Voters: 160


