top of page

3dsMax Dynamesh script

Slices object in 3d dimension giving it na evenly distributed definition similar to the dynamesh tool in ZBrush. 

colStart = white as point3; print colA
colEnd = green as point3; print colB
remeshprogress = 0.0
totalremeshsteps = 0.0
objectpos
objectrot
offset =0.01
run = true
errorstringvariable 

progresssteps = 0.0

try
(
    cui.UnRegisterDialogBar  remeshdialog 
    destroyDialog remeshdialog
)
catch()
rollout remeshdialog "Remesh"
(
    editText devisionsbox "" text:"10" width:35
    
    checkbutton btnSX "X"     pos:(devisionsbox.pos+[50,0]) tooltip: "Slice on X plane"  checked:true align:#left
    checkbutton btnSY "Y"     pos:(btnSX.pos+[30,0]) tooltip: "Slice on Y plane"  checked:true
    checkbutton btnSZ "Z"     pos:(btnSX.pos+[60,0]) tooltip: "Slice on Z plane"  checked:true
    
    checkbutton btnKO "Old" align:#left    tooltip: "Keep old edges" checked:true 
    checkbutton btnKB "Border" pos:(btnKO.pos+[40,0]) tooltip: "Keep borders"  checked:true 
    checkbutton btnWP "Weld"     pos:(btnKB.pos+[55,0]) tooltip: "Weld Close points after remesh"  checked:false 

    button btndynamsh "Remesh" width:140
    progressBar pbProgress "" value:0 color:colStart
    --button btnweld "WeldPoints" width:140
    
    on spnSelectAmount changed val do
    (
       pbProgress.value += 1/totalremeshsteps
       pbProgress.color = colStart + (colEnd - colStart) * val / 100
    )

    fn Remesh =
    (
        DisableSceneRedraw()
        progressStart
        progress = 0.0
       if(run) then
       (
            run = false
            devisions = devisionsbox.text as integer
       )
       else
        (     
            devisions = (devisionsbox.text as integer) + 1
             run = true
                    
        )
        print (devisions)

       s = $
      
       if(classof s == Editable_Poly ) then
       (
           undo on
           (

               polyop.setEdgeSelection s #all
               old = polyOp.getEdgeSelection s

               colW=s.max.x-s.min.x
               colL=s.max.y-s.min.y
               colH=s.max.z-s.min.z
               
                if(colH>=colL and colH>=colW) do cutsize = colH/(devisions as float)
                if(colL>=colH and colL>=colW) do cutsize = colL/(devisions as float)
                if(colW>=colH and colW>=colL) do cutsize = colL/(devisions as float)
              
               totalremeshsteps = 3* (devisions as integer)
               progresssteps = 100.0/totalremeshsteps
              
               objectpos = s.pos
               objectrot = s.rotation
              
              -- s.pos = [0,0,0]
              -- s.rotation = eulerangles 0 0 0
               
               cutpoint = s.min 
               Dummy pos:$.max
               
               --z
               if(btnSZ.checked) do
               (
                   cutpoint.z += cutsize + offset
                   while(cutpoint.z<s.max.z)do
                   (
                       progress += progresssteps
                       if keyboard.escPressed do exit()
                        pbProgress.value =  progress
                        $.slice [0,0,1] (cutpoint-s.pos)
                        cutpoint.z += cutsize
                       progressUpdate (progress)
                   )
                    cutpoint.z += cutsize + offset
                )
               --y
               if(btnSY.checked) do
               (
                   cutpoint.y += cutsize + offset
                   while(cutpoint.y<s.max.y)do
                   (
                       progress += progresssteps
                       print progress
                        if keyboard.escPressed do exit()
                      pbProgress.value = progress
                      $.slice [0,1,0] (cutpoint-s.pos)
                      cutpoint.y += cutsize
                       progressUpdate (progress)
                   )
               )
               
               --x
               if(btnSX.checked) do
               (
                   cutpoint.x += cutsize + offset
                   while(cutpoint.x<s.max.x)do
                   (
                       progress += progresssteps
                        if keyboard.escPressed do exit()
                      pbProgress.value = progress
                      $.slice [1,0,0] (cutpoint-s.pos)
                      cutpoint.x += cutsize
                       progressUpdate (progress)
                   )
               )
               pbProgress.value = 0
               
               if(btnKB.checked) do
               (
/*                     $.EditablePoly.ConvertSelection #Object #Border
*                    temp = polyOp.getEdgeSelection $ 
*                     old = old - temp
*/
                )
              
               EnableSceneRedraw()
               polyOp.SetEdgeSelection s old
               subobjectLevel = 2
               macros.run "PolyTools" "Loop"
                --s.rotation = objectrot
              -- s.pos = objectpos
              
               d = $
               subobjectLevel = 2
                
               if(not btnKO.checked) do
               (
                   macros.run "PolyTools" "Loop"
                   d.EditablePoly.ConvertSelection #Edge #Vertex
                   d.EditablePoly.Remove()
                   subobjectLevel = 1
                   d.EditablePoly.Remove()
               )
               
               if(btnWP.checked) do
               (
                   d.EditablePoly.ConvertSelection #Object #Vertex
                   verts =  polyOp.GetVertSelection d
                   weldtresh = cutsize - cutsize/2.0
                   d.weldThreshold = weldtresh
                   polyop.weldVertsByThreshold d verts
                )
           )
       )
       else
       (
            messagebox "Object has to be an editpoly"
           EnableSceneRedraw()
       )
    )

    on btndynamsh pressed do
    (
        try
        (
            Remesh()
        )
        catch
        (
            EnableSceneRedraw()
            errorstringvariable = getCurrentException()
            MessageBox errorstringvariable
        )

    )
)

createDialog remeshdialog
cui.RegisterDialogBar remeshdialog  style:#(#cui_dock_left, #cui_floatable)
 

Kasper Ghyllebert

© Copyright 2023. No animals were harmed in the making

buste speed sculpt

On of my more realistic and detailed sculpts amongst allot of speedsculpts 

 

bottom of page