This is a process for creating hardsurface game assets, automating the highpoly and lowpoly stages as much as possible. Using this technique the artist can spend more time focusing on form design, less time on tedious operations relating to subdivision or optimization. I've been doing this for a couple weeks and received enough questions that it seemed worth writing down and sharing.Special thanks to Robert Deleanu, Ethan Hiley, Pedro Amorim, and Hans Palm for providing many ideas and tips that went into this structure.I. Create meshes in 3ds Max as Proboolean objects.
Any mesh in 3ds Max can be converted to a Proboolean object. While the mesh is selected, click the button in the Create > Geometry > Compound Objects panel:
You can also map this command to a hotkey or quad menu, which I recommend so that you don't have to flip through panels as much.
A Proboolean is an object that contains a list of meshes that are combined, in order, using standard boolean operations. These sub-meshes are referred to as "operands."
This is the Proboolean UI:
Every operand within a Proboolean remains live and editable. In
other words, the object itself is completely nondestructive.
change the order of the operands, change their operation type, remove
them, re-insert them, and edit them even while they're in the
By doing most of our modeling as Proboolean operations, revisions usually only affect a few operands, and don't require massive remodeling.
Here's an example of a relatively complex object made from a large number of boolean operands:
One thing to note - keep your curves dense at this stage. When using cylinders, use high segment counts. I often use 36 at minimum and 108 or 140 for extremely large cylinders. This will produce better results in Zbrush.
Later, when generating the lowpoly, we'll dial down these segment counts. That's easy to do because they remain live subobjects within the Proboolean.II. Send the Proboolean object to Zbrush and Dynamesh it.
Once the mesh is fully defined as a Proboolean object we can send it to Zbrush to automate the highpoly process.
One quick step first, though. Probooleans have a lot of concave n-gons, and these can be mistriangulated on export or import. It's a good idea to quickly resolve the issue before sending to Zbrush.
There's a few ways to do that, but I recommend that you add the Turn to Poly modifier, set Limit Polygon Size to 4, and enable Keep Polygons Convex.
Once this is done, export the object as an .OBJ and open Zbrush. Choose one of the default Dynamesh projects from the start screen.
Click the Tool, then Import, and navigate to your .OBJ.
Click the Geometry tab, then the Dynamesh tab. Pick a resolution - what you need will depend on your object. You'll find out quickly if you picked too low, and it's easy to undo the Dynamesh process, so I suggest trial by error until you get a feel for what different objects need. I used 256 here.
Note - you can get a plugin, Dynamesh Master, that improves this process. Several people have recommended it to me.
To apply the Dynamesh, hold CTRL and click-drag on empty screen space. If you're unfamiliar with it, yes - the Zbrush UI is bizarre.
Once you regain control, the object has been remeshed. Now go down to the Decimation panel and have a look at the polish options.
The Polish process has a toggle, activated by clicking on the icon to the right. It changes the effect of the process:
To actually apply the process, drag the slider out to some point along the bar. The further you drag it the stronger the effect will be. You can apply it multiple times. Play around with it, try to get the level of edge thickness you want.
And that's it for the highpoly. Now we just need to decimate it and bring it back to Max.
You can use any decimation tool you like. Personally what I do is import it into Max as-is, then apply the ProOptimizer modifier:III. Generate LP by reducing operand segment counts and applying modifiers.>> Note - for this part I'm changing demo objects, only because I already had these images made for another thread. The same principles apply to any model made with this workflow.
To generate the lowpoly we go back to our original Proboolean objects and duplicate them to a new layer in 3ds.
Go through each operand with an eye towards reducing geometric complexity. This is where the live, non-destructive nature of the Proboolean shines. You can click on any operand to select it, and then edit its parameters directly in the stack.
For cylinders, reduce segment counts. For tertiary details, detach and remove them entirely.
The main problems now are stray vertices, n-gons, and concave polygons.
We can solve these problems with a simple modifier stack - Vol.
Select to grab the verts, Vertex Weld to weld them, and Turn to Poly to
divide our n-gons into convex quads.
You can reduce this process to a single button press using this macro script:
toolTip:"Quick Lowpoly Stack"
if (selection.count > 0) then
modPanel.addModToSelection (Vol__Select ()) ui:on
$.modifiers[#Vol__Select].level = 1
modPanel.addModToSelection (Vertex_Weld ()) ui:on
$.modifiers[#Vertex_Weld].threshold = 0.05
modPanel.addModToSelection (Turn_to_Poly ()) ui:on
$.modifiers[#Turn_to_Poly].selectionConversion = 1
$.modifiers[#Turn_to_Poly].limitPolySize = on
$.modifiers[#Turn_to_Poly].keepConvex = on
modPanel.addModToSelection (Edit_Poly ()) ui:on
The only remaining issues left by this process are some triangles that are too long, too thin, too small, awkwardly placed, etc. For this reason I also put an Edit Poly modifier on tap of the stack, where we can make final, manual geo edits. If any revisions happen down the line, this is the only destructive part that we have to remove and re-make. Since it's just a modifier, everything underneath is still procedural - a Proboolean object with a few automated processes on top.
I hope this walkthrough proves useful to some, and if anyone has any tweaks or improvements of their own I invite you to share them. I'll be linking people here from now on when they ask about the process I'm using. For those of you finding this thread from the other direction, these are a few assets I slapped together with these methods: