drag
LocalServiceConnection (FlashLCS) demo
This post from John G.: http://rockonflash.wordpress.com/2009/03/05/new-localconnection-api-rocks-and-its-os/
Lead me here: http://labs.blitzagency.com/?p=650
And then here: http://code.google.com/p/flashlcs/
So I thought I’d put a little demo together of this new stuff in action. You’ll notice dragging the cube around in either swf will update the position of the cube in the other. This is mainly just a test to see it working for me before trying external panels/tools for updating content. You’ll see the little circle indicators showing if the two swfs are connected or not. I didn’t really put in any connection checking code, so if it’s not working just close the page and open it again.
Dragging an object to rotate
The cool thing about this example is you can really just drop any DisplayObject3D in to rotate it around. It’s not super exciting, but I bet many of you will find it useful.
package { import flash.events.Event; import flash.events.MouseEvent; import flash.geom.Point; import org.papervision3d.core.math.Matrix3D; import org.papervision3d.core.math.Number3D; import org.papervision3d.lights.PointLight3D; import org.papervision3d.materials.shadematerials.FlatShadeMaterial; import org.papervision3d.objects.primitives.Sphere; import org.papervision3d.view.BasicView; [SWF(width="640", height="480", backgroundColor="#000000", frameRate="60")] public class Trackball extends BasicView { private static const FORWARD:Number3D = new Number3D(0, 0, 1); private var sphere:Sphere; private var previousMousePoint:Point = new Point(); private var isMouseDown:Boolean = false; public function Trackball() { var light:PointLight3D = new PointLight3D(); var flatShadeMaterial:FlatShadeMaterial = new FlatShadeMaterial(light, 0xcc0000, 0x222222); sphere = new Sphere(flatShadeMaterial, 500, 32, 24); scene.addChild(sphere); startRendering(); stage.addEventListener(MouseEvent.MOUSE_DOWN, stage_mouseDownHandler); stage.addEventListener(MouseEvent.MOUSE_UP, stage_mouseUpHandler); } private function stage_mouseDownHandler(event:MouseEvent):void { isMouseDown = true; } private function stage_mouseUpHandler(event:MouseEvent):void { isMouseDown = false; } override protected function onRenderTick(event:Event=null):void { var currentMousePoint:Point = new Point(viewport.containerSprite.mouseX, viewport.containerSprite.mouseY); if(isMouseDown) { var difference:Point = currentMousePoint.subtract(previousMousePoint); var vector:Number3D = new Number3D(difference.x, difference.y, 0); var rotationAxis:Number3D = Number3D.cross(vector, FORWARD); rotationAxis.normalize(); var distance:Number = Point.distance(currentMousePoint, previousMousePoint); var rotationMatrix:Matrix3D = Matrix3D.rotationMatrix(rotationAxis.x, -rotationAxis.y, rotationAxis.z, distance/250); sphere.transform.calculateMultiply3x3(rotationMatrix, sphere.transform); } previousMousePoint = currentMousePoint; super.onRenderTick(event); } } }
Dragging Planes and lookAt Camera
package { import flash.display.BitmapData; import flash.events.Event; import flash.events.MouseEvent; import flash.geom.Point; import org.papervision3d.core.geom.renderables.Vertex3D; import org.papervision3d.core.math.Number3D; import org.papervision3d.core.math.Plane3D; import org.papervision3d.core.proto.MaterialObject3D; import org.papervision3d.events.InteractiveScene3DEvent; import org.papervision3d.lights.PointLight3D; import org.papervision3d.materials.BitmapMaterial; import org.papervision3d.objects.primitives.Plane; import org.papervision3d.view.BasicView; [SWF(width="640", height="480", backgroundColor="#000000", frameRate="60")] public class DraggingPlanes extends BasicView { private const NUM_PLANES:int = 11; private var planeToDragOn:Plane3D; private var currentPlane:Plane; private var light:PointLight3D; public function DraggingPlanes() { viewport.interactive = true; camera.y = 100; for(var i:int = 0; i < NUM_PLANES; i++) { var material:MaterialObject3D = createMaterial(); material.interactive = true; /* Please note that, by default, the material on a plane is placed on the "back" of a plane (since the camera defaults to -1000 z. So if you tell the plane to "lookAt" the camera, you will see the front of the plane with nothing on it. You can solve this by making the material doubleSided */ material.doubleSided = true; var plane:Plane = new Plane(material, 100, 100, 4, 4); plane.x = (i - NUM_PLANES/2) * 200; scene.addChild(plane); plane.lookAt(camera); plane.addEventListener(InteractiveScene3DEvent.OBJECT_PRESS, objectPressHandler); stage.addEventListener(MouseEvent.MOUSE_UP, mouseUpHandler); } var up:Number3D = new Number3D(0, 1, 0); planeToDragOn = new Plane3D(up, new Number3D(0,0,0)); startRendering(); } private function createMaterial():MaterialObject3D { var bitmapData:BitmapData = new BitmapData(300, 200, false, Math.random() * 0xffffff); var bitmapBorder:BitmapData = new BitmapData(320, 220, false, 0xffffff); bitmapBorder.copyPixels(bitmapData, bitmapData.rect, new Point(10, 10)); var bitmapMaterial:BitmapMaterial = new BitmapMaterial(bitmapBorder, true); bitmapMaterial.smooth = true; return bitmapMaterial; } private function objectPressHandler(event:InteractiveScene3DEvent):void { currentPlane = event.displayObject3D as Plane; } private function mouseUpHandler(event:MouseEvent):void { currentPlane = null; } override protected function onRenderTick(event:Event=null):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 = planeToDragOn.getIntersectionLine(cameraVertex3D, rayVertex3D); if(currentPlane) { currentPlane.x = intersectPoint.x; currentPlane.y = intersectPoint.y; currentPlane.z = intersectPoint.z; currentPlane.lookAt(camera); } renderer.renderScene(scene, camera, viewport); } } }
Dragging Spheres
package { import flash.events.Event; import flash.events.MouseEvent; import org.papervision3d.core.geom.renderables.Vertex3D; import org.papervision3d.core.math.Number3D; import org.papervision3d.core.math.Plane3D; import org.papervision3d.events.InteractiveScene3DEvent; import org.papervision3d.lights.PointLight3D; import org.papervision3d.materials.shadematerials.FlatShadeMaterial; import org.papervision3d.objects.primitives.Sphere; import org.papervision3d.view.BasicView; [SWF(width="640", height="480", backgroundColor="#000000", frameRate="60")] public class DraggingASphere extends BasicView { private const NUM_SPHERES:int = 11; private var planeToDragOn:Plane3D; private var currentSphere:Sphere; private var light:PointLight3D; public function DraggingASphere() { viewport.interactive = true; camera.y = 400; light = new PointLight3D(true); scene.addChild(light); for(var i:int = 0; i < NUM_SPHERES; i++) { var material:FlatShadeMaterial = new FlatShadeMaterial(light, 0xeeeeee, 0x2d2d2d, 10); material.interactive = true; var sphere:Sphere = new Sphere(material); sphere.x = (i - NUM_SPHERES/2) * 200; scene.addChild(sphere); sphere.addEventListener(InteractiveScene3DEvent.OBJECT_PRESS, objectPressHandler); stage.addEventListener(MouseEvent.MOUSE_UP, mouseUpHandler); } var up:Number3D = new Number3D(0, 1, 0); planeToDragOn = new Plane3D(up, new Number3D(0,0,0)); startRendering(); } private function objectPressHandler(event:InteractiveScene3DEvent):void { currentSphere = event.displayObject3D as Sphere; } private function mouseUpHandler(event:MouseEvent):void { currentSphere = null; } override protected function onRenderTick(event:Event=null):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 = planeToDragOn.getIntersectionLine(cameraVertex3D, rayVertex3D); if(currentSphere) { currentSphere.x = intersectPoint.x; currentSphere.y = intersectPoint.y; currentSphere.z = intersectPoint.z; } light.x = intersectPoint.x; light.y = intersectPoint.y + 100; light.z = intersectPoint.z; renderer.renderScene(scene, camera, viewport); } } }
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
- FDT Theme Designer
- 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
Recent Comments
- Xdragosy on Ribbons
- As on What is BasicView?
- Godie_dito on Dynamic Text on a Plane
- Angel Kaido on Following line
- bambii7 on faq
- Felipe on TweenMax – Tweening a timeline (Advanced Tweening)
- Ocatarinabelachichix on about
- Rajiv on faq
- Rajiv on 3ds max texture baking for Papervision3D
- Anupam Biswas on Maya Texture Baking
Categories
| M | T | W | T | F | S | S |
|---|---|---|---|---|---|---|
| « May | ||||||
| 1 | 2 | 3 | 4 | 5 | ||
| 6 | 7 | 8 | 9 | 10 | 11 | 12 |
| 13 | 14 | 15 | 16 | 17 | 18 | 19 |
| 20 | 21 | 22 | 23 | 24 | 25 | 26 |
| 27 | 28 | 29 | 30 | |||
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





