ray

Plane3D intersect point

Thursday, November 27th, 2008 | examples | Comments

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.


source

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

Tags: , ,

Drag and Release

Monday, November 24th, 2008 | examples | Comments

Sproing! I’ll go into “camera.unproject” and “rays” in more detail in the future.


source

package
{
	import flash.events.Event;
	import flash.events.MouseEvent;
 
	import gs.TweenMax;
	import gs.easing.Elastic;
 
	import org.papervision3d.core.geom.Lines3D;
	import org.papervision3d.core.geom.renderables.Line3D;
	import org.papervision3d.core.geom.renderables.Vertex3D;
	import org.papervision3d.core.math.Number3D;
	import org.papervision3d.events.InteractiveScene3DEvent;
	import org.papervision3d.lights.PointLight3D;
	import org.papervision3d.materials.shadematerials.FlatShadeMaterial;
	import org.papervision3d.materials.special.LineMaterial;
	import org.papervision3d.objects.primitives.Sphere;
	import org.papervision3d.view.BasicView;
 
	[SWF(width="640", height="480", backgroundColor="#000000", frameRate="60")]
	public class DragAndRelease extends BasicView
	{
		private var sphere:Sphere;
		private var line:Line3D;
		private const LENGTH:Number = 2000;
 
		private var isSpherePressed:Boolean = false;
 
		public function DragAndRelease()
		{
			viewport.interactive = true;
			camera.fov = 110;
			var light:PointLight3D = new PointLight3D();
			light.x = -1000, light.y = 1000;
 
 
			var material:FlatShadeMaterial = new FlatShadeMaterial(light, 0xcc0000);
			material.interactive = true;
			sphere = new Sphere(material, 200, 12, 12);
 
			sphere.addEventListener(InteractiveScene3DEvent.OBJECT_PRESS, objectPressHandler);
			sphere.z = LENGTH + camera.z;
			stage.addEventListener(MouseEvent.MOUSE_UP, mouseUpHandler);
 
			var lineMaterial:LineMaterial = new LineMaterial(0x00cc00);
			var lines:Lines3D = new Lines3D();
			line = new Line3D(lines, lineMaterial, 1, new Vertex3D(1000,1000,1000), new Vertex3D(-1000,0,0));
			lines.addLine(line);
 
			scene.addChild(lines);
			scene.addChild(sphere);
 
			startRendering();
		}
 
		override protected function onRenderTick(event:Event=null):void
		{
			var ray:Number3D = camera.unproject(viewport.containerSprite.mouseX, viewport.containerSprite.mouseY);
			line.v0.x = ray.x, line.v0.y = ray.y, line.v0.z = ray.z;
			line.v1.x = sphere.x, line.v1.y = sphere.y, line.v1.z = sphere.z;
 
			ray.normalize();
			ray.multiplyEq(LENGTH);
			ray = Number3D.add(ray, new Number3D(camera.x, camera.y, camera.z));
 
			if(isSpherePressed)
			{
				sphere.position = ray;
			}
 
			renderer.renderScene(scene, camera, viewport);
		}
 
		private function objectPressHandler(event:InteractiveScene3DEvent):void
		{
			TweenMax.killTweensOf(sphere);
			isSpherePressed = true;
		}
 
		private function mouseUpHandler(event:MouseEvent):void
		{
			isSpherePressed = false;
			TweenMax.to(sphere, 1, {x:0, y:0, z:LENGTH + camera.z, ease:Elastic.easeOut});
		}
	}
}

Tags: , , , ,

Search

Recommended Books

Speaking at FITC Toronto

 

February 2012
M T W T F S S
« May    
 12345
6789101112
13141516171819
20212223242526
272829  

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 ...