public static float Detect(Quad obstacle, Player player) { var tr = FixedTransformation(obstacle); var q = (tr * Vector4.UnitW).Xyz; var p = player.GetPosition(); var n = obstacle.GetNormal(); var qp = p - q; var sgnd = Vector3.Dot(qp, n); var r = -sgnd * n + p; var w = (tr * new Vector4(obstacle.GetWidth(), obstacle.GetHeight(), 0f, 1.0f)).Xyz; var cmpR = new Vector3(FixedClamp(r.X, q.X, w.X), FixedClamp(r.Y, q.Y, w.Y), FixedClamp(r.Z, q.Z, w.Z)); var cmpRP = p - cmpR; var diff = cmpRP.Length - player.GetRadius(); return(diff); }