# How to cut a 3D mesh like a lathe?

How to simulate the object cutting with a lathe, similar to what's done in the CRAFT: Work VR Shop app?

• It looks like you could do this by either generating a cylindrical mesh and displacing the vertices' radii according to a profile curve, or handle it inna shader by raymarching against a profile stored in a 1D heightmap texture. How have you tried solving your problem so far, and where have you gotten stuck? Oct 8 '19 at 18:29
• this is a very early stage, I am looking for a right approach before I start working on it. Maybe it's a mesh boolean library for mesh operation like doing with the 3D modelling software like 3dmax, maya, blender, etc. but I need to use it in the game engine, so I guess I have to control it in the mesh level. Oct 8 '19 at 20:12
• Delete this idea that you need to find a "right" approach before you start working. This will be a huge impediment to your progress. Games are frequently experimental. If you wait for a consensus to emerge about what way is "right," you will be waiting a very long time, and other games will beat you to the punch. So, get in the habit of diving in and trying stuff. Prioritize "works" over "right". Oct 8 '19 at 20:18

I implemented the effect by doing a virtual lathe. I used Unity for simplicity, but this can be done in pretty much anything. First I had to generate a cylinder:

Instead of simply doing a normal cylinder, I generated a line of points and rotated them around. This way if I change the height of the vertices on that single line, it will affect the whole shape. For instance here's a sine wave:

(I upped the sideways resolution a bit to make it look nicer)

Now let's add a carving tool:

The only thing left to do is to detect when the carving tool gets closer to the object, than the width of it at that point and if it does, remove some of it:

And that's it. It still has some problems you need to fix, e.g.:

• It doesn't do dynamic collision, so if I were to move the carving tool too fast, it would leave strange artifacts
• It's missing dynamic detail. You might not want to spend a lot of rendering time on relatively simple objects

But those should be easy to do (moving the tool only in small increments and checking the distance between vertices every frame respectively).

• The approach make sense, I have the similar idea. but this question's key is about your mentioned "I generated a line of points and rotated them around", how? how to use script to generate and operate the mesh? Oct 10 '19 at 23:46
• @blackgun depends on the framework/engine you use, but you essentially need a rotation matrix and a line of points. Store the line of points in an array, then rotate them (using rotation matrices or quaternions) and append them to the end of the same array and so on until you rotated them 360 degrees. This leaves you with a list of points in 3d space ordered so that the points of each line are next ti each other. Let's say you have n points in a line and l lines. You need to connect these into quads with indices. Every quad uses 2 points from one line and 2 from the line to the right. Oct 11 '19 at 0:19
• The indices of these points in the array are 1.:(x * n + y), 2.:(x * n + y + 1), 3.:((x + 1) * n + y + 1), 4:. ((x + 1) * n + y) where x is the line the lower left point is in and y is the index of the point in that line. To make a quad out of this using two triangles, you need to connect the 1., 4. and 2. and the 2., 4. and 3. points into 2 triangles (aka. push them into an index list). Repeat this for every x between 0 and l - 1 and every y between 0 and n - 1 and you'll have a bunch of quads shaped as a cylinder. Modify the starting line and repeat every step to carve into the object Oct 11 '19 at 0:25
• Send the index list and vertices to the GPU or let the framework/engine handle it for you to render it Oct 11 '19 at 0:28
• Hi Balint, thanks for your reply. My case is a bit complicated, could we discuss them via email ? blackgun99 at g mail . thank you. Oct 11 '19 at 20:17