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(); }
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)); }