25
$\begingroup$

I'm interested in creating a material that gives this end result:

Sphere

I'm studying the possibility to use Blender as a tool for scientific education in pure mathematics.

The idea is that the material should be:

  • transparent
  • wireframe visible on the viewing side
  • Wireframe dotted on back side
  • small border around the picture

In the long term, I would like to be able to draw small patches such as the "V" patch here.

Other examples: eg1 eg2

Thanks!

Images from: Discrete Differential Geometry - Keenan Crane

$\endgroup$
  • $\begingroup$ Related blender.stackexchange.com/questions/76109/… $\endgroup$ – batFINGER Nov 24 '19 at 15:18
  • 1
    $\begingroup$ I've edited the title with the intention to make this question easier to find for other users facing a similar challenge. If you don't agree with the edit feel free to revert or improve the edit. $\endgroup$ – Robert Gützkow Nov 24 '19 at 17:00
30
$\begingroup$

This can be accomplished by using Freestyle and Freestyle Edge Marks.

Render torus

Render knot No silhouette

Render knot with silhouette With silhouette

Assuming you already have a model that you would like to render using this style, select it and switch to edit mode (Tab). Deselect all vertices (Alt+A).

Edit mode

Next you need to select all edge loops that you should appear in the rendered image. Edge loops can be select by using the Shift+Alt+LMB shortcut (or RMB if your using right-click select). Once you have all the desired edge loops selected press Ctrl+E and select Mark Freestyle Edge. Alternatively you can use the menu Edge > Mark Freestyle Edge as well.

Edge Marks

Enable Freestyle in the Render Properties.

Enable Freestyle

Switch to the View Layer Properties. First we are going to create the line set for the directly visible parts of the wireframe. Selection By should have Visibility and Edge Types enabled and Visibility should be set to Visible. The only edge type that should be enabled is Edge Mark.

Line set 1

Create an new line set through the plus button and select it. This line set is for the dashed lines. Selection By should have Visibility and Edge Types enabled and Visibility should be set to Hidden. The only edge type that should be enabled is Edge Mark. In the Freestyle Line Style enable Dashed Line and give it the desired spacing.

Line set 2 Dashes

A third line set is needed for the contours of the object. Enable the Contour edge type for this line set. The Silhouette can be enabled as well, if you want the boundary between visible and hidden faces marked with an edge (See example at the beginning). You can give the line set a larger thickness in the Freestyle Line Style if you like.

Line set 3

Now you can add a shader of your choice to your mesh, adjust lighting and camera position and you're done. In my example render I used the Toon Shader for Cycles, a single point light and Ambient Occlusion (World Properties).

$\endgroup$
  • $\begingroup$ Note that the material used in the examples isn't transparent, however that is entirely possibly by using a Mix Shader in combination with the Toon Shader and a Transparent Shader. The illusion of transparency is already given by the wireframe rendering though. $\endgroup$ – Robert Gützkow Nov 24 '19 at 15:53
  • $\begingroup$ The last example in the ref. has a graphic transparency? Eevee, Translucent shader, material Blend Mode set to 'Multiply' seems to imitate that particular look quite well, with a lower-contrast film setting... $\endgroup$ – Robin Betts Nov 24 '19 at 18:53
  • 1
    $\begingroup$ @RobinBetts I meant my example renders. Yes the last image in the question has transparency. $\endgroup$ – Robert Gützkow Nov 24 '19 at 19:14
3
$\begingroup$

Maybe something like this would work? :

enter image description here

The most complicated pieces are:

[A] the Brick * Backfacing shader (shown above; the Hidden/collapsed Principled BSDF is just pure Black Diffuse) that I used to get a sort-of dotted-line effect on the faces of the contour lines that aren't currently facing us, and

[B] the gloopy manifold shape itself, which I made in this case by combining Cylinder and Rounded Cube primitives and re-scaling / vertex-smoothing the result a bit

Everything else is just a simple Transparent or Diffuse Shader, and some kind of primitive element (all Circles, in fact, except for the Text object that contains the V; the Contour lines are Circles extruded along the X axis slightly; the text circle is a Circle filled in with Grid Fill and then with a boundary created by extruding and scaling along normals) with a Shrinkwrap modifier on it.

Freestyle could be used to get a nice, somewhat thicker border on it:

enter image description here

Freestyle only shows up at Render time, so as a limitation, this won't give you a real-time-viewing with boundary line (although with this simple scene Rendering only takes a few seconds).

I also considered two alternatives for getting boundaries:

  1. Normally I would prefer to use the Inverted Hull method (which applies a Solidify modifier and sets the Solidify's Material to have transparent backfacing Faces), since it provides a nice real-time boundary, but it tends to be a bit less clean-looking, and, more importantly, I have not found a way to get the Inverted Hull approach to work when the object's primary material is Transparent or partially Transparent (basic inverted hull is premised on the object's non-Transparent material "blocking" the hull's Transparent material except at the edges, where the Solidify extends a bit beyond the main material and so the Transparent material is not blocked by the non-Transparent one).

  2. If the intention is for students to open this object's .blend file and view it in real-time themselves, then an interesting alternative is to just treat Blender's default active-Object Outliner itself as the Boundary. This outline is normally bright orange, but its color can be changed as outlined in How to change highlight color for icons in outliner panel. There are also 3 options that affect its Thickness in Blender Preferences > Interface > Line Width (but no float/integer-valued setting that I have found, yet, unfortunately).

Lastly, I originally considered an alternative approach: you might also be able to get good results with the Wireframe Modifier and Replace Original disabled (and then applying Transparent/Backfacing-Transparent shaders as appropriate to each object, and to the Wireframe's Material). That's the approach I started with, because it feels as if the Wireframe modifier was born to do this kind of thing, but the Wireframe modifier gives you Contour lines that correspond to your actual geometry, and as a result I found it generally created more contour lines than I wanted. An interesting alternative work-around might be to create a low-poly version of the desired manifold (with only the desired contour lines present), Wireframe that, and then Shrinkwrap it to the high-poly manifold object.

$\endgroup$
  • $\begingroup$ I won't recommend Wireframe Modifier since it create a lot of extra geometry. It could drop the performance a lot. There is an input node call wireframe which is great for this task, but it will render the triangulate face instead the polygon with more than 4 vertices $\endgroup$ – Hikariztw Nov 24 '19 at 13:56

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

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