# Mesh offset code running on GPU. Have some distortion to track down.

Mesh offset code running on GPU. Have some distortion to track down.

That is super awesome.

@Todd_Fleming just offset or something like dropcutter?

Amazing!

@Miguel_Sanchez its output is like dropcutter, but it works in reverse. Instead of solving “how far down can a ball mill go at x,y?”, it solves “which set of x,y points does this triangle impact assuming a ball mill, and what are the Z values there?”. The GPU’s Z buffer cleans up overlap.

So is that why you have that wobble on the right ear?

Each triangle defines 3 spherical regions, 3 cylindical regions, and 1 flat region. It has a numeric stability bug; this causes it to drop part of the flat region, letting the curved regions dominate where they should have been covered up. I have an idea to fix it.

Solved the flat part. I also messed up projecting x,y onto cylinders which aren’t parallel to the xy plane and am working on a fix.

@Todd_Fleming go easy on me I’m a mechanical guy…
Are you taking the triangular mesh at a point in the XY and Z and interpolating them into spherical based on projection to gain an approximation of X,Y related to Z?

@Brandon_Satterfield It does the following for every triangle in the mesh (all on the GPU):

let r = offset distance and p1, p2, p3 = vertexes of original triangle.

There are spheres with radius r centered at p1, p2, and p3.

There are cylinders connecting p1 to p2, p1 to p3, and p2 to p3. The circles at the cylinders’ ends have radius r and are centered on p1, p2, or p3.

There is a new triangle offset r from the original.

The fragment shader draws the new shapes. It does this by projecting x, y onto the shapes and calculating z.

The result is a height map (right now I’m using 1024 * 1024). The blue lines scan the height map.

@Todd_Fleming You can project triangles using the normal vector of each one. How long does it take in your sample case? How many triangles has the object?

@Miguel_Sanchez The normal vector handles offsetting the old triangle to the new triangle. It does not calculate z from the xy projection; the GPU’s barycentric implementation does that, but it’s only useful for the triangle, not the cylinder.