The Spline system inside 3ds max is very good, but there are two very useful and fundamental part missing, which can be found in other 3d software: A way to control Twist and Radius/Scale per spline knot and not only allow for non-linear thickness and twist at object base level, but use such data to drive geometry generated by modifiers like Sweep and Path Deform.
Similar to how Poly Meshes have vertex/edge data channels which can hold data such as Weight, Crease, etc that can be passed on to other modifiers, spline objects should have channels for Twist and Radius/Scale data.
Current situation:
Let's say we have a geometry which we want to use with Path Deform. Any change to twist and scale has to be done via curves representing change over the whole spline, a solution which is imprecise and tedious to work with for this reason.
Suggested solution in detail:
Similar to Editable Poly, when in Knots (or Vertex) sub-level for splines, selecting one or several knots lets you set values for Twist and Radius/Scale.
- Twist could be angle away from what is the "up" direction according to the scene node of the spline, or the "up" direction relative to the previous knot. I acknowledge that compromises might be needed for certain situations to calculate the correct twist angle, for example if you use the scene node Z axis as the "up" vector and the spline is perfectly parallell to that axis, that will produce a highly unstable twist angle. Perhaps the user can select which scene node axis to use as "up" vector? If only the first knot is dependent on the scene node axis, all other knots could potentially rely on the previous knot twist angle for calculations, or if an array of "up" vectors are calculated for each step along the spline segments. I am sure it can be solved somehow since other 3d softwares have implemented this already.
- Radius/Scale could either be a radius value away from the knot position, which could be a in world units, or a scale value which is a multiplier of the spline's general Thickness value. Since a modifier such as Path Deform works with arbitrarily sized geometry, the concept of "radius" might make less sense there as opposed to scale. With that in mind, perhaps the simplest solution is to only have a Scale value and let it be a multiplier of the general spline Thickness. One could easily just use a general spline Thickness of 1 world unit, and the Scale value would become world units that way.
A visualization of these data channels could be displayed as follows:
- Each knot will have a circle with an arrow perpendicular to the tangent of the spline path.
- The radius of the circle shows the radius/scale of the knot.
- Inside the circle an arrow shows the direction of the twist angle.
- A configurable number of "spines" on the segments between the knots shows the interpolation of the twist and radius/scale between them.
![spline_data_mockup.gif spline_data_mockup.gif](https://forums.autodesk.com/t5/image/serverpage/image-id/1401298i6C6C480B4135476C/image-size/medium?v=v2&px=400)
It should of course be possible to toggle the visibility of these visual feedback elements, perhaps even individually so that you can view the radius/scale only, without the angle arrow or the "splines" showing, if you're only interested in the radius/scale for example.
Some unclear aspects of this idea:
- How would be the best way to control the interpolation of twist and radius/scale between the knots?
- A linear interpolation is the simplest, doesn't require any additional parameters or interfaces, but gives the least artistic control.
- Would a bias parameter that pushes the "midpoint" of the interpolation towards or away from either point be useful? Would that be something you control by selecting knots (meaning the selected knot will control the bias in the segment ahead of it), or would you select a segment and control bias there?
- Curves provide the most flexible solution but might be cumbersome if a lot of knots need to be changed. I imagine one curve representing one segment, where a linear curve between 0-1 means twist and radius/scale is linearly interpolated between the two knots. Quick ways to manipulate many curves at once would be highly useful. Again, perhaps this is something that would be more intuitive to control by selecting segments rather than knots since what we are changing is what is happening between two knots.
- Should twist and radius/scale have independent set of curves so that you can control the interpolation of the two independently? It gives more creative freedom, but means more things to consider and control.
- Since the twist value is one-dimensional you only need one parameter to change it, which is why I think it would be more intuitive rotating the twist angle by a spinner in the command panel rather than rotating it with the transform gizmo in the viewport.
Nevertheless, with this new data channels, not only could modifiers dealing with spline data greatly benefit and open up new ways of modelling, but it can also be used by already great simulation systems like tyFlow, likely leading to better artistic precision relating to angle and size around simulation elements driven by splines.