8
$\begingroup$

I would like to use Blender to render pictures of atomic orbitals like in the following picture

enter image description here

or like in this video. This seems to need some light-emitting volume whose intensity is described by some formulas.

Which would be the smartest approach for this problem?

$\endgroup$
7
$\begingroup$

You can use an Emission shader for the Volume socket of your Material output node, and give it a volumetric texture.

It's pretty easy for a 1s orbital, (n,l,m) = (1,0,0). (spherical symmetry, monotonic decay: it's not actually exponential in my example below):

enter image description here

Create a sphere, and assign a material to it like the one in the picture.

  • The first three nodes to the left (Geometry, Object Info and Vector Math>Subtract) will output a vector (x-x₀, y-y₀, z-z₀) for each x,y,z point in the sphere's volume, where x₀,y₀,z₀ is the pivot point of the sphere. The following node Vector Mapping can be used to scale the texture. These are the cartesian coordinates that will be used to define a scalar function, like a wavefunction.

  • The last four nodes to the right ("Math>Absolute, Color Ramp, Emission, Material output) will take the output of your scalar function and assign it to the volumetric emission, colored according to a color map (I've taken the absolute value, you might want to take the 2nd power, or to have different colors for the positive and negative values).

  • In the middle, you will need your actual scalar function. It can be any node, or group of nodes, that takes a Vector (blue socket) as input, and outputs a scalar (grey socket). In my example, I've used a Gradient texture node. Unfortunately, complex functions are not built-in in blender. You can, however, create a Script node that implements the wavefunctions (you will probably need numpy.polynomial.legendre)*

* I've never done this before, so I can't guarantee it's possible to just make python do the math. If it's possible, I think this wiki page is a good starting point.

$\endgroup$
  • $\begingroup$ I have little experience in creating custom nodes in Blender, so I haven't given details on that. I can't seem to find much about the Node class (I don't want to create an OSL node, just a python node). If I have some spare time later, I'll try to integrate that part of the answer. $\endgroup$ – Nicola Sap Mar 15 '18 at 11:28
  • $\begingroup$ Excellent, this is just what I needed! Thank you very much $\endgroup$ – Jjm Mar 15 '18 at 12:44
  • $\begingroup$ Here you may see a finished example tungsteno.io/post/vis-hydrogen_wavefunction_111 together with the script generating this video github.com/TungstenHub/tngt-blender/blob/master/scripts/… Thanks again!! $\endgroup$ – Jjm May 7 '18 at 11:45

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.