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(); }
static void getInput() { ConsoleKeyInfo cki; do { cki = Console.ReadKey(); switch (cki.Key) { case ConsoleKey.W: camera.Translate(camera.ViewVector.Normalize() * 10); break; case ConsoleKey.A: camera.Translate(Point3D.Cross(camera.ViewVector, camera.UpVector).Normalize() * 10); break; case ConsoleKey.S: camera.Translate(-camera.ViewVector.Normalize() * 10); break; case ConsoleKey.D: camera.Translate(Point3D.Cross(camera.ViewVector, camera.UpVector).Normalize() * -10); break; case ConsoleKey.Spacebar: camera.Translate(new Point3D(0, 5, 0)); break; case ConsoleKey.V: camera.Translate(new Point3D(0, -5, 0)); break; case ConsoleKey.Q: camera.Rotate(new Point3D(0, 0.05f, 0)); break; case ConsoleKey.E: camera.Rotate(new Point3D(0, -0.05f, 0)); break; case ConsoleKey.UpArrow: camera.Rotate(new Point3D(-0.05f, 0, 0)); break; case ConsoleKey.DownArrow: camera.Rotate(new Point3D(0.05f, 0, 0)); break; case ConsoleKey.P: shaded = !shaded; break; case ConsoleKey.R: camera.Position = new Point3D(0, 0, 0); camera.ViewVector = new Point3D(0, 0, -1); camera.UpVector = new Point3D(0, 1, 0); camera.calcWorldtoCameraMatrix(); break; case ConsoleKey.G: if (PhysicsObject.gravity.Y != PhysicsObject.grav.Y) { PhysicsObject.gravity = PhysicsObject.grav; } else { PhysicsObject.gravity = 0 * PhysicsObject.grav; } break; case ConsoleKey.H: if (PhysicsObject.gravity.Y != -PhysicsObject.grav.Y) { PhysicsObject.gravity = -PhysicsObject.grav; } else { PhysicsObject.gravity = 0 * PhysicsObject.grav; } break; case ConsoleKey.O: foreach (PhysicsObject ob in scene.getObjects()) { ob.Velocity *= 0.0f; ob.AngularVelocity *= 0.0f; } PhysicsObject.gravity *= 0.0f; break; case ConsoleKey.L: Random rand = new Random(); foreach (PhysicsObject ob in scene.getObjects()) { ob.AngularVelocity = new Point3D(rand.Next(-1, 2) * 0.05f, rand.Next(-1, 2) * 0.05f, rand.Next(-1, 2) * 0.05f); } break; } } while (cki.Key != ConsoleKey.Escape); }