Notifications
Clear all

[Closed] UVW mapping Rollercoaster track

Hey everyone,

I wrote a little script that generates a rollercoaster track from a CSV file containing matrix values for location, pitch, yaw and roll of the track. It works by placing a predefined cross section of track at every point in the CSV file and applying a crosssection and surface modifier to it. This method however, leaves me without mapping coordinates for the rails. Any idea how I can tackle this problem? Maybe a different method for creating the rails? Anyway here’s the code I got so far:

f = 0
tiespacer = 1
executed = 0
trackdataarray = #()
trackcomponents = #()
rollout bu "Convert spline data"(
   button csvselect "Select CSV file"
   label CSVpresent "No CSV file selected"
   dropdownlist coastertype "Select coaster style" items:#("Vekoma MK1101", "Togo Default")
   spinner heartline "Heartline value" type:#worldunits range:[-10,10,0]
   button generate "Generate track"
   button finalize "Finalize track"
   
   on csvselect pressed do(
      f = getopenfilename caption:"Select CSV file" types:"Excel(*.csv)"
      if getFilenameType f != ".csv" then(
         messagebox "That's not a CSV file"
         CSVpresent.text = "No CSV file selected"
      )
      else(
      CSVpresent.text = filenameFromPath f
      )
   )
      
   on generate pressed do(
      if f == 0 or getFilenameType f != ".csv" then(
         messageBox "No CSV file selected" 
      )
      else(
         trackstyle = getFilenamePath(getSourceFileName()) + "\\No Limits spline translator\\" + coastertype.selected  +".max"
         if doesFileExist trackstyle == true then(
            mergeMAXFile  trackstyle #select
            selection.pivot = [0,0,heartline.value]
            trackcomponents = for s in selection collect s.name
            trackdata = openFile f
            while not eof trackdata do(
               linevalue = ("#(" + readline trackdata + ")")
               trackdataarray = append trackdataarray linevalue
            )
            deleteitem trackdataarray 1
            for t in trackcomponents do(
               for a in trackdataarray do(
                  subarray = execute a
                  if substring t 1 3 != "Tie" then(
                     copyobj = getNodeByName t
                     copiedobj = copy copyobj
                     objmatrix = matrix3[subarray[5], subarray[7]*-1, subarray[6]] [subarray[8], subarray[10]*-1, subarray[9]] [subarray[11], subarray[13]*-1, subarray[12]] [subarray[2], subarray[4]*-1, subarray[3]]
                     copiedobj.transform = objmatrix
                  )
                  else(
                     if tiespacer == 1 then(
                        copyobj = getNodeByName t
                        copiedobj = copy copyobj
                        objmatrix = matrix3[subarray[5], subarray[7]*-1, subarray[6]] [subarray[8], subarray[10]*-1, subarray[9]] [subarray[11], subarray[13]*-1, subarray[12]] [subarray[2], subarray[4]*-1, subarray[3]]
                        copiedobj.transform = objmatrix
                        tiespacer = 0
                     )
                     else(
                        tiespacer = 1
                     )
                  )
               )
            )
            delete selection
            executed = 1
         )
         else(
            messagebox "source file couldn't be found, please make sure it's in the right directory"
         )
      )
   )
   on finalize pressed do(
      if executed == 0 then(
         messagebox "No track was created yet"
      )
      else(
         modifierarray = #()
         for a in trackcomponents do(
            railarray = #()
            for o in objects do(
               if iskindof o splineShape do(
                  if substring a 1 3 == substring (o.name) 1 3 do(
                     --print o.name
                     railarray = append railarray o
                  )
               )
            )
            while railarray.count > 1 do(
               addAndWeld railarray[1] railarray[2] 0
               deleteItem railarray 2
            )
            masterobj = railarray[1]
            modifierarray = append modifierarray masterobj
         )
         cro = crosssection()
         sur = surface()
         sur.threshold = 0
         sur.steps = 1
                  
         for i in modifierarray do(
            if i != undefined do(
               addmodifier i cro
               addmodifier i sur
            )
         )
         redrawviews()
      )
   )
)
createDialog bu
4 Replies

I managed to solve my problem but if anyone still has an idea how to tackle this problem, let me know. I’m open to better solutions. What I did was add a uvw map with face map type and then add an unwrap_UVW and perform an “unfold strip from loop” function. Here’s the result:

You can use matrix as a coordsys to create rails.

delete objects

p = Circle radius:250 displayrendermesh:false
addModifier p ( Normalize_Spl length:20 )
addModifier p ( Noisemodifier scale:300 strength:[0,0,150] )
convertToSplineShape p


b = Rectangle width:30 length:60 displayrendermesh:false
pc = Path_Constraint follow:on axis:2 path:p bank:on
b.pos.controller = pc


matrixValues = for i = 1 to 100 by 5 collect (
    
    pc.percent = i;
    b.transform
    
)


shp = splineShape wirecolor:blue name:(uniqueName "rails_") render_mapcoords:on displayrendermesh:on thickness:8 realWorldMapSize:on
addnewspline shp
addnewspline shp

for m in matrixValues do (
        
    Ellipse width:25 length:100 transform:m wirecolor:yellow displayrendermesh:false
    
    in coordsys m (
        
        addKnot shp 1 #smooth #curve [-5,-40,0]
        addKnot shp 2 #smooth #curve [-5,40,0]
            
    )
    
    
)
close shp 1
close shp 2
updateshape shp

map = checker()
map.coords.realWorldScale = true
map.coords.U_Tiling = 0.15
map.coords.V_Tiling = 0.15



shp.material = Standardmaterial diffuseMap:map
showTextureMap shp.material true

meditMaterials[1] = shp.material

Thanks for your reply Serejah, there’s only one problem you get using your method. The mapping coordinates don’t bank along with the track. This is crusial for mapping those stripes you get from the wheels of the coaster train.

Try Sweep modifier with Banking:on on these rails splines.