Further 3D modelling techniques with python

Part 2: Advanced Techniques in Erythrocyte Modeling

Recap of Part 1

In Part 1 of this series, we delved into the fascinating world of erythrocyte modeling. We explored the mathematical representation of erythrocytes using signed distance functions (SDFs) and highlighted the elegance of the Skalak model. We discussed how to embrace the rotational symmetry of erythrocytes, create a 2D SDF, and revolve it to obtain a 3D model.

Introducing Other Techniques

Now, in Part 2, we'll build upon the foundation we've established and explore other techniques for erythrocyte modeling. Let's start by introducing some Python code with small adjustments to our previous method:

from sdf import *

diameter = 7.6

def ery(d=diameter, steps=100):
    c0 = 0.01384083
    c1 = 0.2842917
    c2 = 0.01306932
    x = np.linspace(-1, 1, steps)
    z2 = 0.86**2 * (1 - x**2) * (c0 + c1*x**2 + c2*x**4)
    z = np.sqrt(z2)
    points = np.concatenate((np.stack((x,z), axis=-1), np.stack((x,-z), axis=-1)[-2:0:-1])) * d/2
    return polygon(points)

f = ery().revolve()

Modeling Non-Uniform Erythrocytes

While the Skalak model provides an excellent representation of typical erythrocytes, real-life erythrocytes often exhibit a degree of non-uniformity in their shape. This variability can arise from various factors, including mechanical stress, disease conditions, or environmental influences. In Part 2, we'll explore how to model these non-uniform erythrocytes.

Introducing the bend_linear Function

To simulate the deformations and non-uniformities that erythrocytes may experience, we'll use the bend_linear function. This function allows us to introduce bends and deformations to our erythrocyte model. Here's how it works:

offset = 0.2  # This reduces artefacts at the edges of our model
f = f.bend_linear(-X * diameter/2 - offset, X * diameter/2 + offset, 2*Z, lambda x: 2 * np.sqrt(x - x**2) - 0.5)

The bend_linear function takes several arguments:

Here is the result:

A 3D model of the non-uniform erythrocyte with a deformation in the x-axis introduced using the bend_linear function.

Additionally, to account for non-uniformities in the y-axis, we can employ the bend_linear function with a linear function along the y-axis to add some asymmetry to the model:

f = f.bend_linear(-Y * diameter/2 - offset, Y * diameter/2 + offset, Z, lambda x: x)

Now we should see the following:

A 3D model of the non-uniform erythrocyte with deformations in both x-axis and y-axis.

Exporting the Model

Exporting the model is straightforward. You can use a simple line of code to save your model in STL format:

f.save('ery_x_y.stl')

We've covered some techniques for modeling non-uniform erythrocytes and demonstrated how to export our models for various applications. I encourage you to try out these modelling approaches for example by modeling special forms of erythrocytes, such as spherocytes. Happy modeling! 🩸