3
$\begingroup$

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 :)

$\endgroup$
9
  • $\begingroup$ 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. $\endgroup$
    – Emir
    Jan 9 at 16:16
  • $\begingroup$ 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. $\endgroup$ Jan 9 at 16:24
  • $\begingroup$ A probably disappointed answer... Does this answer your question? Why does the Subdivision Modifier leave a Gap between Original and Final Shape? $\endgroup$
    – Emir
    Jan 9 at 16:50
  • $\begingroup$ Thank you Emir for the link. It does provide a reasonable explanation to the problem. $\endgroup$ Jan 9 at 17:04
  • 1
    $\begingroup$ @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 $\endgroup$ Jan 10 at 10:56

2 Answers 2

3
$\begingroup$

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:

$\endgroup$
1
  • $\begingroup$ 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! $\endgroup$ Jan 10 at 9:41
3
$\begingroup$

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…

$\endgroup$
1
  • $\begingroup$ Thank you Markus. I like your final advise about the iterative adjustment along normals. It's reasonably easy to implement and it might work. I will give it a try. $\endgroup$ Jan 9 at 17:06

You must log in to answer this question.

Not the answer you're looking for? Browse other questions tagged .