Jump to content

April 2017 »

23 242526272829

Recent Entries

Recent Entries

- - - - -

Don't Walk Off That Edge!

4: Adsense

Added support for showing the outlines of the phyiscs shapes, along with the normals of the edges for polygons and, yes, you can enable/disable this from the console Posted Image

Attached Image

Preventing your character from walking off edges is proving to be slightly trickier than you would think. Amazing how you take these things for granted when you play games without really thinking about them, even as a programmer.

I've decided to approach the problem from the opposite direction. At the moment you can never walk over the edge of a shape at all.

This is implemented by doing an edge query on the shape you are currently grounded on. The edge query looks like this:
EdgeResult Polyhedron::edgeQuery(const Vec3 &pos, float radius, uint feature, const Matrix &transform) const
    float m = 0;
    Vec3 v(0, 0, 0);

    for(uint i = 0; i < faces[feature].count; ++i)
        uint j = (i < faces[feature].count - 1 ? i + 1 : 0);

        Vec3 a = transformCoord(verts[faces[feature].indices[i]], transform);
        Vec3 b = transformCoord(verts[faces[feature].indices[j]], transform);

        Vec3 p = closestPointOnSegmentToPoint(a, b, pos);

        float d = vectorLength(p - pos);
        if(d <= radius)
            Vec3 c = (b - a);
            Vec3 n = crossVectors(normalizeVector(c), norms[feature]);

            m += radius - d;
            v += -n;

        return EdgeResult(m, v);

    return EdgeResult();
In English, run through each edge of the face, get the closest point on the edge to the position and if it is less than the radius, accumulate the vector pointing back into the face and the distance.

The character controller now modifies the velocity by the result of this query. It's not quite right when colliding with multiple edges. Need to ponder how to accumulate vectors together to get the right result there.

Now the problem is how to decide which edges should block you and which shouldn't. I'd rather avoid a preprocess step if possible, although I don't rule that out at this stage. The problem is clearly when you have two shapes sat next to each other, any part of their edges that are co-incident should not be checked like this, but detecting that will be tricky.

Still, its a step (geddit? Posted Image) in the right direction (geddit? Posted Image).

Note: GameDev.net moderates comments.