3

When creating a subdivision surface from a low poly quad mesh, I get a very smooth and rounded surface all over on the subdivision limit surface. However, the limit surface does not pass on the quad mesh vertices. I was wandering if there is any set of parameters or any method to force the limit surface to pass through some specified vertices, while still getting smoothed and rounded everywhere. I tried playing with the Crease settings on some edges, and with the Loop Edge duplication, but the result is always a loss of smoothness and rounding.

Here is my low-poly mesh: 1

Here is the subdivision limit surface: 2

As you can see, the limit surface volume has shrank to the inside of the control mesh. I would like to force the control mesh vertices placement on the limit surface.

Is this possible with Subdivision modifier, or do I need something else?

Many thanks in advance :)

  • Hello and welcome, is there any reason or can you explain the issue that this is causing to you? The more info you can provide, the better for other users to help you. – Emir Jan 09 '24 at 16:16
  • Hello Emir, the reason I'm asking this is because I need my geometry to go though some specific vertices of the control mesh. This is a domain modeling constraint on the application I'm building. I would like my final surface to be smooth everywhere, but to still respect the control vertices. The reason I'm using a subdivision modifier is because I very mush like the modeling ease of use and the quality of the final result. – José António Ferreira Calvário Jan 09 '24 at 16:24
  • A probably disappointed answer... Does this answer your question? Why does the Subdivision Modifier leave a Gap between Original and Final Shape? – Emir Jan 09 '24 at 16:50
  • Thank you Emir for the link. It does provide a reasonable explanation to the problem. – José António Ferreira Calvário Jan 09 '24 at 17:04
  • If you need final surface to be touching your control points then subdivision surface sounds like the wrong tool. You should be using something like NURBs surfaces on a CAD package – Duarte Farrajota Ramos Jan 09 '24 at 23:49
  • @DuarteFarrajotaRamos I have very limited experience with NURBS, went through the theory once… To my understanding there are no settings that make NURBS curves/surfaces go through the points defining them? – Markus von Broady Jan 10 '24 at 10:12
  • Hi Duarte, I'm using NURBS on other projects, and yes there are ways to force a NURBS surface to go through specific positions. But on this specific project I need to use a SubDiv because it allows for more modeling control and freedom than a NURBS system. – José António Ferreira Calvário Jan 10 '24 at 10:16
  • 1
    @MarkusvonBroady True, now that you mention NURBs surfaces do conform less then I expected, but depending on the modelling technique, if you veer more towards lofting, and ruled surfaces, they do conform to defining bounds quite closely – Duarte Farrajota Ramos Jan 10 '24 at 10:56
  • Marking an edge as crease will prevent subdivision modifier from yoinking it out of position. It can be used to keep the key outlines constant while smoothing everything else. – GaleRazorwind Jan 11 '24 at 21:01

2 Answers2

3

I don't have the time or energy for a full answer, but this won't fit into a comment, and is better than nothing, I guess. The behavior you want is probably how beziers with auto handles work:

You can control the smoothing by scaling the handles, that is, moving them towards or away from the point they belong to:

Question is, how to apply this behavior for a 3D mesh? I'll outline the algorithm, that I think can work:

  1. Assume quad-based manifold topology for simplicity. Perhaps the algorithm could be improved to support triangles and n-gons…
  2. Subdivide input mesh, using simple subdivision.
  3. For each face of unsubdivided input mesh, predict where the intermediary vertices will be using linear interpolation between the vertices and find the indices of those vertices using the "sample nearest" node (that's why the mesh has to be manifold because with overlapping geometry you could have 2 vertices at the same place).
  4. Walk through the mesh, using the Repeat Zone, in order to separate loops of edges, and then convert them to curves.
  5. Subdivide the curves with same resolution as in p. 1.
  6. Convert the unsubdivided copy of curves to bezier, set spline handles to AUTO, adjust handles if needed.
  7. Set bezier spline resolution to match the topology (resolution) of the subdivided curves.
  8. Convert the beziers to mesh and loft it, by spawning 1×1 grids, subdivided with the same resolution as in p. 1., and moving the points of the grids by taking the found indices in p. 2., from them, finding the points of subdivided curves (which is easy because they have the same position), and then using the indices of those points, reading the position of the bezier points with same indices.
  9. Merge by Distance.

I haven't tested it, so maybe I'm missing something, it's an elaborate setup, and perhaps you want to test something different, e.g. a simulation that applies subdivision surface on original geometry, checks how the points moved, based on that move these points along normals forward/backward, and try to subdivide again - might give you a good enough result…

Markus von Broady
  • 36,563
  • 3
  • 30
  • 99
3

The slow solution

As mentioned in my other answer, here's the easier way, but slower. I use a simulation zone, but a repeat zone can be used instead...

Sorry for a big screenshot, but Blender designers conspire against my vertical node trees...

The adjustment could be accelerated by making the offset depend on the frame number / loop index, or on the last distance to desired position.

Here's the result:

Markus von Broady
  • 36,563
  • 3
  • 30
  • 99
  • Wow... awesome work! Being completely new to Blender I would not implement this algorithm using that Nodes interface. Actually, I'm not working inside blender, I'm implementing my own application that uses the same subdivision API (OpenSubdiv) used by Blender. So, I will implement this algorithm by code using the good old C++. But many thanks for the proof of concept. It really looks awesome! – José António Ferreira Calvário Jan 10 '24 at 09:41