Online parametric tools like vesselmaker.app demonstrated how satisfying it is to dial in vase silhouettes, twisting flutes, and organic pottery ridges in real time. However, web tools export static STL files: you cannot inspect the underlying topology, adapt the geometry for custom socket inserts, or easily modify wall thicknesses for watertight outdoor planters.

VesselMaker 3D was engineered as an open-source, fully procedural studio for Blender 5.x. It generates both ultra-fast continuous Vase Mode vessels and robust Multi-Wall Planters with integrated drainage tubes and matching drip saucers.

Here is how the procedural modeling pipeline was constructed.


1. Monotone Cubic Hermite Silhouette Interpolation

When modeling classical amphora or hourglass curves through user-specified control heights (Base $\to$ Belly $\to$ Neck $\to$ Lip), standard cubic splines often suffer from Runge’s phenomenon—unwanted overshoot where the curve bulges outside user boundaries.

We implemented Monotone Cubic Hermite Interpolation (PCHIP). For each interval between control heights $z_k$ and $z_{k+1}$, slopes are constrained:

$$d_k = \begin{cases} 0, & \text{if } \text{sgn}(\Delta_k) \ne \text{sgn}(\Delta_{k-1}) \\ \frac{3(\Delta_{k-1} + \Delta_k)}{2(\Delta_{k-1} + \Delta_k) + \dots}, & \text{otherwise} \end{cases}$$

This guarantees smooth, tangent-continuous silhouettes without unexpected pinching or bulges:

def pchip_interpolate_radius(z, control_points):
    """Evaluates overshoot-free Monotone Hermite spline at height z."""
    # Computes monotonic tangent slopes preserving local extrema
    # Returns interpolated radius R(z)

2. Horizontal Cross-Sectional Geometry

Every cross-section along the $Z$-axis is sampled across $N = 96$ vertices using algebraic formulas:

      Circle             Squircle (p=4)          Fluted Star
       .---.                 .-----.                 /\  /\
      /     \               /       \               /  \/  \
     |   +   |             |    +    |             |   +    |
      \     /               \       /               \  /\  /
       '---'                 '-----'                 \/  \/
  1. Squircle (Superellipse): Transits continuously from a circle ($p = 2$) to a soft-corner square ($p = 4\dots8$):

    $$|x|^p + |y|^p = r^p \implies r(\theta) = \frac{r}{\left(|\cos\theta|^p + |\sin\theta|^p\right)^{1/p}}$$
  2. Fluted Star: Multi-pointed stars with adjustable sharpness exponent $k_{\text{sharp}}$:

    $$r(\theta) = r_0 \cdot \left( 1 + A \cdot \cos(M \cdot \theta) \right)^{k_{\text{sharp}}}$$

3. Stackable Deform Modifiers: Twist & Axis Bend

Continuous Twist Easing

The cross-section can rotate continuously from base to rim (up to $\pm 720^\circ$). Instead of rigid linear twisting, the rotation angle $\theta_{\text{twist}}(u)$ supports multiple easing functions:

  • Smooth S-Curve: $\theta(u) = \theta_{\text{max}} \cdot \left(3u^2 - 2u^3\right)$
  • Ease In: $\theta(u) = \theta_{\text{max}} \cdot u^2$
  • Ease Out: $\theta(u) = \theta_{\text{max}} \cdot \sqrt{u}$

Axis Bend

To create organic, wind-blown, or leaning vases, the generator shifts cross-section centers along a parabolic displacement curve:

$$\mathbf{C}(z) = \left( d_x \cdot \left(\frac{z}{H}\right)^2, \; d_y \cdot \left(\frac{z}{H}\right)^2, \; z \right)$$

4. Tactile Surface Textures & Smooth Margins

The studio supports 5 surface relief textures:

  1. Vertical / Spiral Flutes: Deep sinusoidal fluting.
  2. Diamond Knurling: Dual-helix intersecting ridges creating crystalline facets.
  3. Clay Throwing Rings: Simulates hand-thrown pottery wheel imperfections with harmonic micro-ripples.
  4. Basket Weave: Tactile interlocking woven texture.
  5. Organic Cellular: Voronoi-inspired cellular displacement.

Margin Fade Transitions

To guarantee clean bed adhesion on the 3D printer and a smooth rim for flower stems, textures fade smoothly to zero at the bottom and top margins using a cosine falloff:

def compute_margin_weight(z, total_height, base_margin=8.0, rim_margin=6.0, fade_len=6.0):
    """Calculates smooth 0.0 to 1.0 texture blending weight."""
    if z < base_margin:
        return 0.0
    elif z < base_margin + fade_len:
        t = (z - base_margin) / fade_len
        return 0.5 * (1.0 - math.cos(math.pi * t))
    elif z > (total_height - rim_margin):
        return 0.0
    elif z > (total_height - rim_margin - fade_len):
        t = (total_height - rim_margin - z) / fade_len
        return 0.5 * (1.0 - math.cos(math.pi * t))
    return 1.0

5. Dual Slicing Architectures: Vase Mode vs Solid Planter

     Vase Mode (Spiralize)              Solid Planter with Drainage
          \           /                      \   \     /   /
           \         /                        \   \   /   /
            \       /                          \   \ /   /
             \     /                            \   |   /  <-- Drainage Sleeve
            +-------+                          +--+ | +--+
            Planar Floor                        Watertight Floor

1. Vase Mode (Spiralize Outer Contour)

  • Single continuous perimeter wall with an open top.
  • The base floor at $z = 0$ is bridged as a clean planar N-gon, ensuring zero air gaps or slicing errors.

2. Solid Shell Mode (Watertight Planter)

  • Dual concentric walls (inner and outer shells) bridged at the top rim by a continuous filleted lip.
  • Tubular Drainage Sleeve: Rather than using boolean subtraction to punch a hole through the floor (which often creates non-manifold zero-thickness walls), the inner shell blends directly into a central cylindrical sleeve connecting the planter basin to the bottom face.

The result is a $100%$ watertight manifold mesh ready for Bambu Studio, OrcaSlicer, or PrusaSlicer.