Graph and levelset based surface construction.

The animation shows a graph curve on the left that is coloured towards a desired local radius. Such a curve could stem from an image segmentation such as the centre line for a blood vessel. The local radius would then represent the local blood vessel radius. On the right a slice through a corresponding "levelset image" is shown. The level set image is a signed distance for the vessel surface but normalised by this radius, so a distance of 1.0 means we are 1 local radius value away from the desired surface. An intensity level of 0.0 means we are on the desired surface, negative levels mean are for the inside, and positive levels are for the outside. Once the levelset image is established the surface can be constructed by drawing the isosurface for the level 0.0. Just to test the algorithm, in this animation, I am creating a sinusoidal variation of the radial data. By increasing the frequency there are more and more bumps in the surface. Critically, when features on the surface become too curved or thin with respect to the voxel size, the surface may become too noisy as the coarse voxelisation starts to fail to capture the detail in the geometry.

This is the new #Julialang implementation but my old MATLAB implementation was used here:

https://doi.org/10.1016/j.jbiomech.2021.110896 (open access version: https://doi.org/10.31224/osf.io/qaujs)

and here:
https://doi.org/10.1098/rsos.242025

#opensource #geometryprocessing #Comodo

Meet "spinodoid" structures. You basically splash lots of waves in all sorts of random directions with random phases, and then you threshold the resulting mess.
These structures stem from the idea of a "spinodal decomposition" and the waves form a "Gaussian random field". The latter has been linked to/used for animal patterns (stripes etc), phase separation in chemistry/metallurgy, quantum mechanical random fields, up to cosmological structures...
But here I just use it to create stochastic lattice structures. Because my waves here have different orientations but the same frequency, they show up in a Fourier transform as a circle or sphere, which I think is just neat :)

Spinodoids are coming to Comodo very soon.

More on Spinodoids:
https://doi.org/10.1038/s41524-020-0341-6

Spinodal decomposition:
https://en.wikipedia.org/wiki/Spinodal_decomposition

Gaussian random fields:
https://en.wikipedia.org/wiki/Gaussian_random_field

#opensource #Julialang #GeometryProcessing #Lattices

Angle based surface segmentation. This animation showcases the output of Comodo's faceanglesegment function. Imported surface geometry that lacks any labelling of surface features is segmented, based on surface orientations, into separate features, e.g. a cylindrical hole, a flat face, a gear tooth flank, a propellor face, and so on. This function is very handy to assign boundary conditions to particular aspects of a model, or to segment it into separate parts for remeshing.

#opensource #Julialang #GeometryProcessing

Meet Taubin smoothing. It is a nice smoothing method that is great for smoothing voxel based meshes. So for smoothing stepped "Lego-like" meshes.

The left here shows a raw voxelised (thresholded) voxel boundary surface. On the right is the Taubin smoothed result.

Taubin smoothing works by first doing an aggressive Laplacian smoothing step (a bit like a blurring), which removes bumps etc, but which unfortunately can distort the shape too (e.g. unwanted shrinkage/growth). Next it uses an "inverse smooth" (a bit like a sharpening operation) to attempt to push back the shape a bit to avoid distortion. With the right parameter choices it can perform really well.

This animation is for a thresholded 3D image. The colors are the original voxel intensities. The resulting shape presents as a central sphere like blob contained in a dodecahedron "cage".

See also: https://doi.org/10.1145/218380.218473

#GeometryProcessing #JuliaLang #Makie #Meshing #TilingTuesday

Meschers: Geometry Processing of Impossible Objects

Meschers: Geometry Processing of Impossible Objects

How am I supposed to get any work done when the maths is so pretty! Look at it flutter by like a butterfly!

This is an animation for "biharmonic spline interpolation" (see also: https://doi.org/10.1007/s11004-011-9346-5).

I'm testing a Julia implementation here which I'd like to use to interpolate the Z-coordinate for meshes that should span a closed curve domain where the x,y, and z are known. Here I created a circle and manipulated the z-coordinates using z=sin(x+a) where a is a phase offset. Next I animated the change of the phase offset to create the wave like motion.

#geometryprocessing #JuliaLang #Comodo

Testing out "Natural Neighbour" interpolation of non-gridded/scattered 3D data. If only there was a fun boundary curve with some sharp features that I could use to test these methods.

https://en.wikipedia.org/wiki/Natural-neighbor_interpolation

See the nice package by Daniel VandenHeuvel: https://github.com/DanielVandH/NaturalNeighbours.jl

#opensource #julialang #Makie #Comodo #geometryprocessing

A simple parameterised hexahedral mesh of a cylindrical solid.

Coming soon to #Comodo

https://github.com/COMODO-research/Comodo.jl

#opensource #computationalmechanics #geometryprocessing

An animation of a hexahedral mesh for a solid cylinder. The animation shows a cylinder with blue quadrilateral faces on top, yellow ones in the bottom, and red ones on the side. The screen shows 3 sliders. When the first slider is changed the mesh density is increased iteratively (each quad is split into 4 new ones). If the second slider is changed the height of the cylinder is changed and new elements are added to maintain a similar point spacing. If the third slider is changed the radius is changed. When the radius is decreased the point spacing decreases and hence additional elements are also added in the height direction to maintain a homogeneous mesh. This animation therefore shows a full parameterisation of a hexahedral mesh of the cylinder.

Evaluating of simple #additivemanufacturing cost function metrics (build height, footprint area, support volume, overhang area, ... ). The model is rotated and all metrics are computed, next the sphere is "painted" to show the magnitude of that metric for that orientation (sum of the lengths of the black lines as estimate of support material use). This way the sphere provides a nice summary visualisation of which orientations are best e.g. in terms of minimising support material use.

#geometryprocessing #3dprinting #opensource #julialang

Just a bunny rotating according to a uniform set of directions on the sphere. The bunny is colored towards the "overhang" angle with respect to the ground. The black area on the ground is the projection of the bunny onto the ground (a bit like a shadow). This is a simple toy simulation that computes some metrics relevant to the simulation of 3D printing preparation.

#geometryprocessing #Julialang #Comodo #ComputationalDesign