public static bool Bounce_Point_Mass_Off_Sphere(Sphere rc, Point_Mass_Body par) { var p = par.Position - rc.Position; var l = p.Length() - rc.Radius; if (l > 0) { return(false); } var normal = p; normal.Normalize(); par.Position += (rc.Radius - l) * normal; var v = par.Momentum; var dot = Vector3.Dot(normal, v); if (dot < 0) { v -= 1.0001f * dot * normal; par.Momentum = 0.5f * v; } return(true); }
public static bool Bounce_Point_Mass_Off_Plane(Plane_ p, Point_Mass_Body par) { var pd = Vector3.Dot(par.Position, p.Normal); var d = p.dist; d -= pd; if (d < 0) return false; par.Position += d * p.Normal; var mo = par.Momentum; var dot = Vector3.Dot(p.Normal, mo); if (dot < 0) { mo -= 2 * dot * p.Normal; par.Momentum = mo; } return true; }
public static bool Bounce_Point_Mass_Off_Sphere(Sphere rc, Point_Mass_Body par) { var p = par.Position - rc.Position; var l = p.Length() - rc.Radius; if (l > 0) return false; var normal = p; normal.Normalize(); par.Position += (rc.Radius - l) * normal; var v = par.Momentum; var dot = Vector3.Dot(normal, v); if (dot < 0) { v -= 1.0001f * dot * normal; par.Momentum = 0.5f * v; } return true; }
public static bool Bounce_Point_Mass_Off_Plane(Plane_ p, Point_Mass_Body par) { var pd = Vector3.Dot(par.Position, p.Normal); var d = p.dist; d -= pd; if (d < 0) { return(false); } par.Position += d * p.Normal; var mo = par.Momentum; var dot = Vector3.Dot(p.Normal, mo); if (dot < 0) { mo -= 2 * dot * p.Normal; par.Momentum = mo; } return(true); }