Jump to content

  • Log In with Google      Sign In   
  • Create Account





Don't Walk Off That Edge!

Posted by Aardvajk, 05 May 2014 · 367 views

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

    if(m)
    {
        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).




October 2014 »

S M T W T F S
   1234
567891011
12131415161718
19202122 23 2425
262728293031 

Recent Entries

Recent Comments

Recent Entries

Recent Comments

PARTNERS