Wrapping Lattices around Objects

calendar_today

21.09.2026

label

Modeling

mouse

Houdini 22.0

Description

Wrapping Gyroids lattices around Objects.

1 Code for a Gyroid

VEX code for a gyroid in a SDF volume wrangle:

VEX
        vector s = chv('scale');
float t = chf('thickness');

if(f@surface < 0.0){
    int pr;
    vector st;
    float dist = xyzdist(1, v@P, pr, st);
    
    vector uvw = set(dist, st[0], st[1]);
    float x, y, z;
    assign(x, y, z, uvw * s);
    
    float gyroid = sin(x) * cos(y) + sin(y) * cos(z) + sin(z) * cos(x);

    f@surface += (gyroid + t);
}
    

2 Code for various Lattice Types

VEX
        float freq = chf('frequency');
int lattice = chi('lattice');
int surface = chi('surface');
float thick = chf('thickness');


function float lattice(vector P; int type_lattice; int type_surface; float a; float thickness)
{
    float x = P.x;
    float y = P.y;
    float z = P.z;
    float d = 0.0;

    if (type_lattice == 0) {
        // Gyroid
        d = cos(x / a) * sin(y / a) + cos(y / a) * sin(z / a) + cos(z / a) * sin(x / a);
        if (type_surface == 1) {
            d = 2.75 * (sin(2.0 * x / a) * sin(z / a) * cos(y / a) + sin(2.0 * y / a) * sin(x / a) * cos(z / a) + sin(2.0 * z / a) * sin(y / a) * cos(x / a)) - (cos(2.0 * x / a) * cos(2.0 * y / a) + cos(2.0 * y / a) * cos(2.0 * z / a) + cos(2.0 * z / a) * cos(2.0 * x / a)) - 0.95;
            d = abs(d) - thickness;
        }
    } else if (type_lattice == 1) {
        // Schwarz P
        d = cos(x / a) + cos(y / a) + cos(z / a);
        if (type_surface == 1) {
            d = 0.5 * (cos(x / a) * cos(y / a) + cos(y / a) * cos(z / a) + cos(z / a) * cos(x / a)) + 0.2 * (cos(2.0 * x / a) + cos(2.0 * y / a) + cos(2.0 * z / a));
            d = abs(d) - thickness;
        }
    } else if (type_lattice == 2) {
        // Schwarz D
        d = sin(x / a) * sin(y / a) * sin(z / a) + sin(x / a) * cos(y / a) * cos(z / a) + cos(x / a) * sin(y / a) * cos(z / a) + cos(x / a) * cos(y / a) * sin(z / a);
        if (type_surface == 1) {
            d = 0.5 * (sin(x / a) * sin(y / a) + sin(y / a) * sin(z / a) + sin(x / a) * sin(z / a)) + 0.5 * cos(x / a) * cos(y / a) * cos(z / a);
            d = abs(d) - thickness;
        }
    } else if (type_lattice == 3) {
        // Nevius
        d = 3.0 * (cos(x / a) + cos(y / a) + cos(z / a)) + 4.0 * cos(x / a) * cos(y / a) * cos(z / a);
        if (type_surface == 1) {
            d = abs(d) - thickness;
        }
    } else if (type_lattice == 4) {
        // Lidinoid
        d = 0.5 * (sin(2.0 * x / a) * cos(y / a) * sin(z / a) + sin(2.0 * y / a) * cos(z / a) * sin(x / a) + sin(2.0 * z / a) * cos(x / a) * sin(y / a)) - 0.5 * (cos(2.0 * x / a) * cos(2.0 * y / a) + cos(2.0 * y / a) * cos(2.0 * z / a) + cos(2.0 * z / a) * cos(2.0 * x / a)) + 0.15;
        if (type_surface == 1) {
            d = abs(d) - thickness;
        }
    } else if (type_lattice == 5) {
        // Fischer Koch S
        d = cos(2.0 * x / a) * sin(y / a) * cos(z / a) + cos(x / a) * cos(2.0 * y / a) * sin(z / a) + sin(x / a) * cos(y / a) * cos(2.0 * z / a);
        if (type_surface == 1) {
            d = abs(d) - thickness;
        }
    } else if (type_lattice == 6) {
        // Fischer Koch Cs
        d = cos(2.0 * x / a) + cos(2.0 * y / a) + cos(2.0 * z / a) + 2.0 * (sin(3.0 * x / a) * sin(2.0 * y / a) * cos(z / a) + cos(x / a) * sin(3.0 * y / a) * sin(2.0 * z / a) + sin(2.0 * x / a) * cos(y / a) * sin(3.0 * z / a)) + 2.0 * (sin(2.0 * x / a) * cos(3.0 * y / a) * sin(z / a) + sin(x / a) * sin(2.0 * y / a) * cos(3.0 * z / a) + cos(3.0 * x / a) * sin(y / a) * sin(2.0 * z / a));
        if (type_surface == 1) {
            d = abs(d) - thickness;
        }
    } else if (type_lattice == 7) {
        // Fischer Koch Y
        d = cos(x / a) * cos(y / a) * cos(z / a) + sin(x / a) * sin(y / a) * sin(z / a) + sin(2.0 * x / a) * sin(y / a) + sin(2.0 * y / a) * sin(z / a) + sin(x / a) * sin(2.0 * z / a) + sin(2.0 * x / a) * cos(z / a) + cos(x / a) * sin(2.0 * y / a) + cos(y / a) * sin(2.0 * z / a);
        if (type_surface == 1) {
            d = abs(d) - thickness;
        }
    } else if (type_lattice == 8) {
        // Fischer Koch Cy
        d = -sin(x / a) * sin(y / a) * sin(z / a) + sin(2.0 * x / a) * sin(y / a) + sin(2.0 * y / a) * sin(z / a) + sin(x / a) * sin(2.0 * z / a) - cos(x / a) * cos(y / a) * cos(z / a) + sin(2.0 * x / a) * cos(z / a) + cos(x / a) * sin(2.0 * y / a) + cos(y / a) * sin(2.0 * z / a);
        if (type_surface == 1) {
            d = abs(d) - thickness;
        }
    } else if (type_lattice == 9) {
        // FRD
        d = 4.0 * cos(x / a) * cos(y / a) * cos(z / a) - (cos(2.0 * x / a) * cos(2.0 * y / a) + cos(2.0 * x / a) * cos(2.0 * z / a) + cos(2.0 * y / a) * cos(2.0 * z / a));
        if (type_surface == 1) {
            d = abs(d) - thickness;
        }
    } else if (type_lattice == 10) {
        // IWP
        d = 2.0 * (cos(x / a) * cos(y / a) + cos(y / a) * cos(z / a) + cos(z / a) * cos(x / a)) - (cos(2.0 * x / a) + cos(2.0 * y / a) + cos(2.0 * z / a));
        if (type_surface == 1) {
            d = abs(d) - thickness;
        }
    } else if (type_lattice == 11) {
        // Split P
        d = 1.1 * (sin(2.0 * x / a) * sin(z / a) * cos(y / a) + sin(2.0 * y / a) * sin(x / a) * cos(z / a) + sin(2.0 * z / a) * sin(y / a) * cos(x / a)) - 0.2 * (cos(2.0 * x / a) * cos(2.0 * y / a) + cos(2.0 * y / a) * cos(2.0 * z / a) + cos(2.0 * z / a) * cos(2.0 * x / a)) - 0.4 * (cos(2.0 * x / a) + cos(2.0 * y / a) + cos(2.0 * z / a)) - 0.3;
        if (type_surface == 1) {
            d = abs(d) - thickness;
        }
    } else if (type_lattice == 12) {
        // Karcher K
        d = 0.3 * (cos(x / a) + cos(y / a) + cos(z / a)) + 0.3 * (cos(x / a) * cos(y / a) + cos(y / a) * cos(z / a) + cos(z / a) * cos(x / a)) - 0.4 * (cos(2.0 * x / a) + cos(2.0 * y / a) + cos(2.0 * z / a)) + 0.2;
        if (type_surface == 1) {
            d = abs(d) - thickness;
        }
    } else if (type_lattice == 13) {
        // G Prime
        d = sin(2.0 * x / a) * cos(y / a) * sin(z / a) + sin(2.0 * y / a) * cos(z / a) * sin(x / a) + sin(2.0 * z / a) * cos(x / a) * sin(y / a) + 0.32;
        if (type_surface == 1) {
            d = abs(d) - thickness;
        }
    }

    return d;
}

f@d = lattice(v@P, lattice, surface, freq, thick);
    

3 Lattice Types

Gyroid
Schwarz P
Schwarz D
Nevius
Lidinoid
Fischer Koch S
Fischer Koch Cs
Fischer Koch Y
Fischer Koch Cy
FRD
IWP
Split P
Karcher K
G Prime

download

Downloads

link

Related articles

favorite

382

label

Modeling

Adaptive Resampling of Curves

favorite

464

label

Modeling

Applying Scales to Mesh Surfaces

favorite

437

label

Modeling

Approximating subdivision surfaces

favorite

64

label

Modeling

Copying Barb Wire along Curve

favorite

376

label

Modeling

Blending COPs SDFs into 3D Volume

favorite

497

label

Modeling

Branching Subdivision Curves