 							   up		: Vector4	= null) : Matrix4x4
 		{
 			view(
-				position || transformVector(Vector4.ZERO),
+				position,
 				target,
 				up || deltaTransformVector(Vector4.Y_AXIS)
 			);

			return true;
		}
		
		public function orient(eye			: Vector4,
							   direction	: Vector4,
							   up			: Vector4   = null) : Matrix4x4
		{
			
			var eye_X		: Number = eye._vector.x;
			var eye_Y		: Number = eye._vector.y;
			var eye_Z		: Number = eye._vector.z;
			
			var z_axis_X	: Number = direction._vector.x;
			var z_axis_Y	: Number = direction._vector.y;
			var z_axis_Z	: Number = direction._vector.z;
			
			var up_axis_x	: Number;
			var up_axis_y	: Number;
			var up_axis_z	: Number;
			
			if (up != null)
			{
				// if up axis was given, take it. An error will be raised later if it is colinear to direction
				up_axis_x = up._vector.x;
				up_axis_y = up._vector.y;
				up_axis_z = up._vector.z;	
			}
			else
			{
				// if direction is colinear to (0, 1, 0), take (1, 0, 0) as up vector
				if (z_axis_X == 0 && z_axis_Y != 0 && z_axis_Z == 0)
				{
					up_axis_x = 1;
					up_axis_y = 0;
					up_axis_z = 0;
				}
				// else, take (0, 0, 1)
				else
				{
					up_axis_x = 0;
					up_axis_y = 1;
					up_axis_z = 0;
				}
			}
			
			var l : Number;
			
			l = 1 / Math.sqrt(z_axis_X * z_axis_X + z_axis_Y * z_axis_Y + z_axis_Z * z_axis_Z);
			
			z_axis_X *= l;
			z_axis_Y *= l;
			z_axis_Z *= l;
			
			var x_axis_X : Number = up_axis_y * z_axis_Z - z_axis_Y * up_axis_z;
			var x_axis_Y : Number = up_axis_z * z_axis_X - z_axis_Z * up_axis_x;
			var x_axis_Z : Number = up_axis_x * z_axis_Y - z_axis_X * up_axis_y;
			
			l = 1 / Math.sqrt(x_axis_X * x_axis_X + x_axis_Y * x_axis_Y + x_axis_Z * x_axis_Z);
			
			x_axis_X *= l;
			x_axis_Y *= l;
			x_axis_Z *= l;
			
			var y_axis_X : Number = z_axis_Y * x_axis_Z - x_axis_Y * z_axis_Z;
			var y_axis_Y : Number = z_axis_Z * x_axis_X - x_axis_Z * z_axis_X;
			var y_axis_Z : Number = z_axis_X * x_axis_Y - x_axis_X * z_axis_Y;
			
			l = 1 / Math.sqrt(y_axis_X * y_axis_X + y_axis_Y * y_axis_Y + y_axis_Z * y_axis_Z);
			
			y_axis_X *= l;
			y_axis_Y *= l;
			y_axis_Z *= l;
			
			if ((x_axis_X == 0 && x_axis_Y == 0 && x_axis_Z == 0) 
				|| (y_axis_X == 0 && y_axis_Y == 0 && y_axis_Z == 0))
			{
				throw new Error(
					'Invalid argument(s): the eye direction (look at - eye position) '
					+ 'and the up vector appear to be the same.'
				);
			}
			
			var	m41	: Number	= - (x_axis_X * eye_X + x_axis_Y * eye_Y + x_axis_Z * eye_Z);
			var	m42	: Number	= - (y_axis_X * eye_X + y_axis_Y * eye_Y + y_axis_Z * eye_Z);
			var	m43	: Number	= - (z_axis_X * eye_X + z_axis_Y * eye_Y + z_axis_Z * eye_Z);
			
			initialize(
				x_axis_X,	y_axis_X,	z_axis_X,	0.,
				x_axis_Y,	y_axis_Y,	z_axis_Y,	0.,
				x_axis_Z,	y_axis_Z,	z_axis_Z,	0.,
				m41,		m42,		m43,		1.
			);
			
			return this;
		}
		
		public function lookAt(target	: Vector4,

							 lookAt : Vector4,
							 up		: Vector4	= null) : Matrix4x4
		{
			eye ||= getTranslation();
			
			var direction : Vector4 = Vector4.subtract(lookAt, eye, TMP_VECTOR4);
			
			var eye_X		: Number = eye._vector.x;
			var eye_Y		: Number = eye._vector.y;
			var eye_Z		: Number = eye._vector.z;
			
			var z_axis_X	: Number = direction._vector.x;
			var z_axis_Y	: Number = direction._vector.y;
			var z_axis_Z	: Number = direction._vector.z;
			
			var up_axis_x	: Number;
			var up_axis_y	: Number;
			var up_axis_z	: Number;
			
			if (up != null)
			{
				// if up axis was given, take it. An error will be raised later if it is colinear to direction
				up_axis_x = up._vector.x;
				up_axis_y = up._vector.y;
				up_axis_z = up._vector.z;	
			}
			else
			{
				// if direction is colinear to (0, 1, 0), take (1, 0, 0) as up vector
				if (z_axis_X == 0 && z_axis_Y != 0 && z_axis_Z == 0)
				{
					up_axis_x = 1;
					up_axis_y = 0;
					up_axis_z = 0;
				}
					// else, take (0, 0, 1)
				else
				{
					up_axis_x = 0;
					up_axis_y = 1;
					up_axis_z = 0;
				}
			}
			
			var l : Number;
			
			l = 1 / Math.sqrt(z_axis_X * z_axis_X + z_axis_Y * z_axis_Y + z_axis_Z * z_axis_Z);
			
			z_axis_X *= l;
			z_axis_Y *= l;
			z_axis_Z *= l;
			
			var x_axis_X : Number = up_axis_y * z_axis_Z - z_axis_Y * up_axis_z;
			var x_axis_Y : Number = up_axis_z * z_axis_X - z_axis_Z * up_axis_x;
			var x_axis_Z : Number = up_axis_x * z_axis_Y - z_axis_X * up_axis_y;
			
			l = 1 / Math.sqrt(x_axis_X * x_axis_X + x_axis_Y * x_axis_Y + x_axis_Z * x_axis_Z);
			
			x_axis_X *= l;
			x_axis_Y *= l;
			x_axis_Z *= l;
			
			var y_axis_X : Number = z_axis_Y * x_axis_Z - x_axis_Y * z_axis_Z;
			var y_axis_Y : Number = z_axis_Z * x_axis_X - x_axis_Z * z_axis_X;
			var y_axis_Z : Number = z_axis_X * x_axis_Y - x_axis_X * z_axis_Y;
			
			l = 1 / Math.sqrt(y_axis_X * y_axis_X + y_axis_Y * y_axis_Y + y_axis_Z * y_axis_Z);
			
			y_axis_X *= l;
			y_axis_Y *= l;
			y_axis_Z *= l;
			
			if ((x_axis_X == 0 && x_axis_Y == 0 && x_axis_Z == 0) 
				|| (y_axis_X == 0 && y_axis_Y == 0 && y_axis_Z == 0))
			{
				throw new Error(
					'Invalid argument(s): the eye direction (look at - eye position) '
					+ 'and the up vector appear to be the same.'
				);
			}
			
			var	m41	: Number	= -(x_axis_X * eye_X + x_axis_Y * eye_Y + x_axis_Z * eye_Z);
			var	m42	: Number	= -(y_axis_X * eye_X + y_axis_Y * eye_Y + y_axis_Z * eye_Z);
			var	m43	: Number	= -(z_axis_X * eye_X + z_axis_Y * eye_Y + z_axis_Z * eye_Z);
			
			initialize(
				x_axis_X,	y_axis_X,	z_axis_X,	0.,
				x_axis_Y,	y_axis_Y,	z_axis_Y,	0.,
				x_axis_Z,	y_axis_Z,	z_axis_Z,	0.,
				m41,		m42,		m43,		1.
			);
			
			return this;
		}

		public function perspectiveFoV(fov		: Number,
