Cover photo

self, a journey

gm

this is my first Mirror entry, somewhat appropriately titled.

yet, this isn’t really a self-introduction; instead, an entry for rik oostenbroek’s creative contest, “show. (your)self.“ based on the piece “self.

intro

“self, a journey” is a 3-part series of work: ”selfDiscovery”, “selfGrowth“, and “selfFulfillment“.

each part is associated with a specific algorithm; adapted from other creative minds and/or scripted by myself over the course of my explorations in design - adjusted, further developed, and integrated in the past two weeks for this particular journey.

each algorithm corresponds to the idea of each constituent part: in selfDiscovery: feature-aligned quad remeshing in selfGrowth: image-based differential growth in selfFulfillment: space-filling polyhedra: tetrahedra packing these algorithms and their implementations are well documented in the computer graphics field.

a preview of a 3-party journey
a preview of a 3-party journey

each constituent part is not only a progression of self (from discovery to growth and to fulfillment), but also the nature and format of the pieces: from an animated still image (.GIF), to a visualization of dynamic iterations (.MP4), and to a 3D manifestation that could explored in metaverses (.GLB).

in this series, like in many of my past work (whether in the NFT space or not), i seek to not dwell too much on willful form-making or color scheme optioneering; instead, i strive to integrate not only concepts and aesthetics, but also processes and techniques. below you may find brief discussions of each of the three individual pieces, emphasizing how and why they are what they are, as well as the many potential variations and ways to view them, due to the generative nature within all.

part i: selfDiscovery

the journey begins with selfDiscovery. the discovery of self, in turn, initiates with an investigation into the intrinsic properties of what was given: the layered solid color blocks and their most prominent feature - the elegant curvilinear boundaries, an unmistakable signature of rik.

many iterations of the quad remeshing algorithm were performed in order to arrive at an overall outcome that at once respects the complex bounding curves and infill the regions with over 20,000 individual curvature-aware 4-sided cells. the quads without any colors applied are shown on the left below; with this wireframe view, we could truly appreciate the high-quality aspect ratios and how this analysis-design celebrates the initial inputs by accentuating and transcending the characteristic swirls -inherited from the curves and solid color blocks- into entire regions.

left: wireframe view of quad remeshing result; right: initial gradient test
left: wireframe view of quad remeshing result; right: initial gradient test

the color scheme given by rik was turned into gradients made up of 3 color points each, respecting the original strategy yet at the same time accentuating it and expressing the cells. a random noise field is applied to obtain “strips“ of quads, colored identically, such that the flow is further highlighted, as shown in an initial study of the skin/pink color blocks (on the right above).

generated in Rhino + Grasshopper3d, the quantities and densities of the quads are parametrically controlled, while the overall geometries are fully defined and exportable as any vector or standard 3d file formats.

a snippet of the Grasshopper3d canvas and the Rhino viewport
a snippet of the Grasshopper3d canvas and the Rhino viewport

with the flowing color strips animated, the final selfDiscovery:

https://cadmonkey-mirror.s3.amazonaws.com/self/20220917_selfD_4k.mp4?height=3850&width=2750&autoplay=true&loop=true&muted=true

selfDiscovery OpenSea link: opensea.io/assets/ethereum/0x1b0fd0fc8dcedba6390fdd3973c2856e0399f831/11

i found it interesting that although not initially generated based on a flow field, as typical in many generative outputs seen in the space today, the result is reminiscent of that approach. this quality is especially perceptible when we zoom in and crop out regions within the piece where the overall face isn’t the dominant visual cue.

close-ups of various regions
close-ups of various regions

part ii: selfGrowth

growth is the second part of the journey. not unlike the preceding selfDiscovery, this piece reflects the initial constraints and the given characteristics; however, more steps needed to be taken to grow!

first, a distance field is generated based on the proximity of any pixel to any of the boundary curves and the result is stored as a bitmap with brightness values, visualized below on the left. a single continuous curve is then iteratively modified following differential growth principles, based on collision and the aforementioned underlying bitmap. all three of the following variations all went through more than 1,000 iterations to reach their final “resting“ configurations.

a snippet of the Grasshopper3d canvas and the Rhino viewport
a snippet of the Grasshopper3d canvas and the Rhino viewport

the initial curves could be of any type. three primitives are shown here as inputs: a straight line, a circular arc, and a circle. you may see that the curve directionalities are indeed affected by the starting geometry, and the influence is also visible in the final frame of each piece.

iterations 1, 200, 500
iterations 1, 200, 500

https://cadmonkey-mirror.s3.amazonaws.com/self/20220919_selfG_alt_2k.mp4?height=2100&width=3000&autoplay=true&loop=true&muted=true

the color gradient for each of the alternative options above is actually in itself an analysis and visualization of the high fidelity of the differential growth algorithm in response to the underlying brightness value map and distance field. the collision radii at areas closer to the original boundary curves are visibly smaller than other areas.

monochromatic to emphasize the dynamics, the final selfGrowth:

https://cadmonkey-mirror.s3.amazonaws.com/self/20220917_selfG_4k.mp4?height=3850&width=2750&autoplay=true&loop=true&muted=true

selfGrowth OpenSea link: opensea.io/assets/ethereum/0x1b0fd0fc8dcedba6390fdd3973c2856e0399f831/12

a visualization of the final piece as a single continuous curve traversing through space, colored according to the order of appearance:

https://cadmonkey-mirror.s3.amazonaws.com/self/20220919_selfG_single.mp4?height=3850&width=2750&autoplay=true&loop=true&muted=true

part iii: selfFulfillment

last but not least, after discovery and growth, the third and final part of the journey is where the self fulfills.

utilizing the same base image with brightness data produced during selfGrowth, this piece begins with color dependent triangular remeshing and thereby variable dithering of point objects. tetGen, a well-known hight-quality tetrahedral packing library, is then ported into Grasshopper3d, customized, and deployed to obtain a set of polygonal meshes that consist of over 10,000 individual tetrahedrons, each precisely neighboring one another on all four faces, while maintaining the density variation and completely filling up a prescribed extruded square volume.

custom python component porting tetGen library into Grasshopper3d
custom python component porting tetGen library into Grasshopper3d

to further reinforce the original geometries while exhibiting an organic sculptural overall form, meshes are culled based on their distance to the boundary curves of the initial color blocks and then mapped from the initial plane onto a cylinder with variable radii, as shown in the screenshot below.

left: color-based triangular remeshing; right: packed tetrahedra mapped onto cylinder
left: color-based triangular remeshing; right: packed tetrahedra mapped onto cylinder

after the initial coarse mesh is mapped and morphed, vertices and edges of each individual tetrahedron are beveled, transforming each 4-sided polygon with 4 vertices to a 14-sided polygon with 12 vertices. with this transformation, each original face becomes connected to the corresponding face of each of the 4 neighbors - with the opening faces capped, we obtain a clean single closed mesh. finally, with one iteration of catmull-clark subdivision and laplacian smoothing, a refined mesh with closed to half a million faces is generated.

while coloring vertices based on any mapping data is trivial, what makes this workflow more interesting and complete is the fact that a custom texture map is output based on the Grasshopper3d script, which is then applied in Blender to further refine the material quality. the single square .PNG file shown below is referenced into Blender directly without any further adjustments to the UVW mapping!

Blender viewport showing the base color input as an image texture
Blender viewport showing the base color input as an image texture

the final selfFulfillment, visualized as a video:

https://cadmonkey-mirror.s3.amazonaws.com/self/20220919_selfF_4K.mp4?height=3850&width=2750&autoplay=true&loop=true&muted=true

selfFulfillment OpenSea link: opensea.io/assets/ethereum/0x1b0fd0fc8dcedba6390fdd3973c2856e0399f831/13

https://cadmonkey-mirror.s3.amazonaws.com/self/selfF_oncyber.mp4?height=1080&width=1920&autoplay=true&loop=true&muted=true

the video, however, isn’t really the “final piece“ itself as the main metadata attach to the token is an animated .GLB file, interactive on marketplace previews and fully 3D native and deployable in any metaverse platforms, such as OnCyber, that supports 3D files! both of these functionalities are shown in the screen capture videos above and below. Furthermore, because of the rigorous process from which the object is created, the piece shall also be readily 3d printable.

https://cadmonkey-mirror.s3.amazonaws.com/self/selfF_os.mp4?height=1080&width=1920&autoplay=true&loop=true&muted=true

endnote

thank you for taking the time and interest to read (or even just browse) through; i hope you have enjoyed learning about this series of 3 pieces that together make up self, a journey. throughout this journey, i’ve been able to reinvestigate lots of the past workflows i haven’t touched in a while, at the same time refine skillsets i’ve been working with, and also experiment with processes i’ve never had a chance to dive into before - and most importantly, integrate them into one coherent series!

the journey itself, together with the constituent parts, IS the art.

and what a journey it has been in the past two weeks, from conceptualization to materialization. i’d like to endlessly thank rik for opening up this contest and for being the first to welcome me when i entered his Discord server - what a gracious and humble human being. it’s been incredible and inspiring to learn more about him and about his own journey.

here’s to the future discovery, growth, and fulfillment of self, to a new renaissance, and to the open metaverse, where more complex and novel experiments and explorations will be supported:

testing of marble texture with file sizes exceeding current performance limits of marketplaces and metaverse platforms
testing of marble texture with file sizes exceeding current performance limits of marketplaces and metaverse platforms

if you’d like, please collect this writing as an NFT below! (from Mirror: by default, entries are free to collect (just pay gas!) with a supply of 500. Writing NFTs are deployed on Optimism, a layer 2 network for Ethereum so collectors will need to bridge ETH to oETH to pay gas.)