Пример #1
0
        public static void interact(ref List <PhysicsObject> collider)
        {
            float   m0      = collider[0].mass;
            float   m1      = collider[1].mass;
            float   total_M = m0 + m1;
            Point3D Vdiff   = collider[0].velocity - collider[1].velocity;
            Point3D CMdiff  = collider[0].MassCenter - collider[1].MassCenter;
            float   common  = 2 * (Point3D.Dot(Vdiff, CMdiff)) / (Point3D.Dot(CMdiff, CMdiff) * (total_M));

            collider[0].velocity -= (CMdiff) * (common * m1);
            collider[1].velocity -= (-CMdiff) * (common * m0);

            m0     *= collider[0].Radius * collider[0].Radius;
            m1     *= collider[1].Radius * collider[1].Radius;
            total_M = m0 + m1;
            Vdiff   = collider[0].AngularVelocity - collider[1].AngularVelocity;
            //Point3D CMdiff = collider[0].MassCenter - collider[1].MassCenter;
            CMdiff = Point3D.Cross(collider[0].AngularVelocity, collider[1].AngularVelocity);
            common = 2 * (Point3D.Dot(Vdiff, CMdiff)) / (total_M);
            collider[0].AngularVelocity = (CMdiff) * (common * m1);
            collider[1].AngularVelocity = (-CMdiff) * (common * m0);

            collider[0].applyVelocity();
            collider[1].applyVelocity();
        }
Пример #2
0
        private Point3D Project(Point3D p)
        {
            Point3D v  = ViewPoint(viewAlpha, viewBeta, viewDistance);
            Point3D vy = ViewPoint(viewAlpha, viewBeta + Math.PI / 2, 1);
            Point3D vx = Point3D.Mul(vy, v);

            vx = vx / vx.Distance;

            Point3D vp    = p - v;
            double  scale = v.Distance / vp.Distance;
            Point3D proj  = vp * scale + v;
            double  cy    = Point3D.Dot(proj, vy) / viewDistance;
            double  cx    = Point3D.Dot(proj, vx) / viewDistance;

            return(new Point3D(cx, cy, scale));
        }