31
$\begingroup$

If you've ever seen anything like Body Worlds or the Bodies: The Exhibition you'll know how they dissect individual organ systems and put them on display with a technique known as plastination. For instance, plastic can be pumped through the circulatory system such that when it hardens, acid can be used to dissolve the rest leaving the underlying network of blood vessels underneath.

The blood vessel network of the human face

I'm looking forward to modeling something as intricate as this, but my first attempts have failed. The initial idea was to generate a tree structure with the Sapling Tree add-on. Then I could do a Boolean modifier with my model, and touch up the end points individually by extruding to follow the contours of the model's surface. However, the Boolean modifier fails in this example.

Do I have to code this procedurally with a Python script or is there some other method I should try first?

$\endgroup$
  • 3
    $\begingroup$ Maybe you can turn to Animation Nodes. Someone already did similar things llike that. See here $\endgroup$ – Leon Cheung Aug 19 '16 at 6:17
  • 1
    $\begingroup$ @LeonCheung I was looking for this image online ever since I saw it in an issue of the 3D Artists magazine, but google wouldn't spit out the right thread. Thanks for posting this! $\endgroup$ – aliasguru Aug 19 '16 at 7:07
  • $\begingroup$ @aliasguru Haha, nice that you finally got it. :D $\endgroup$ – Leon Cheung Aug 19 '16 at 10:40
  • $\begingroup$ Could you better exaplain the part where you introduced the Boolean modifier? What would be the scope? $\endgroup$ – Carlo Aug 22 '16 at 21:03
28
$\begingroup$

This is a nice case of how node based geometry generation can create crazy stuff. First off, you'll never guess who this is in the following Blend file:

Suzi Vessel

You will need the latest iteration of Animation Nodes, which you can currently get from here: https://github.com/JacquesLucke/animation_nodes Click Clone or Download and choose download .ZIP, then install as usual.

I've put a lot of comments directly into the node tree to explain what each section is doing, so I won't repeat all of it here. Just the basic concept: I'm using a bunch of points, generated by a Vector Wiggle node in a loop, plus an empty which defines the area where most vessels shall grow from, plus a few parameters to control all the effect. The magic nodes that enable it is the BVH nodes, found in the Node Tree under Shift + A -> KD & BVH Tree. Those nodes allow you to split up a mesh into a BVH Tree, and then calculate distances, find closest points, project points back onto the mesh, and so on.

I'm then generating random points using Vector Wiggle, and then comparing their location to the BVH Tree. There is a node which can check if a point is inside or outside the mesh, and in conjunction with the switch node and the Find nearest surface point node (kind of a Shrinkwrap for Animation Nodes) I can pull back 3D points which went out of the mesh back onto the mesh surface.

There was an issue which I was then fighting for a long time, which is the nature of Shrinkwrapping: Two Spline Points could get disclocated quite far from each other this way. I dunno if it is a glitch or the nature of math, but my approach to it was to resample the whole spline again in another loop, and reproject the stray areas again. This way, the spline would adaptively get closer to the volume / surface, and the shape becomes readable.

For the beveling of the Spline I used Blenders standard tools, so a Spline Curve to define the profile, and the bevel parameters in the Object data tab.

For more info, please study the Blend File, and if you find improvements, please let me knoe.

Important: For performance reasons, Auto Execute is turned OFF in the file, you'll need to either change a property or click Execute Node Tree explicitly

EDIT

Here is a few screenshots of areas of the node tree:

Main Program, with a single vessel in 3D:

only one vessel

Run on a Default cube, the controller in a corner:

Cube vesseled

setting first parameters:

enter image description here

The Vector Wiggle in action, creating the main points of the spline, which will be edited later again:

enter image description here

preparing the spline for resampling, and then smoothing it out:

enter image description here

the resampling sub-loop in detail:

enter image description here

$\endgroup$
15
+300
$\begingroup$

I once created a blender addon as a part of my bachelor thesis about neuronal structures, which computes spanning trees using particle systems. You could use this to generate 3-dimensional tree structures that also follow anatomical principles :)

I made a tutorial video on how to use it, and you can download it from Github. (Direct download link)

Basically, you create a particle system, whose points are used as nodes in a spanning tree. The addon can also add thickness to the tree depending the distance to the root.

You should also play with the balancing factor. Lower values give more random trees, larger values looks more oriented towards the root.

Here's an example image:

Minimum spanning tree

Edit: Here's an example with a more complex object: Blood vessel suzanne

$\endgroup$
  • $\begingroup$ I need to test this, it looks really cool! $\endgroup$ – aliasguru Aug 24 '16 at 11:34
  • $\begingroup$ @Parkuhur how do you define the boders so that the tree conforms to a defined shape (like the head on the original question)? $\endgroup$ – cegaton Aug 24 '16 at 12:30
  • $\begingroup$ Can you stack a few of this systems on the same mesh? $\endgroup$ – cegaton Aug 24 '16 at 12:50
  • 1
    $\begingroup$ @cegaton That depends on the particle system. You can create the particles inside of the volume of any shape, or on its surface. The resulting tree should generally follow the topology/volume of the object. $\endgroup$ – Parkuhr Aug 24 '16 at 12:58
  • 1
    $\begingroup$ @cegaton You can use multiple particle systems with different distributions, but its not possible to generate multiple trees that divide the same set of points between them. But i guess I could add that feature if there is demand for it. $\endgroup$ – Parkuhr Aug 24 '16 at 13:00

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.