Wrapping Gyroids lattices around Objects.
VEX code for a gyroid in a SDF volume wrangle:
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);
}
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);
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