The Huichols call peyote, the sacred hallucinogenic cactus, "Hikuri" or Tatei Hikuri", which can be translated as "Our Mother Hikuri". The hikuri&fractal-lookin' geometry in the background is completely made out of code inside my 3D IDE. Here is that code: struct vec3{ float x, y, z; }; struct vec4{ float x, y, z, w; }; struct mat3{ float m00, m01, m02, m10, m11, m12, m20, m21, m22; }; vec3 toVec3(vector v) { return vec3(v[0], v[1], v[2]); } mat3 operator__mul(mat3 A, mat3 B) { return mat3(A.m00B.m00+A.m01B.m10+A.m02B.m20, A.m00B.m01+A.m01B.m11+A.m02B.m21, A.m00B.m02+A.m01B.m12+A.m02B.m22, A.m10B.m00+A.m11B.m10+A.m12B.m20, A.m10B.m01+A.m11B.m11+A.m12B.m21, A.m10B.m02+A.m11B.m12+A.m12B.m22, A.m20B.m00+A.m21B.m10+A.m22B.m20, A.m20B.m01+A.m21B.m11+A.m22B.m21, A.m20B.m02+A.m21B.m12+A.m22*B.m22); }
vec4 operator__add(vec4 a, vec4 b) { return vec4(a.x+b.x, a.y+b.y, a.z+b.z, a.w+b.w); } vec3 operator__add(vec3 a, vec3 b) { return vec3(a.x+b.x, a.y+b.y, a.z+b.z); } vec3 operator__mul(float val, vec3 v){ return vec3(valv.x, valv.y, valv.z); } vec3 operator__mul(vec3 v, mat3 m){ return vec3(v.xm.m00+v.ym.m01+v.zm.m02, v.xm.m10+v.ym.m11+v.zm.m12, v.xm.m20+v.ym.m21+v.zm.m22); }
// Return rotation matrix for rotating around vector v by angle mat3 rotationMatrix3(vec3 v, float angle) { float c = cos(radians(angle)), s = sin(radians(angle));
return mat3(c+(1.0-c)*v.x*v.x, (1.0-c)*v.x*v.y-s*v.z, (1.0-c)*v.x*v.z+s*v.y,
(1.0-c)*v.x*v.y+s*v.z, c+(1.0-c)*v.y*v.y, (1.0-c)*v.y*v.z-s*v.x,
(1.0-c)*v.x*v.z-s*v.y, (1.0-c)*v.y*v.z+s*v.x, c+(1.0-c)*v.z*v.z);
}
mat3 rotationMatrixXYZ(vec3 v) { return rotationMatrix3(vec3(1.0,0.0,0.0), v.x)*rotationMatrix3(vec3(0.0,1.0,0.0), v.y)*rotationMatrix3(vec3(0.0,0.0,1.0), v.z); }
// Return rotation matrix for rotating around vector v by angle mat4 rotationMatrix(vec3 v, float angle) { float c = cos(radians(angle)), s = sin(radians(angle));
return mat4(c+(1.0-c)*v.x*v.x, (1.0-c)*v.x*v.y-s*v.z, (1.0-c)*v.x*v.z+s*v.y, 0.0,
(1.0-c)*v.x*v.y+s*v.z, c+(1.0-c)*v.y*v.y, (1.0-c)*v.y*v.z-s*v.x, 0.0,
(1.0-c)*v.x*v.z-s*v.y, (1.0-c)*v.y*v.z+s*v.x, c+(1.0-c)*v.z*v.z, 0.0,
0.0, 0.0, 0.0, 1.0);
}
float opS( float d1, float d2 ){ return max(-d2,d1); } vector opU( vector d1, vector d2 ){ return (d1[0]<d2[0]) ? d1 : d2; } vector opRep( vector p, vector c ){ return mod(p,c)-0.5*c; }
float length(vec3 v) { return length(vector(v.x,v.y,v.z)); }
vec3 powN1(vec3 z, float r, float dr, float Power) { // extract polar coordinates float theta = acos(z.z/r); float phi = atan2(z.y,z.x); dr = pow( r, Power-1.0)Powerdr + 1.0;
// scale and rotate the point
float zr = pow( r,Power);
theta = theta*Power;
phi = phi*Power;
// convert back to cartesian coordinates
return zr*vec3(sin(theta)*cos(phi), sin(phi)*sin(theta), cos(theta));
}
vec3 powN2(vec3 z, float zr0, float dr, float Power) { float zo0 = asin( z.z/zr0 ); float zi0 = atan2( z.y,z.x ); float zr = pow( zr0, Power-1.0 ); float zo = zo0 * Power; float zi = zi0 * Power; dr = zrdrPower + 1.0; zr = zr0; return zrvec3( cos(zo)*cos(zi), cos(zo)*sin(zi), sin(zo) ); }
shader Vectron( vector translate = 0, vector RotVector=vector(1,1,1), float Power=8, float RotAngle=0, float Bailout=6, int Iterations=13, int AlternateVersion=1, int Julia=0, int ColorIterations=12,
vector JuliaC=0,
output _sdf out = _SDFDEF) { mat3 rot = rotationMatrix3(toVec3(normalize(RotVector)), RotAngle); vec3 pos=toVec3(P); vec3 z=pos; vec4 orbitTrap=vec4(0,0,0,0); float r; float dr=1.0; int i=0; r=length(z); while(r<Bailout && (i<Iterations)) { if (AlternateVersion) { z=powN2(z,r,dr,Power); } else { z=powN1(z,r,dr,Power); } z=z+toVec3(Julia ? JuliaC : P); r=length(z); z*=rot; //if (i<ColorIterations) orbitTrap = min(orbitTrap, abs(vec4(z.x,z.y,z.z,rr))); i++; } //if((type==1) && r<Bailout) return 0.0; out.dist = 0.5log(r)*r/dr;
}. Animated 3D Render, GIF, 800 x 800pixels.