So we got the basic mechanics of edge traversal finally working, kind of. Excuse the dodgy animation, just a placeholder.
The idea is we maintain a contact point at each hand, offset slightly from the centre position. Each offset is a reference to an edge i.e. a pointer to the body, an index to identify the edge and a world-space position.
When we try to move, we move the position along its current edge, checking to see if we go over the end or not (basically a method called pointOnLine() which returns 0 - 1 when in the segment range or <0 or >1 if outside) and, if so, we find the next adjacent edge and project along that edge by the amount of step remaining.
This gives us two points we can form a vector between, then cross with (0,1,0) to get the normal so that he smoothly rotates around the corners.
Unfortunately the player capsule does intersect with the geometry a lot during this so I've had to disable collision checks between the bodies who own the edges in question, but this turns out to not be a perfect solution since some configurations of the environment can still report collisions where there should be none, so I need to think this through a little, see if we can come up with a better approach.
But it is essentially working and goes to show that if you have the freedom of an entirely kinematic controller with no physics, you can achieve almost any behaviour that you want.
Thanks for stopping by. I'm trying to keep these a bit briefer these days, and hope they remain of interest.