 				_c /= mag;
 				_d /= mag;
 			}
-			
+
 			return mag;
 		}
-		
+
+		public function project(myV : Vector3D) : Vector3D
+		{
+			var scale : Number = _a * myV.x + _b * myV.y + _c * myV.z;
+
+			return new Vector3D(myV.x - scale * _a,
+								myV.y - scale * _b,
+								myV.z - scale * _c);
+		}
+
 		/**
 		 * Test a 3D point is coinciding, infront or behind the plane.
 		 * @param	myPoint

			_b = myB;
			_c = myC;
			_d = myD;
			
			normalize();
		}
		
		public function normalize() : Number
		{
			var mag	: Number	= Math.sqrt(_a * _a + _b * _b + _c * _c);
			
			if (mag && mag != 1.)
			{
				_a /= mag;

			var result  : uint 		= 0;
			var s		: Number	= -myThickness;
			var t		: Number	= myThickness;

			test = _a * myX1 + _b * myY1 + _c * myZ1 - _d;
			result = ((test >= s && test <= t) ? POINT_COINCIDING
											 : ((test < 0.) ? POINT_BEHIND
														    : POINT_INFRONT)) << 16;

			test = _a * myX2 + _b * myY2 + _c * myZ2 - _d;
			result |= ((test >= s && test <= t) ? POINT_COINCIDING
											  : ((test < 0.) ? POINT_BEHIND
														     : POINT_INFRONT)) << 8;

			test = _a * myX3 + _b * myY3 + _c * myZ3 - _d;
			result |= (test >= s && test <= t) ? POINT_COINCIDING
											 : ((test < 0.) ? POINT_BEHIND
