コード例 #1
0
        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);
        }
コード例 #2
0
        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);
        }