• entries
    743
  • comments
    1924
  • views
    577732

Don't Walk Off That Edge!

Sign in to follow this  
Followers 0
Aardvajk

1004 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 smile.png

game.jpg

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], 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? smile.png) in the right direction (geddit? smile.png).

3
Sign in to follow this  
Followers 0


0 Comments


There are no comments to display.

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!


Register a new account

Sign in

Already have an account? Sign in here.


Sign In Now