예제 #1
0
        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);
        }
예제 #2
0
        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;
        }
예제 #3
0
        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;
        }
예제 #4
0
        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);
        }