So, from a geometrical point of view, the fact is that offsets are nasty… You simply can’t offset using only vertex translations, and a) get a good offset and b) not get intersections.
In my project, I basically did the same thing as in the link you posted. The idea is:
- Get the vertices of the path. This is the center line.
- Create a billboard for each edge whose Y direction is parallel to the path edge, whose position is the midpoint of the edge, and has some width. Enable FC_DIRECTION to constraint he billboard to only rotate around the Y axis.
- In a shader, trim back the rendered pixels to avoid the intersections. This is not perfect, since you usually use one value for all edges, which is not good.
- In my implementation. I added another set of billboards at each vertex of the path. These render a circle whose diameter is the same as the width of the edge billboards. Enable FC_ROTATE_XYZ to have this always face the camera. This hides errors in the edges and creates rounded corners.
It’s not perfect, but it is substantially better than the ribbon trail…
Here is an example of how this technique looks: https://meshgeometry.github.io/Demos/CurveEdit/IogramPlayer.html