Started working in a new game project now. I decided what the world needs is a soft-body swinging physics game, much like my old Squishy project, but rendered in 3D.
I ported ewjordan's excellent Box2D constant area joint over from the Java Box2D library to C++ and it works a treat for simulating a soft body in Box2D. You build a body out of a circle of small circles and it maintains the area in a lovely squishy sort of way. Here I have encased another body inside this ring which is used as the pivot point and to drive the character and works well. In motion in a poor quality video:
Taking a 2D list of points and rendering it as a 3D blob was an interesting problem that I've invented a completely new (to me) solution to that I thought I'd run through quickly.
To begin with, I create a list of the line segments connecting the outer bodies, including the normals:
I then find the min and max x co-ordinates, and a y co-ordinate somewhere below the blob, then use a segment intersection test to step across the shape, casting a ray up across the shape looking for intersections, first with it set to find a segment with a normal opposite to the ray direction, then one with a normal in the same direction. Thus we end up tracing out the shape as a series of vertical segments:
From here, we now have a top and bottom co-ordinate so we find the centre point of each and use those to define a circle of vertices that moves around the centre along the Z axis with its size based on the size of the segment. It is then just a case of stitching these vertices together into faces, and getting the vertex normals by working out the direction of the vertex from the centre (average) position of the shape.
Means creating the mesh on the fly every frame, but seems to be fast enough. Seems to produce a nice effect. Just need to start pondering how to render the squishy arms that you fire out to swing around the world next.