public static Vector3 Multiply(Vector3 v, MatrixF m) { Vector3 n = Zero; n.X = (v.X * m[0, 0]) + (v.Y * m[1, 0]) + (v.Z * m[2, 0]) + m[3, 0]; n.Y = (v.X * m[0, 1]) + (v.Y * m[1, 1]) + (v.Z * m[2, 1]) + m[3, 1]; n.Z = (v.X * m[0, 2]) + (v.Y * m[1, 2]) + (v.Z * m[2, 2]) + m[3, 2]; float w = (v.X * m[0, 3]) + (v.Y * m[1, 3]) + (v.Z * m[2, 3]) + m[3, 3]; if (Math.Abs(w) > 0.001f) { n.X /= w; n.Y /= w; n.Z /= w; } return(n); }