Dragging Spheres

Tuesday, December 9th, 2008 | examples


source

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

Tags: , ,

  • lillacska
    can you tell me plz where the startRendering(); methos is? :-s
  • Strata
    nice, but i think that it can be more useful if it is not sphere but DAE file, do anyone know about some tutorial how drag collada file?????
  • Great work, but how to Drag a DAE modle
    could you examples it to me?
    I need it for my a project~
    thanks you for your share
  • Icek
    Great work, but how to access stage, viewport and camera from within do3d?
    Do I need to do everything inside BasicView/IView?

    My problem is: I created do3d named Book. Inside Book, there are several BookPages (also do3d), and inside BookPages i got another do3d, and inside this do3d i want to do some dragging actions. Now I need to transmit variables (stage, viewport and camera) via each do3d constructor, but i think, that this method sucks. Other way is to use Singleton as Variable Locators, but this also doesn’t sound good.
    So, how to this?

    PS. Sorry for my bad english.
blog comments powered by Disqus

Search

Recommended Books

Speaking at FITC Toronto

 

December 2008
M T W T F S S
« Nov   Jan »
1234567
891011121314
15161718192021
22232425262728
293031  

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

Loading ... Loading ...