public static Matrix4x4 CreateLookAt(Vector3 cameraPosition, Vector3 cameraTarget)
{
Matrix4x4 m = new Matrix4x4();
Vector3 vector = cameraPosition - cameraTarget;
vector.Normalize();
Vector3 vector2 = Vector3.Cross(new Vector3(0, 1, 0), vector);
vector2.Normalize();
Vector3 vector3 = Vector3.Cross(vector, vector2);
m.V00 = vector2.X;
m.V01 = vector2.Y;
m.V02 = vector2.Z;
m.V10 = vector3.X;
m.V11 = vector3.Y;
m.V12 = vector3.Z;
m.V20 = vector.X;
m.V21 = vector.Y;
m.V22 = vector.Z;
m.V03 = -Vector3.Dot(cameraPosition, vector2);
m.V13 = -Vector3.Dot(cameraPosition, vector3);
m.V23 = -Vector3.Dot(cameraPosition, vector);
m.V33 = 1;
return m;
}