public static Vector3D CollideAndSlide(BoundingEllipsoid ellipsoid, Vector3D velocity, Triangle[] triangles) { BoundingSphereD sphere = new BoundingSphereD(ellipsoid.Center / ellipsoid.Radius, 1d); Vector3D eVelocity = velocity / ellipsoid.Radius; //TODO: make triangles (and edges) a struct... not so simple! Triangle[] eTriangles = new Triangle[triangles.Length]; for (int i = 0; i < triangles.Length; i++) { eTriangles[i] = triangles[i] / ellipsoid.Radius; } velocity = CollideWithTriangles(sphere, eVelocity, eTriangles, 0); //Add gravity pool if (gravityOn) { sphere.Center += velocity; ellipsoid.Center = sphere.Center * ellipsoid.Radius; eVelocity = gravity / ellipsoid.Radius; velocity += CollideWithTriangles(sphere, eVelocity, eTriangles, 0); } return(velocity * ellipsoid.Radius); }
public static CollisionResult CollidesWith(this BoundingEllipsoid ellipsoid, Triangle triangle, Vector3D velocity) { BoundingSphereD sphere = new BoundingSphereD(ellipsoid.Center / ellipsoid.Radius, 1d); Vector3D eVelocity = velocity / ellipsoid.Radius; Triangle eTriangle = triangle / ellipsoid.Radius; CollisionResult collisionResult = sphere.CollidesWith(eTriangle, eVelocity); collisionResult.IntersectionPoint *= ellipsoid.Radius; return(collisionResult); }