Archive for November 18th, 2008

Showing the hand cursor on a plane

Tuesday, November 18th, 2008 | examples | Comments

Here’s some simple source to another question I see pop up often:

View example
source

package {
	import org.papervision3d.events.InteractiveScene3DEvent;
	import org.papervision3d.materials.ColorMaterial;
	import org.papervision3d.objects.primitives.Plane;
	import org.papervision3d.view.BasicView;
 
	[SWF(width="640", height="480", backgroundColor="#000000", frameRate="60")]
	public class HandCursorDemo extends BasicView
	{
		private var interactivePlane:Plane;
		private var nonInteractivePlane:Plane;
 
		public function HandCursorDemo()
		{
			//set the viewport interactive flag to true
			viewport.interactive = true;
 
			var interactiveMaterial:ColorMaterial = new ColorMaterial(0x00cc00);
			//set your material's interactive flag to true
			interactiveMaterial.interactive = true;
 
			var nonInteractiveMaterial:ColorMaterial = new ColorMaterial(0xcc0000);
 
			interactivePlane = new Plane(interactiveMaterial);
			interactivePlane.x = -500;
 
			nonInteractivePlane = new Plane(nonInteractiveMaterial);
			nonInteractivePlane.x = 500;
 
			//add listeners to the planes that have the interactive material
			interactivePlane.addEventListener(InteractiveScene3DEvent.OBJECT_OVER, objectOverHandler);
			interactivePlane.addEventListener(InteractiveScene3DEvent.OBJECT_OUT, objectOutHandler);
 
			scene.addChild(interactivePlane);
			scene.addChild(nonInteractivePlane);
 
			startRendering();
		}
 
		private function objectOverHandler(event:InteractiveScene3DEvent):void
		{
			//change interactive plane's color to blue on roll over
			Plane(event.target).material.fillColor = 0x0000cc;
			//turn the hand cursor on
			viewport.buttonMode = true;
		}
 
		private function objectOutHandler(event:InteractiveScene3DEvent):void
		{
			//change interactive plane's color back to green on roll out
			Plane(event.target).material.fillColor = 0x00cc00;
			//turn the hand cursor off
			viewport.buttonMode = false;
		}
	}
}

Tags: , ,

Vectors show length and direction

Tuesday, November 18th, 2008 | examples | Comments

Vectors do not have a location. That means you can start them from anywhere and they’ll still travel the same length and direction regardless. The following example demonstrates by using random starting points, but placing planes and lines along the same vector from those different starting points.

View example
source

package {
 
	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.materials.ColorMaterial;
	import org.papervision3d.materials.special.LineMaterial;
	import org.papervision3d.objects.DisplayObject3D;
	import org.papervision3d.objects.primitives.Plane;
	import org.papervision3d.view.BasicView;
 
	[SWF(width="640", height="480", backgroundColor="#000000", frameRate="60")]
	public class VectorsShowLengthAndDirection extends BasicView
	{
		private const NUM_POINTS:int = 50;
		private const NUM_STARTING_POINTS:int = 20;
 
		public function VectorsShowLengthAndDirection()
		{
			var pointA:Number3D = new Number3D(-1000, -800, 500);
			var pointB:Number3D = new Number3D(12000, 8000, 20000);
 
			var vector:Number3D = Number3D.sub(pointB, pointA);
			var vectorCopy:Number3D = new Number3D();
 
			for(var i:int = 0; i < NUM_STARTING_POINTS; i++)
			{
				//create a random starting point
				var startingPoint:Number3D = new Number3D(Math.random() * 2000 - 1000, Math.random() * 2000 - 1000, Math.random() * 2000 );
				var randColor:Number = Math.random() * 0xffffff;
				var lines:Lines3D = new Lines3D();
				var lineMaterial:LineMaterial = new LineMaterial(randColor);
				for(var j:int = 0; j < NUM_POINTS; j++)
				{
					vectorCopy.copyFrom(vector);
					var pointAlongVector:DisplayObject3D = new Plane(new ColorMaterial(randColor), 100, 100);
					vectorCopy.multiplyEq(j/NUM_POINTS);
					//use the startingPoint as the first position
					pointAlongVector.position = Number3D.add(startingPoint, vectorCopy);
					scene.addChild(pointAlongVector);
				}	
				var line:Line3D = new Line3D(lines, lineMaterial, 5, 
					new Vertex3D(startingPoint.x, startingPoint.y, startingPoint.z),
					new Vertex3D(pointAlongVector.x, pointAlongVector.y, pointAlongVector.z));
 
				lines.addLine(line);
				scene.addChild(lines);
			}
 
			singleRender();
		}
	}
}

Tags: , ,

Points along a displacement vector – Part 2

Tuesday, November 18th, 2008 | snippets | Comments

While the last example was supposed to be simple to read and understand, this shows how to do the same thing with much less code by using the built-in vector methods:

Number3D.add(vectorA, vectorB); //adds two vectors
//which is much faster than writing
vector = vectorA.x + vectorB.x;
vector = vectorA.y + vectorB.y;
vector = vectorA.z + vectorB.z;
 
Number3D.sub(vectorA, vectorB); //subtracts two vectors
 
vector.multiplyEq(number); //multiplies the x, y, and z by the given number

Look at the following code and compare it to the first example to try and match up what’s happening.

private const NUM_POINTS:int = 150;
 
public function PointsAlongAVector()
{
	var pointA:Number3D = new Number3D(-1000, -800, 500);
	var pointB:Number3D = new Number3D(12000, 8000, 20000);
 
	var vector:Number3D = Number3D.sub(pointB, pointA);
	var vectorCopy:Number3D = new Number3D();
 
	for(var i:int = 0; i < NUM_POINTS; i++)
	{
		vectorCopy.copyFrom(vector);
		var pointAlongVector:DisplayObject3D = new Plane(null, 10, 10);
		vectorCopy.multiplyEq(i/NUM_POINTS);
		pointAlongVector.position = Number3D.add(pointA, vectorCopy);
 
		scene.addChild(pointAlongVector);
	}
 
	singleRender();
}

*note – you will need the latest version of Papervision3D to be able to use the “position” property of a DisplayObject3D.

Tags: , ,

Points along a displacement vector – Part 1

Tuesday, November 18th, 2008 | examples | Comments

I thought it might be helpful to teach a bit about vectors.

In this example, you’ll see a starting point (the green sphere) and an ending point (the red sphere). The displacement vector between the sphere is going from the starting point to the ending point.

You find the displacement vector by subtracting the ending point’s x, y, and z from the starting point’s x, y, and z. Then you can easily add points along the vector in a loop as demonstrated in the code:

View example
source

package {
 
	import org.papervision3d.core.math.Number3D;
	import org.papervision3d.materials.WireframeMaterial;
	import org.papervision3d.objects.primitives.Sphere;
	import org.papervision3d.view.BasicView;
 
	[SWF(width="640", height="480", backgroundColor="#000000", frameRate="60")]
	public class PointsAlongAVector extends BasicView
	{
 
		private const NUM_POINTS:int = 10;
		public function PointsAlongAVector()
		{
			var pointA:Sphere = new Sphere(new WireframeMaterial(0x00cc00), 500);
			pointA.x = -1000;
			pointA.y = -800;
			pointA.z = 500;
 
			var pointB:Sphere = new Sphere(new WireframeMaterial(0xcc0000), 500);
			pointB.x = 12000;
			pointB.y = 8000;
			pointB.z = 20000;
 
			scene.addChild(pointA);
			scene.addChild(pointB);
 
			//we're going from A to B
			//so subtract A from B
			var vector:Number3D = 
			new Number3D
			(
				pointB.x - pointA.x,
				pointB.y - pointA.y,
				pointB.z - pointA.z
			);	
 
			for(var i:int = 0; i < NUM_POINTS; i++)
			{
				var pointAlongVector:Sphere = new Sphere(null, 50, 4, 4);
				//take the starting point (pointA) 
				//add the vector and multiply it by
				//the proportion of the current time through the loop (i)
				//over the total number of times through the loop (NUM_POINTS)
				pointAlongVector.x = pointA.x + (vector.x * i / NUM_POINTS);
				pointAlongVector.y = pointA.y + (vector.y * i / NUM_POINTS);
				pointAlongVector.z = pointA.z + (vector.z * i / NUM_POINTS);
 
				scene.addChild(pointAlongVector);
			}			
 
			//nothing's moving, so we only render once
			singleRender();
		}
	}
}

Tags: , ,

Search

Recommended Books

Speaking at FITC Toronto

 

November 2008
M T W T F S S
    Dec »
 12
3456789
10111213141516
17181920212223
24252627282930

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