14
$\begingroup$

I am trying to understand why meshes that are smoothed in 3D studio (Modifiers/Smoother) end up having the same amount of vertices/faces before or after that process, as well as the exact same geometry.

In the following example, both meshes have 32 vertices and 60 faces.

enter image description here

enter image description here

Although I have experience working with programming (c++ and c#), I am quite a beginner with computer graphics. Thus my expectation was that the smoothed look of a smoothed mesh would require additional vertices, i.e. subdivision of triangles, in order to end up having a more detailed final mesh. However, that seems to be not the case.

Therefore I ask:

1) how is the smoothing possible without increasing the detailing of the mesh geometry?

2) does the smoothing at least increase the memory allocated/used for storing the new mesh in comparison to the original one?

Explanations are super welcome, but references (academic or not) are also appreciated.

$\endgroup$
4
  • $\begingroup$ Not super experienced here either but I suppose you could be using a different shader in one. Lambert's would look like the one on the right. But gourands would average them and make it appear smoother. prosjekt.ffi.no/unik-4660/lectures04/chapters/jpgfiles/… $\endgroup$ Nov 14, 2015 at 4:07
  • 1
    $\begingroup$ Thanks for your comment! Quite frankly, the only thing I did was to apply the Smoother modifier. There was no added shader before and I did not add any shader after. $\endgroup$
    – Louis15
    Nov 14, 2015 at 4:09
  • $\begingroup$ The historical terms are "that's the difference between flat and gouraud's shading". In practice this relates to normals like explained by joojaa $\endgroup$
    – v.oddou
    Mar 24, 2016 at 5:17
  • $\begingroup$ What software did you use in the screenshot? THX:) $\endgroup$
    – xyz
    Aug 7, 2016 at 2:50

2 Answers 2

16
$\begingroup$

Smooth in this case just makes the surface normals at vertices point the same way, when interpolated it looks smooth. Meshsmooth would add vertices.

1) how is the smoothing possible without increasing the detailing of the mesh geometry?

Human eyes cant actually see curvature except on the edges of objects. All they can do is approximate the smoothness and process the gradient slope. So having a continuous field does give a air of smoothness. The eye however is extremely sensitive to abrupt changes in color, and interprets that as a hard crease.

By interpolating the vertex normals your surface will get the appearance of smooth flowing. Since this normal is used to calculate the final reflected color you get a smooth color field.

Flat shaded vs smooth shaded

Image 1: a flat shaded normal versus the normals of a smooth interplation. The black normal's lie on a vertex. The colored ones are interpolated.

There is nothing that says we need to do a linear interpolation. In fact by perturbing the normals we can cause the flat surface to change appearance. This is how bump mapping and normal mapping works. The effect can be convincing unless the surfaces edge plays a too big part in which place the illusion breaks.

enter image description here

Image 2: a flat shaded surface (back), Smooth shaded (middle) and a mapped smooth normal. The illusion of a wavy surface breaks because the edge plays so prominent part in the image, you could instead increase the normals

2) does the smoothing at least increase the memory allocated

Hard to say definitive things about the underlying graphics engine. The normals need to be emitted to the graphics card anyway, most likely this data is cached, but could be calculated on the fly (in both cases).

Since Max uses smoothing groups it seems to me that memory usage is constant regardless. Hard to say, even if its not cached then it wouldn't make a big difference. It makes the shader tiny a bit more complicated, but only just most likely this complexity is present use it or not.

$\endgroup$
5
  • $\begingroup$ Great answer! That's exactly what I was looking for: a conceptual explanation that didn't leave crucial details out but was still clear and direct to the point. Many thanks $\endgroup$
    – Louis15
    Nov 16, 2015 at 0:47
  • 3
    $\begingroup$ " The eye however is extremely sensitive to abrupt changes in color, and interprets that as a hard crease." Actually the human visual system is very good at detecting changes in the derivative of the shading. The shading can be continuous but if there are discontinuities in the rate of change as in this image these can be surprisingly noticeable. Search for Mach band effect. $\endgroup$
    – Simon F
    Nov 16, 2015 at 10:57
  • 1
    $\begingroup$ @SimonF thats why they see a crease, because they derive it edge detection and all that. But the human brain does not really eveluate the gradient flow 2 smooths are allmost equal to most humans (theres no second derviate sensing for example). So having smooth sphere is smooth, even if the normals do not behave entirely spherically just as long as they are smooth. Thets why we get away with the trick. Very few surfaces actually behave this way. $\endgroup$
    – joojaa
    Nov 16, 2015 at 11:59
  • $\begingroup$ "(theres no second derviate sensing for example)" I just checked in Glassner's "Principles of Digital Image Synthesis" (Volume 1 page 29) ... and now I am more confused than ever. $\endgroup$
    – Simon F
    Nov 16, 2015 at 12:41
  • $\begingroup$ @SimonF You may be confused about the reflections that are naturally one derivative lower than what the surface is. Thus a human can under certain conditions sense the second derivative. But the point is rather that humans can see creases, but they don't make meaningful difference between all different changes, the fact that a reflection is slightly off or in wrong direction isnt automatically apparent to a human. Without deeper analysis. Just as long as there's no abrupt change is for the most part good enough in many circumstances. We should continue this in the chat room though $\endgroup$
    – joojaa
    Nov 16, 2015 at 12:49
1
$\begingroup$

I can see two ways of doing "smoothing". The first one is smoothing what's mostly related to the appearance (in your case the normals). The other way is smoothing the geometry itself.

In the first case you usually update the normals based on the neighbours. Say $\mathcal{M}$ is a mesh, $T$ is a triangle in $T$ and $n(T)$ is the normal at $T$. One dumb way of smoothing it could be simply

$$ \begin{array}{l} n(T) \leftarrow \frac{1}{|\mathcal{N}(T)|}\left(n(T) + \sum_{Q \in \mathcal{N}(T)} n(Q) \right) \\ n(T) \leftarrow n(T) / n(T).length() \end{array} $$

Here $\mathcal{N}(T)$ represent the list of triangles adjacent to $T$. The pair of equations as you can see don't really change the vertex count, the same argument could be applied to vertex normals. Essentially you don't delete or add anything you just adjust values.

The second case is literally smoothing the geometry, which implies moving vertices around so you don't have sudden jumps in curvature. A couple of know examples are laplacian smoothing and taubin smoothing, both have similar equations to the first case I described.

If you start removing vertices this is usually called decimation/simplification, if you add vertices is subdivision. The smoothing in this case is kind of side effect really, i.e. when you render the mesh it might look smoother. But the purpose of decimating or subdividing is usually removing/adding of details (like LOD).

By the way... the terminology I'm using is standard in Mesh Processing (smoothing, decimation and subdivision are well defined in this context and this leads to the content of my answer).

$\endgroup$

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge that you have read and understand our privacy policy and code of conduct.

Not the answer you're looking for? Browse other questions tagged or ask your own question.