Ultimaker / Cura

3D printer / slicing GUI built on top of the Uranium framework
GNU Lesser General Public License v3.0
6.06k stars 2.06k forks source link

Improved Gyroid Infill #12840

Open limaciform opened 2 years ago

limaciform commented 2 years ago

Is your feature request related to a problem?

Gyroid infill, in its current implementation, is not as aesthetically pleasing, nor as mechanically optimal as is could be, due to the gaps/holes in the horizontal surfaces of the structure. (Details below)

Describe the solution you'd like

Keep the current gyroid infill implementation if desired, but add an option or two, for proper gyroid infill that gives the gyroid structure some thickness, so the slicer will fill the horizontal gaps/holes. The new Arachne engine will help greatly with this. (Details below)

Describe alternatives you've considered

There are no alternatives, as modifying slicer settings to try and fill these gaps/holes merely deforms the gyroid further in the X and Y direction, whilst still not giving any structural thickness to the horizontal sections. All slicers suffer the same problem, but Cura should lead the way for innovation. (Details below)

Affected users and/or printers

Everyone will benefit from this by having stronger, truly isotropic 3D prints, with the bonus of having aesthetically pleasing gyroid structures to use for all kinds of exposed infill projects. (Details below)

Additional information & file uploads

Preface

I’ve been 3D printing for about 7 years, designing countless functional parts for experimentation purposes, personal use, and customer requests. For the majority of those years, I’ve invested my time into mastering PETG as my preferred material of choice, for various reasons which I won’t detail here.

I am always looking for ways to improve performance and print quality, and one of the last details I can improve upon, is material build up on the nozzle. This isn’t a major, print ruining issue; more of a fine detail that will occasionally result in a blob creating minor cosmetic imperfections (I’m very fussy).

I have always used cubic subdivision as my infill of choice, because of it’s ability to build denser cells nearer to the shells and skins (where support is required for a nice surface finish and mechanical strength), whilst building larger cells towards the center of the model, using filament more efficiently.

However, in my efforts to improve the aforementioned minor blobbing issue, I am exploring ways to minimise/eliminate the crossing of extrusion paths, which has led me back to considering gyroid infill as an option.

I experimented with gyroid infill when it was first released, but was left underwhelmed by it’s mechanical performance and print quality, so I left it on the sidelines in the hope that it would be developed and improved into a more useful infill over time.

Unfortunately, nothing much has changed since its release, and from my searches, there hasn’t been a lot of discussion about it either. Hopefully I can change that.

The reason I’ve added this preface, is to give some insight into my experience, and to hopefully avoid sounding like a demanding newbie. Like everyone here, I am constantly pursuing improvements. Unfortunately, I don’t have the coding skills to even attempt to improve the gyroid infill in any slicer program myself.

The Problem

Gyroid infill is, understandably, a popular choice. It boasts claims of efficient extrusion paths, a good strength to weight ratio, and nearly isotropic mechanical performance. It also looks fascinating.

There are several videos on YouTube that aim to demonstrate it’s advantages, and various 3D printing websites echoing these claims. The problem is, many of the perceived advantages of gyroid infill are just regurgitated from a small number of repeatedly referenced experiments, or taken from other websites and news articles, with titles such as:

Researchers design one of the strongest, lightest materials known” (https://news.mit.edu/2017/3-d-graphene-strongest-lightest-materials-0106)

These other websites and news articles give reference to research papers and scientific experiments. This information is then assumed to apply to the gyroid structures generated for 3D printed infill. But, they fail to discuss the clearly visible differences between the gyroid structures studied in these research papers, and the flawed gyroid structures generated for 3D printed infill.

Below is an image of the gyroid structure studied in the MIT research paper and news article referenced above.

image

And here is an image from another research paper titled “Bio-Inspired 3D Infill Patterns for Additive Manufacturing and Structural Applications” (https://www.mdpi.com/1996-1944/12/3/499/htm).

image

Now if we compare these images to the gyroid structure generated for 3D printed infill below (40x40x40mm cube, 10% infill density, 0.6mm line width, 0.2mm layer height), we see that there are clear gaps/holes in the horizontal surfaces of the structure, that aren’t present in the gyroid structures subjected to scientific experimentation above. These gaps/holes also change shape as the layers progress.

image

There has been some debate as to whether or not these gaps/holes matter to the structures mechanical performance. Many people have said it doesn’t matter, but again, only referred back to the same few experiments mentioned earlier.

I think it’s obvious that these gaps do mechanically matter. The gyroid structure works like a 3D honeycomb, absorbing, dividing, and dispersing the stress loads throughout, as seen in the image below from the article titled “Nature-Inspired, Ultra-Lightweight Structures with Gyroid Cores Produced by Additive Manufacturing and Reinforced by Unidirectional Carbon Fiber Ribs” (https://www.mdpi.com/1996-1944/12/24/4134/htm).

image

If this was a truss style lattice, removing a truss would weaken the structure. But a gyroid is not a truss style lattice; it’s a minimal surface i.e. a 2D sheet formed into the 3D gyroid shape. If we punch holes into that 2D sheet, we’ve created weak points where the sheet can tear, so to speak.

So, the ideal gyroid structure should be free of gaps/holes/defects to achieve maximum performance and true isotropic strength.

In the image below, we try to close these gaps/holes, achieve a consistent gap/hole size, or obtain more consistent extrusion paths for these horizontal sections throughout the model. Using infill density alone and keeping the same settings mentioned previously, only one density (19%) really comes close. Perhaps there’s a mathematical reason for this, or maybe the consistent pattern breaks down for a taller model with many more layers (I’ve only tested up to the 200mm height of my printers build volume).

image

The next option to try and repair these gaps, is increasing the line width or using an infill line multiplier (both have practically the same effect). If we double the line width from 0.6mm to 1.2mm, we have increased the amount of filament extruded, and therefore must also double the infill density from 19% to 38%, to have the same structure as above, with thicker lines. This appears to repair the horizontal surface gaps nicely, however, as the line width and infill line multiplier functions work in the X and Y plane, but not the Z plane, this leaves the gyroid structure deformed.

image

When we compare a top/bottom view of the gyroid infill with a mathematically derived gyroid model, both are seen to have circular vertical pores. The gyroid infill pores are smaller, due to the line width working in the X and Y plane, but they are still circular.

image

Now, if we compare a front/back/side view of the gyroid infill with a mathematically derived gyroid model, we see that the gyroid infill has deformed, oval shaped horizontal pores, rather than the circular pores of the mathematically derived gyroid model. This is because the pores have been squashed in the X and Y plane by the line width. This occurs at every line width >0mm; thicker line widths just magnify the effect.

image

If we take a closer look at the top/bottom layers of these deformed horizontal pores, we can see that whilst the gaps/holes appear to be repaired by the touching extrusion lines, there is still no vertical thickness to these horizontal sections. The lines merely meet, then immediately separate again. This pin points the major flaw with gyroid infill as it is currently implemented.

image

Taking a look at this research paper titled “The compressive behaviour of ABS gyroid lattice structures manufactured by fused deposition modelling” (https://www.researchgate.net/publication/340979982_The_compressive_behaviour_of_ABS_gyroid_lattice_structures_manufactured_by_fused_deposition_modelling), we find a helpful image depicting 3 phases of gyroids.

image

Whilst I have seen 2D sliced images of simple, repeating infill patterns used to implement infills in the past (not sure of the exact details of how this works), the variations in the horizontal gaps/holes leads me to believe that the gyroid infill is currently not a simple repeating pattern, but rather a mathematical function, seeming to adhere to type (a), the gyroid mathematical surface, which is formed from a 2D sheet.

However, trying to truly translate this 2D sheet into a 3D space is impossible. So, for vertical walls, the sheet thickness is limited to the line width at a minimum. For horizontal surfaces, the 2D sheet has no thickness, so the slicer doesn’t give the horizontal areas any thickness at all. Hence why we are left with gaps/holes in horizontal areas, and deformed oval shaped front/back/side pores when trying to repair these gaps/holes by increasing the line thickness.

The Idea

(UPDATE: Please see 9th comment below for updated implementation idea)

Gyroid infill as it is currently implemented, doesn’t necessarily need to be removed or changed. It is still a useful option for fast infill.

Instead, an additional drop down menu could appear when the gyroid infill pattern is selected. This will allow 3 options, for the 3 gyroid phases seen above (alternative descriptions welcome e.g. fast/strong/balanced/type a/type b/type c).

image

Mathematical (a) – This is the gyroid infill as currently implemented, where the slicer seemingly tries to create the 3D gyroid from a 2D mathematically derived surface. Best for speed and weight. Worst for strength and aesthetics.

This image from Print3DD (https://www.print3dd.com/gyroid-infill/) shows the horizontal gaps/holes and poor aesthetics of the current gyroid infill.

image

Network (b) – Effectively makes one side of the 2D gyroid sheet into a solid filled lattice structure. I imagine the layer slices would look something like this, but each of the solid section outlines would need to be placed inside the solid half of the 2D gyroid sheet plane, to avoid encroaching in to the hollow sections, and to ensure that the solid infilled area is the equal to the unfilled area. Best for strength. Great for aesthetics. Worst for speed and weight.

image

This image from the paper titled “Additive manufacturing technology for porous metal implant applications and triple minimal surface structures: A review” (https://www.researchgate.net/publication/330031812_Additive_manufacturing_technology_for_porous_metal_implant_applications_and_triple_minimal_surface_structures_A_review) shows another view of this network solid phase of gyroid, as well as a view of the solid sheet/matrix unit cell discussed next.

image

Matrix (c) – Transforms the 2D sheet of the gyroid structure into a 3D sheet with thickness in the X, Y, and Z planes equal to the chosen line width, altered by the infill line multiplier. I imagine the layer slices would look similar to the current gyroid layer slices, with the exception of the horizontal sections, where the lines would transition together at an earlier layer, linger/overlap slightly to achieve the required horizontal thickness, then change direction to transition apart at a later layer. This horizontal thickness would effectively squash the deformed, oval shaped front/back/side horizontal pores downward/upward, to make them circular again. This should be the ideal gyroid structure, and shouldn’t impact speed too much. Great for a balance of strength, speed, weight, and aesthetics.

image

The image below from this Digital Journal article (https://www.digitaljournal.com/pr/4809321) just emphasizes the appealing aesthetics of proper gyroid structures.

image

Execution

As I mentioned in the preface, I don’t have any coding skills to even know where to begin experimenting with this. All I can presume is that if the current gyroid infill implementation is derived mathematically, then the other gyroid structures can be derived mathematically as well; especially since there are 3D models of the other gyroids in existence already. And all I can hope, is that my explanations are clear enough to understand, to try and give some good enough reasons to push this up the priority list, and appeal to the geniuses here that will know how to execute this.

Thank you for reading, and happy printing!

discip commented 2 years ago

@limaciform To be fair: I did not read everything you wrote above, thus this is maybe not exactly what you are aiming for, but what about increasing Infill Line Multiplier? 😃

GregValiant commented 2 years ago

That's a heck of a writeup. I certainly can't complain about "insufficient information" like we often get here.

Infill by it's nature is generally covered on the top, bottom, and all around. I would think that being "Aesthetically Pleasing" is very subjective and would be transitory at best. I have to believe that in virtually 100% of FDM prints the infill rapidly transitions to "Invisible". I never use Gyroid because it imparts no strength to a model. I'm with @discip on this one. Give me Grid at 20% density and with the line multiplier at 3. That way I can park my car on the print.

limaciform commented 2 years ago

@limaciform To be fair: I did not read everything you wrote above, thus this is maybe not exactly what you are aiming for, but what about increasing Infill Line Multiplier? 😃

@discip I did cover that lol (just above the zoomed in layer line picture). TLDR; the infill line multiplier works the same as increasing line width, which only effects the X and Y dimensions, not the Z. It just kind of squashes the gyroid in the X and Y directions, deforming the horizontal pores. The lines at the horizontal areas will only ever touch, but there will never be any meaningful thickness/structure/rigidity added, because the gyroids structure as used here, is a 2D sheet trying to be translated in to 3D, so it has no Z thickness in the eyes of the slicer.

It might not even be possible to fill these horizontal gaps with a single line pass, especially as the infill density decreases and the cell size increases. This video here (https://m.youtube.com/watch?v=Djm1sv6rKTQ) sort of shows what I meant above when I said that the gaps/fill areas would need to meet, linger until filled for a few layers, then separate.

limaciform commented 2 years ago

That's a heck of a writeup. I certainly can't complain about "insufficient information" like we often get here.

Infill by it's nature is generally covered on the top, bottom, and all around. I would think that being "Aesthetically Pleasing" is very subjective and would be transitory at best. I have to believe that in virtually 100% of FDM prints the infill rapidly transitions to "Invisible". I never use Gyroid because it imparts no strength to a model. I'm with @discip on this one. Give me Grid at 20% density and with the line multiplier at 3. That way I can park my car on the print.

@GregValiant Well I'm glad if too much information is the problem lol.

I agree that infill is generally covered on all sides, but... (see below)

Likewise it's generally agreed that, with the exception of long spanning, load bearing surfaces, shell thickness has a greater impact on part strength than infill density. Which is effectively what using grid infill with a 3x line multiplier is doing; treating the infill lines like shells and increasing their thickness.

But... as far as the "aesthetically pleasing" argument goes, I think it's like the chicken and the egg. Is infill covered 100% of the time because that's its nature/purpose? Or is infill covered 100% of the time because its ugly?

I understand that "aesthetically pleasing infill" doesn't sell infill changes as a high priority area of improvement. I'd counter that with two points:

1) Without being able to study my 3D printed parts in a laboratory, under a microscope, with finely tuned scientific equipment, the best indicator of print quality/strength I have, is my eyes. Besides looking for split layers, curled corners, or blobs, I need to see a good surface finish and correct colour to know that I had no temperature/cooling issues throughout the print, so it should perform acceptably and results should be consistent across models. In the same way, I monitor my prints throughout, and should see the same results in my infill, to be sure that properties are consistent throughout each individual model. So to stick with the topic, if I'm chasing isotropic mechanical strength in a part, without crossing extrusion paths, and so choose to use gyroid infill, then when I monitor my print and see sagging extrusions and gaps in the horizontal surfaces, with deformed horizontal pores of what should be an isotropic gyroid, then I know the advertised performance will be compromised.

2) The only part of the whole 3D printing process a customer generally sees, is the end result. Whether its a mesh grill that needs air flow or drainage, or you just want to give something an eye-catching design, exposed infill can be useful in achieving this quickly and easily. People love fancy patterns, hence why honeycomb has always been such a popular design (another infill that the main branch of Cura doesn't have, unlike every other slicer). Let's say you wanted to sell a part you could park your car on, a wheel chock for example, which is just a simple wedge shape. You print a fully covered, 3x line multiplier, grid infill that could hold 5 cars. Your competitor prints one with exposed honeycomb infill on the sides that could only hold 2 cars. Which one will customers likely pick at face value? Probably the honeycomb one because it "looks cool and bees do it and they seen on Facebook that it's the strongest structure ever".

So yeah, IMHO, I think infill being aesthetically pleasing does matter, especially when the best tool most of us have for judging the success of a print, is our eyes.

GregValiant commented 2 years ago

"Which one will customers likely pick at face value?"

The cheapest.

limaciform commented 2 years ago

"Which one will customers likely pick at face value?"

The cheapest.

Haha, good joke. If only that were true of people and governments, then perhaps the world wouldn't be so heavily debt laden whilst attempting to cross the frayed rope bridge that is the global economy right now. But, approval ratings and Instagram "likes" (appearances) are what matters nowadays, no matter the cost.

If you want to use the cheapest cost argument though, with all settings the same other than the infill pattern and 0 top/bottom layers, then it looks like exposed honeycomb infill wins again.

image

Joeydelarago commented 2 years ago

I might frame this feature request and put it up on my wall. Thank you for the thorough explanation!

limaciform commented 2 years ago

I might frame this feature request and put it up on my wall. Thank you for the thorough explanation!

Haha feel free. Just be careful it doesn't send you crazy! Then it will keep you up at night, like it does to me lol.

Thanks for taking the time to read through and consider my points!

limaciform commented 2 years ago

Just wanted to add a few more bits of information to this.

The image below, taken from this paper (https://www.researchgate.net/publication/358758848_Numerical_Modeling_and_Experimental_Investigation_of_Effective_Elastic_Properties_of_the_3D_Printed_Gyroid_Infill), shows the stresses in a solid lattice network type gyroid when applied with a longitudinal and shear strain. The key point from this one is where the strain is placed, i.e. exactly where the gaps/holes in the gyroid infill are placed.

image

In my initial post, I spoke about the issue with the horizontal gyroid surfaces having zero thickness, and the possibility of using line width as the measure for horizontal thickness. I also spoke about having 3 gyroid type options. But, the images below have given me a more refined idea. Taken from (https://www.researchgate.net/publication/311583144_Mechanical_properties_of_a_new_type_of_periodic_interpenetrating_phase_composite_materials).

image

When gyroid infill is selected, three options could appear:

"Sheet Thickness" with a setting of 0mm, would be exactly the same as the gyroid infill behaves now. A setting equal to line width mm, would work the same as gyroid infill does now, but there would be horizontal thickness added, so horizontal gaps/holes would be filled, and horizontal pores would be circular again. A setting greater than line width, will make the sheet even thicker, and the extrusion lines would merge/split as needed per Arachne's smart slicing (the "Infill Line Multiplier" option would disappear, as it would not be necessary). Refer to the top half of the above image, regarding "sheet-networks" and sheet thickness.

"Solid Volume" with a setting >0% would override the "Sheet Thickness" setting (disable, grey out), and would transform the gyroid into the solid lattice network type. This could be increased to anything <100% (solid) for a thicker solid lattice network. Refer to the bottom half of the above image, regarding "solid-networks" and solid volume.

"Invert Volume" would be a simple tick box. This would swap which half of the solid lattice network type gyroid, contained the solid lattice. Refer to "Volume 1" and "Volume 2" in the image below.

image

The "Sheet Thickness" solution is the most important feature for fixing the gaps/holes and deformation issue. It can be applied to any other triply-periodic minimal surface types of infills added in future as well. As tested in Smartavionics Cura build, Schwarz-P and Schwarz-D infills also suffer from the same issues.

Here is the MIT experiment video in case anyone hasn't seen it. About half way through the video is the hydraulic press test. It's interesting to see just how much of a difference the thicker sheet structure makes.

https://youtu.be/VIcZdc42F0g

The solid lattice network type of gyroid would be nice to have, but it all depends on how difficult it is to actually implement it, and obviously, priorities and resources.

As an extra bonus, referring to the right side of the second image above, there is another feature that could be very interesting; the ability to print both the primary gyroid pattern, and the complimentary gyroid pattern, with different extruders. This would obviously create a completely solid object (unless a pattern was used that had 2 interlocking types of lattices), but I wonder what possibilities it would open up for experimentation with combining 2 materials in one model to vary the mechanical properties of the object, isotropically. Interesting.

Also, judging by the ever growing list of issues and feature requests, there should be a bounty system or tipping jar for some of these things. Time is money, and I imagine that weighs heavily on where priorities are set. If we want a feature and don't have the skills to implement it ourselves, then we're asking someone with the skills to put their time into developing the feature for us. So it would be nice for users (or one desperate person like me lol) to throw a few $ in a tip jar to say "hey we really want this and will tip you $ amount for your time to implement it". I mean there's a several years old thread about 2D honeycomb infills, with a lot of people wanting it, abandoning Cura for PrusaSlicer or SuperSlicer. And Smartavionics seems to be one person implementing some of these things by themself. It's just a matter of getting them into the main branch. Just a thought.

smartavionics commented 2 years ago

With regard to filling in the little holes in the peaks of the gyroid infill, I've been doing some experiments. I can now reliably get it to produce infill that has a cross in the peaks rather than a hole like this slice shows..

Screenshot_2022-07-29_23-02-25

Here's a few more layers...

Screenshot_2022-07-29_23-03-33

To achieve this I found I needed to constrain the pitch of the gyroid to be a multiple of 4 times the layer height. A side effect of applying this constraint is that it becomes impossible to obtain all densities. I think this is due to the fact that the z coordinate changes in discrete (layer height) steps.

Whether this is actually worth using, I don't know but I'll probably make it an option in my next Cura build.

I won't be implementing the solid lattice gyroid because it's way beyond my mathematical capabilities to work out how to generate it.

limaciform commented 2 years ago

First of all, thank you for taking the time to read through and experiment with this! It's greatly appreciated!

With regard to filling in the little holes in the peaks of the gyroid infill, I've been doing some experiments. I can now reliably get it to produce infill that has a cross in the peaks rather than a hole like this slice shows..

Screenshot_2022-07-29_23-02-25

Here's a few more layers...

Screenshot_2022-07-29_23-03-33

How do the extrusion paths look? Does it extrude lines on one diagonal, then the other, bridging the gap, but crossing paths? Or is it still running X/Y and changing direction at the peaks?

It's a bit of a trade off either way as to whether paths cross and potentially add nozzle build up, or direction changes causing extrusions at the peaks to sag; paths are probably going to cross to get a (close to) perfect gyroid anyway. It looks like an improvement. My only nitpick with this solution is that the peaks are still only the thickness of the layer height, not the extrusion width, so the sheet thickness for the gyroid still isn't (close enough to) uniform.

To achieve this I found I needed to constrain the pitch of the gyroid to be a multiple of 4 times the layer height. A side effect of applying this constraint is that it becomes impossible to obtain all densities. I think this is due to the fact that the z coordinate changes in discrete (layer height) steps.

That's well beyond my mathematical abilities lol. But the Z coordinate changes not aligning exactly with the gyroid formula/structure/peaks at particular layer heights with every density does make sense to explain why the shape of the gaps changes currently.

Whether this is actually worth using, I don't know but I'll probably make it an option in my next Cura build.

It'll be great a great option to experiment with. That's half the fun of 3D printing!

I won't be implementing the solid lattice gyroid because it's way beyond my mathematical capabilities to work out how to generate it.

That's fine. It was just another idea. To be honest, I think the sheet network type would probably still get the most use anyway.

I'm at work at the moment. But when I get home tonight, I was planning to experiment a bit and see how Cura/Arachne goes slicing a gyroid with a sheet thickness the same as line width. I'm curious to see how it treats the gaps/peaks.

smartavionics commented 2 years ago

How do the extrusion paths look? Does it extrude lines on one diagonal, then the other, bridging the gap, but crossing paths? Or is it still running X/Y and changing direction at the peaks?

That's a very good question. The existing code for determining the order in which the infill line segments are printed doesn't take into account any change in nozzle direction when moving from one line segment to another. Therefore, I have introduced a penalty factor based on the amount the direction of the next candidate line differs from the last line printed. So it will now favour the wavy lines on the diagonal and will try to avoid the right angle changes of direction at the peaks.

Thanks for the idea!

limaciform commented 2 years ago

How do the extrusion paths look? Does it extrude lines on one diagonal, then the other, bridging the gap, but crossing paths? Or is it still running X/Y and changing direction at the peaks?

That's a very good question. The existing code for determining the order in which the infill line segments are printed doesn't take into account any change in nozzle direction when moving from one line segment to another. Therefore, I have introduced a penalty factor based on the amount the direction of the next candidate line differs from the last line printed. So it will now favour the wavy lines on the diagonal and will try to avoid the right angle changes of direction at the peaks.

Thanks for the idea!

Awesome! Not a problem. Happy to help with anything that gets us all better (or just cool) results.

Sorry I haven't been back for a while. I've been thinking hard about this. I'll dump a bunch more thoughts in the next post.

limaciform commented 2 years ago

Letting the Slicer do the Work

I downloaded a 20mm gyroid cell with a sheet thickness of 0.5mm, to see how it slices. I used a layer height of 0.2mm, and line width of 0.6mm in the images below, but also tried different line widths without achieving any better results.

image

It doesn’t look too bad at first, but there are a few issues. From left to right; the heavily sloping sections slice thicker so introduces sections with two extrusions, some extrusions want to start on unsupported areas (might be a broader improvement opportunity here for the slicer in general), and we still get those sharp direction changes on unsupported areas (perhaps another improvement opportunity in general).

image

Shrinking the model gives almost the same kind of results. Scaling the model up makes the peaks/overhangs even worse (image below), but seems to solve the other two issues.

image

Based on all the experimentation and information up to this point, and given the way the slicer behaves as of writing this, the conclusion is that fixing that gaps/holes completely, is not necessarily as simple as giving the gyroid infill some sheet thickness and letting the slicer do the work.

Researching the Math

I decided to keep researching to try and get a better understanding of the math behind these gyroids. I am by no means claiming to be an expert all of a sudden; I’m sure there’s already some mathematicians here that don’t need this. I’m also not trying to explain it like you (the reader) are five years old. But I’ll share what I think I understand so far, in case it’s of any help to anyone, and so I can think out loud for my own benefit.

Gyroid Unit Cell

The first thing I think it’s important to understand, is what a gyroid “cell” is. To use an image referenced previously, these are gyroid “cells”.

image

We can imagine them as cubes. If we were to individually slice these cubes/cells in to 2D sheets, almost every slice would look different. The only slices that would be the same, are the outermost opposing faces. This allows these cells to stack together to form a matrix/array/network (whatever term you would prefer to describe it as). So when we refer to “unit cell length”, we are describing the X, Y, and Z dimensions of the cell/cube. The other way to think of it, is as pattern frequency i.e. how far you would have to travel along the X, Y or Z axis before the pattern starts to repeat itself. So in the images below, we have a unit cell length of 3.

image

Iso-value

The next part, is what’s referred to as the “iso-value”. The best way I can describe it for now, is as a sort of offset/shift value. So if we slice up a gyroid and look at one of the layers, we see a group of identical wavy lines (see images below). If we have an “iso-value” of 0 (green), the wavy lines remain unchanged (0 is the default iso-value for a minimal surface gyroid). If we change the iso-value (+/- 0.5), the wavy lines shift to either side of their original position, and slightly change shape with a change in ‘z’, depending on if a positive (blue) or negative (red) iso-value is used.

image

Now we have a rough idea of those two pieces of the puzzle, we can take a look at the functions.

The Functions

This paper (.pdf download) titled “Increased efficiency Gyroid structures by tailored material distribution” (https://www.researchgate.net/publication/343887451_Increased_efficiency_Gyroid_structures_by_tailored_material_distribution#read) contains a lot of information, such as this interesting image showing the internal helical structure that gives the gyroid it’s almost isotropic, spring-like resistance

image

Most importantly, it contains all of our functions, accompanied by a helpful description of how surface (i.e. minimal surface), sheet solid (i.e. solid-surface form), and solid network (i.e. solid-network form) gyroids are formed.

image

From what I can gather:

Eq. 2 = a surface (minimal surface) gyroid, as is currently used for infill.

Eq. 3 = a solid network (solid-network form) gyroid, where the region ‘<h’ (or ‘>h’ to invert) is selected/filled (i.e. the region to one side of the gyroid lines graphed in Eq. 2).

Eq. 4 and Eq. 5 = a sheet solid (solid-surface form) gyroid, where the regions either side of the gyroid lines graphed in Eq. 2, are selected, with the gyroid lines in Eq. 2 being the center lines, and the iso-value ‘h²’ varying the sheet thickness.

Translating these functions to relate to 3D printing; ‘x’ and ‘y’ are simply our X and Y coordinates, ‘z’ is out Z coordinate or cumulative print height, ‘h’ in it’s variations (i.e. =, <, >, ²) would be our control for the gyroid type/form, sheet thickness, or inverting the solid portion of the solid network gyroid, and ‘a’ would be our control for unit cell length as a function of infill density (I will come back to this later in this post).

Eq. 2 – Minimal Surface Form Gyroid

If we graph Eq. 2, we see the direction change in the lines where the peaks of the gyroid would be printed, which just reiterates those variations that give us gaps in these surfaces as the print height progresses.

Function: sin((2π)/ax)cos((2π)/ay) + sin((2π)/ay)cos((2π)/az) + sin((2π)/az)cos((2π)/a*x) = h

Where: h = 0 a = 3 z = 0, 0.4, and 14 (representing some 0.2mm layer steps)

image

Eq. 3 – Solid Network Form Gyroid

I’m not sure how to graph Eq. 3 to select a region, so the next best thing I can do is graph a second and third gyroid function on top of Eq. 2, varying ‘h’, just to indicate which regions would be selected. We can see that making ‘h<0’ (orange) selects the region between two of the gyroid lines in one direction, and making ‘h>0’ (purple) selects the region between two of the gyroid lines in the opposite direction i.e. inverts the region.

Function: sin((2π)/ax)cos((2π)/ay) + sin((2π)/ay)cos((2π)/az) + sin((2π)/az)cos((2π)/a*x) </> h

Where: h = 0, -0.5 (orange), and 0.5 (purple) a = 3 z = 0

image

Eq. 4 and Eq. 5 – Sheet Solid Form Gyroid

As with Eq. 3, I’m not sure how to graph Eq. 4 or Eq. 5 to select a region. So the next best thing I can do is alter the function to ‘=h²’, rather than ‘</=h²’ or ‘>/=h²’, to outline the region that would be selected (blue), and show the relationship of Eq. 2 (green) being the center line. There is no difference between the results for Eq. 4 and Eq. 5 where ‘</=h²’ or ‘>/=h²’, so long as the values are equal and opposite (e.g. 0.5 and -0.5).

Function: (sin((2π)/ax)cos((2π)/ay) + sin((2π)/ay)cos((2π)/az) + sin((2π)/az)cos((2π)/a*x))² = h²

Where: h = 0.5, and -0.5 (blue) a = 3 z = 0

image

Gyroid Pattern Features

These realisations came as a bit of a light bulb moment after staring at the graphs for days. We’ve already covered what the gyroid unit cell length is, earlier in this post. If you skipped over that part, it’s important to understand it.

Focusing on the gyroid faces/outer surface wavy lines; when we look at a gyroid cell from the top, it looks the same as the bottom. When we look from the front, it looks the same as the back. When we look from one side, it looks the same as the other.

Likewise, whether the wavy lines run horizontally or vertically, they start and finish at the same point along their respective edge. This I why gyroid cells join together into a larger matrix, like repetitious puzzle pieces.

Knowing the gyroid unit cell length, tells us what the gyroid waves amplitude is, when the gyroid waves will rotate, flip, rotate again, then return to it’s starting orientation, the pore size, and when the peak (horizontal) surfaces will occur. All of our details revolve around the unit cell length.

Studying the graph from the top, is no different to studying the graph from the front, back, left, or right; it’s the exact same repeating pattern.

To explain further; if we look at this graph (a really nice pattern), we have the minimal surface gyroid function shown at different ‘z’ (cumulative layer height) values.

Function: sin((2π)/ax)cos((2π)/ay) + sin((2π)/ay)cos((2π)/az) + sin((2π)/az)cos((2π)/a*x) = h

Where: h = 0 a = 10

But each has a different ‘z’ (cumulative layer height) value:

(Green) z = 0 (Red) z = 2.5 (Orange) z = 5 (Purple) z = 7.5

image

We can see from this, that when:

z = a1 we get 0 or 360 degrees of rotation (green) z = a0.25 we get 90 degrees of rotation (red) z = a0.5 we get 180 degrees of rotation (orange) z = a0.75 we get 270 degrees of rotation (purple)

This rotation is what gives us our circular gyroid pores and the helical spring-like structure. And, it’s a direct function of the gyroid unit cell length; because the waves must return to their starting position to give us the repeating cell pattern.

We can even come to the same result as above, just by following a single (green) wave. Starting from (0, 0), we see that for this gyroid unit cell length ‘a’ of 10, the wave cycle takes 10 units to return to it’s starting point i.e. complete a 360 degree rotation. Therefore, the half wave cycle will occur at 5 units, where the wave flips 180 degrees. Which means the peak and trough will be in between each half wave cycle, at 90 degrees and 270 degrees, or 2.5 units and 7.5 units.

Remembering that this view is the same no matter which face of the gyroid we are looking at, we can imagine that we are looking at a front or side view. We know that there will be horizontal surfaces at the top and bottom of the pores.

By looking at the amplitude of the waves graphed above, we see that they peak and trough at +/-1.25 units; which is where our horizontal surfaces will occur. This also means that our pore diameter will equal a*0.25 = 2.5 units.

If we now change our (green) wave ‘z’ value from 0 to 1.25, increasing the ‘z’ values of the other waves graphed (red, orange, purple) by 1.25 as well, we get this result:

image

Every horizontal surface occurrence for this gyroid cell shows perfect, crossed intersection to bridge the gaps (also a really nice pattern).

So, we can conclude that:

But, for this to be of use to our gyroid infill pattern, we need to figure out the relationship between infill density and the gyroid unit cell length, so we can pair it with an appropriate line width and layer height.

Infill Density and Gyroid Unit Cell Length

Someone might have a better way of figuring this out from the code; all I can assume is that infill density is calculated as a percentage of the infill area, on a per layer basis. Adjusting layer height doesn’t impact the pattern, but adjusting line width does.

I sliced a 100x100mm cube model with zero walls or top/bottom layers, a layer height of 0.2mm, and a line width of 0.6mm. This was my target gyroid unit cell size. I then played around with the infill density value, and carefully lined up the extrusion line starts and finishes to make sure they were aligned on opposing edges, as close as I could get them.

Then, I scaled the X and Y dimensions down to 10x10mm, and multiplied the infill density by 10, to test again. All of the extrusion starts and finished stayed aligned, and horizontal gaps seemed to hold their consistency throughout the total tested Z height of 200mm.

image

This tells us that for a line width of 0.6mm, and a gyroid unit cell length of 100mm, an infill density of 1.444% is about right.

Likewise, for a line width of 0.6mm, and a gyroid unit cell length of 10mm, an infill density of 14.44% is about right.

Halving the line width to 0.3mm, for a gyroid unit cell length of 10mm, required the infill density to also be halved to 7.22%.

And halving the line width to 0.3mm, for a gyroid unit cell length of 100mm, required the infill density to be halved to 0.722%.

This isn’t an exact measurement, since I’m only relying on the slicers rendering and my eyes. But it proves that:

To look at this further, if we keep the same 100x100mm cube, and increase the infill density 10x, from 1.444% to 14.44%, by counting the crescent shaped sections, we can see that our gyroid unit cell length shrunk from 100mm to 10mm, but there are now 10x10 cells stacked together, rather than 1x single cell. We’ve gone from 1 unit cell to 1000 unit cells.

image

Putting this all together, the ideal infill densities for consistent horizontal surface gaps at a 100mm gyroid unit cell length, seem to be:

For a line width of 0.1mm = 0.241% (scaled inversely to 2.406% for a 10mm cell length) For a line width of 0.2mm = 0.481% (scaled inversely to 4.813% for a 10mm cell length) For a line width of 0.3mm = 0.722% (scaled inversely to 7.220% for a 10mm cell length) For a line width of 0.4mm = 0.963% (scaled inversely to 9.627% for a 10mm cell length) For a line width of 0.5mm = 1.203% (scaled inversely to 12.03% for a 10mm cell length) For a line width of 0.6mm = 1.444% (scaled inversely to 14.44% for a 10mm cell length) For a line width of 0.7mm = 1.685% (scaled inversely to 16.85% for a 10mm cell length) For a line width of 0.8mm = 1.925% (scaled inversely to 19.25% for a 10mm cell length) For a line width of 0.9mm = 2.166% (scaled inversely to 21.66% for a 10mm cell length) For a line width of 1.0mm = 2.406% (scaled inversely to 24.06% for a 10mm cell length)

I tried this again with a 45mm cube, calculating the rough ideal infill density based on this data. It looked to worked fine as far as scaling the unit cell and keeping the extrusion starts and finishes aligned, but the horizontal surface gaps lost consistency.

Theoretically, we should be able to use all this information to choose a suitable layer height that will result in the crossed extrusions at the horizontal surfaces/peaks (as seen in Smartavionics tests, and the image below where layer heights of 0.25mm, for a gyroid unit cell length of 10mm, give us an improved result beginning at 1.25mm and continuing every 2.5mm after that).

image

Unfortunately, trying to get these results with the slicer, doesn’t agree. I suspect this circles back to the first issue of not having any horizontal thickness for the slicer to fill. We would have to force this to occur, but we still wouldn’t be achieving a uniform sheet thickness.

We’ve already concluded that simply giving the slicer a sheet solid form gyroid, doesn’t yield the greatest results.

So lets explore another idea.

Another Idea

Returning to Eq. 4 and Eq. 5 for the sheet solid form gyroid; using ‘</=h²’ or ‘>/=h²’ is supposed to select a region. But, selecting a region would just generate a sheet solid form gyroid, which would likely give us the same result we had when giving the slicer a sheet solid gyroid model in previous testing.

However, altering the function to ‘=h²’, gives us pairs of (blue) lines instead. If used correctly as our extrusion paths, this could almost behave like an infill line multiplier (or like Arachne’s extrusion path merging/splitting) with the benefit of potentially having more control over the extrusion paths, and not deforming the gyroid like the infill line multiplier currently does.

Function: (sin((2π)/ax)cos((2π)/ay) + sin((2π)/ay)cos((2π)/az) + sin((2π)/az)cos((2π)/a*x))² = h²

Playing around with the function variables, this is what I can figure out:

Limits: h = must be greater than -1, but less than 1 a = must not be 0, can be +/- anything z = can be 0, can be +/- anything

As we can see below, the ‘h’ (iso-value/offset/spacing/shift) of the blue lines compared to the green center lines, scales with ‘a’ (unit cell length/density). So if we are to keep the blue lines the same distance from the green center lines, we will need to scale ‘h’ down, as ‘a’ scales up.

image

Luckily, this looks to scale in an inversely proportional way i.e. if ‘a’ increases by a factor of 10, from 10 to 100 (images above are actually 1 to 1000), then ‘h’ must decrease by a factor of 10, from 0.5 to 0.05, to maintain the same spacing (images below). This should make it easy to vary the infill density whilst maintaining the extrusion line spacing.

image

Next we need to figure out how to vary the ‘h’ value to achieve the desired line separation.

I don’t know how to solve this using the function alone. The only way I and think of to figure this out, is to collect a bunch of data points and fit a trend line to get a function that gives us a result that is ‘close enough’. If anyone can teach us a better way, please jump in and let us know your solution.

So, I graphed our function again.

Function: (sin((2π)/ax)cos((2π)/ay) + sin((2π)/ay)cos((2π)/az) + sin((2π)/az)cos((2π)/a*x))² = h²

Where: h = 0 to 1 (in 0.01 increments) a = 10 z = 0 (so all of the waves were the same shape)

Then I added the following.

Function: cos(((2 π)/(a)) x) = h

Where: h = 0 a = 10

To give us vertical lines at every peak and trough of the waves (image below).

image

I could then easily record all of the wave peak/red line intersection values, and be left with 101 data points (table below in case anyone else needs them or notices any inaccuracies).

h | Top Wave | Bottom Wave | Separation -- | -- | -- | -- 0.00 | 1.25 | 1.25 | 0.0000000000000 0.01 | 1.261254047737 | 1.238745952263 | 0.0225080954740 0.02 | 1.2725086582351 | 1.2274913417649 | 0.0450173164702 0.03 | 1.2837643945084 | 1.2162356054916 | 0.0675287890168 0.04 | 1.2950218200784 | 1.2049781799216 | 0.0900436401568 0.05 | 1.3062814992275 | 1.1937185007725 | 0.1125629984550 0.06 | 1.3175439972548 | 1.1824560027452 | 0.1350879945096 0.07 | 1.328809880732 | 1.171190119268 | 0.1576197614640 0.08 | 1.3400797177622 | 1.1599202822378 | 0.1801594355244 0.09 | 1.3513540782394 | 1.1486459217606 | 0.2027081564788 0.10 | 1.362633534111 | 1.137366465889 | 0.2252670682220 0.11 | 1.3739186596427 | 1.1260813403573 | 0.2478373192854 0.12 | 1.3852100316863 | 1.1147899683137 | 0.2704200633726 0.13 | 1.3965082299507 | 1.1034917700493 | 0.2930164599014 0.14 | 1.407813837277 | 1.092186162723 | 0.3156276745540 0.15 | 1.419127439917 | 1.080872560083 | 0.3382548798340 0.16 | 1.4304496278166 | 1.0695503721834 | 0.3608992556332 0.17 | 1.4417809949041 | 1.0582190050959 | 0.3835619898082 0.18 | 1.4531221393829 | 1.0468778606171 | 0.4062442787658 0.19 | 1.4644736640306 | 1.0355263359694 | 0.4289473280612 0.20 | 1.4758361765043 | 1.0241638234957 | 0.4516723530086 0.21 | 1.4872102896516 | 1.0127897103484 | 0.4744205793032 0.22 | 1.4985966218289 | 1.0014033781711 | 0.4971932436578 0.23 | 1.5099957972279 | 0.9900042027721 | 0.5199915944558 0.24 | 1.5214084462089 | 0.9785915537911 | 0.5428168924178 0.25 | 1.5328352056433 | 0.9671647943567 | 0.5656704112866 0.26 | 1.5442767192649 | 0.9557232807351 | 0.5885534385298 0.27 | 1.5557336380309 | 0.9442663619691 | 0.6114672760618 0.28 | 1.5672066204933 | 0.9327933795067 | 0.6344132409866 0.29 | 1.5786963331807 | 0.9213036668193 | 0.6573926663614 0.30 | 1.5902034509919 | 0.9097965490081 | 0.6804069019838 0.31 | 1.601728657602 | 0.898271342398 | 0.7034573152040 0.32 | 1.6132726458807 | 0.8867273541193 | 0.7265452917614 0.33 | 1.6248361183249 | 0.8751638816751 | 0.7496722366498 0.34 | 1.636419787506 | 0.863580212494 | 0.7728395750120 0.35 | 1.648024376532 | 0.851975623468 | 0.7960487530640 0.36 | 1.659650619526 | 0.840349380474 | 0.8193012390520 0.37 | 1.6712992621229 | 0.8287007378771 | 0.8425985242458 0.38 | 1.6829710619829 | 0.8170289380171 | 0.8659421239658 0.39 | 1.6946667893258 | 0.8053332106742 | 0.8893335786516 0.40 | 1.7063872274846 | 0.7936127725154 | 0.9127744549692 0.41 | 1.7181331734818 | 0.7818668265182 | 0.9362663469636 0.42 | 1.7299054386281 | 0.7700945613719 | 0.9598108772562 0.43 | 1.7417048491459 | 0.7582951508541 | 0.9834096982918 0.44 | 1.7535322468181 | 0.7464677531819 | 1.0070644936362 0.45 | 1.765388489665 | 0.734611510335 | 1.0307769793300 0.46 | 1.7772744526499 | 0.7227255473501 | 1.0545489052998 0.47 | 1.7891910284153 | 0.7108089715847 | 1.0783820568306 0.48 | 1.8011391280521 | 0.6988608719479 | 1.1022782561042 0.49 | 1.8131196819037 | 0.6868803180963 | 1.1262393638074 0.50 | 1.8251336404065 | 0.6748663595935 | 1.1502672808130 0.51 | 1.8371819749701 | 0.6628180250299 | 1.1743639499402 0.52 | 1.8492656788986 | 0.6507343211014 | 1.1985313577972 0.53 | 1.8613857683567 | 0.6386142316433 | 1.2227715367134 0.54 | 1.8735432833826 | 0.6264567166174 | 1.2470865667652 0.55 | 1.8857392889516 | 0.6142607110484 | 1.2714785779032 0.56 | 1.8979748760922 | 0.6020251239078 | 1.2959497521844 0.57 | 1.9102511630606 | 0.5897488369394 | 1.3205023261212 0.58 | 1.9225692965743 | 0.5774307034257 | 1.3451385931486 0.59 | 1.9349304531124 | 0.5650695468876 | 1.3698609062248 0.60 | 1.9473358402839 | 0.5526641597161 | 1.3946716805678 0.61 | 1.9597866982704 | 0.5402133017296 | 1.4195733965408 0.62 | 1.9722843013485 | 0.5277156986515 | 1.4445686026970 0.63 | 1.9848299594962 | 0.5151700405038 | 1.4696599189924 0.64 | 1.9974250200913 | 0.5025749799087 | 1.4948500401826 0.65 | 2.0100708697059 | 0.4899291302941 | 1.5201417394118 0.66 | 2.0227689360061 | 0.4772310639939 | 1.5455378720122 0.67 | 2.0355206897643 | 0.4644793102357 | 1.5710413795286 0.68 | 2.0483276469913 | 0.4516723530087 | 1.5966552939826 0.69 | 2.0611913711986 | 0.4388086288014 | 1.6223827423972 0.70 | 2.0741134758002 | 0.4258865241998 | 1.6482269516004 0.71 | 2.0870956266657 | 0.4129043733343 | 1.6741912533314 0.72 | 2.1001395448348 | 0.3998604551652 | 1.7002790896696 0.73 | 2.1132470094082 | 0.3867529905918 | 1.7264940188164 0.74 | 2.1264198606276 | 0.3735801393724 | 1.7528397212552 0.75 | 2.1396600031615 | 0.3603399968385 | 1.7793200063230 0.76 | 2.1529694096135 | 0.3470305903865 | 1.8059388192270 0.77 | 2.1663501242712 | 0.3336498757288 | 1.8327002485424 0.78 | 2.1798042671186 | 0.3201957328814 | 1.8596085342372 0.79 | 2.1933340381319 | 0.3066659618681 | 1.8866680762638 0.80 | 2.2069417218876 | 0.2930582781124 | 1.9138834437752 0.81 | 2.2206296925072 | 0.2793703074928 | 1.9412593850144 0.82 | 2.2344004189727 | 0.2655995810273 | 1.9688008379454 0.83 | 2.248256470845 | 0.251743529155 | 1.9965129416900 0.84 | 2.2622005244255 | 0.2377994755745 | 2.0244010488510 0.85 | 2.2762353694017 | 0.2237646305983 | 2.0524707388034 0.86 | 2.2903639160259 | 0.2096360839741 | 2.0807278320518 0.87 | 2.3045892028797 | 0.1954107971203 | 2.1091784057594 0.88 | 2.3189144052835 | 0.1810855947165 | 2.1378288105670 0.89 | 2.3333428444187 | 0.1666571555813 | 2.1666856888374 0.90 | 2.3478779972376 | 0.1521220027624 | 2.1957559944752 0.91 | 2.3625235072456 | 0.1374764927544 | 2.2250470144912 0.92 | 2.377283196252 | 0.122716803748 | 2.2545663925040 0.93 | 2.3921610771979 | 0.1078389228021 | 2.2843221543958 0.94 | 2.407161368184 | 0.092838631816 | 2.3143227363680 0.95 | 2.4222885078399 | 0.0777114921601 | 2.3445770156798 0.96 | 2.4375471721925 | 0.0624528278075 | 2.3750943443850 0.97 | 2.4529422932196 | 0.0470577067804 | 2.4058845864392 0.98 | 2.4684790792966 | 0.0315209207034 | 2.4369581585932 0.99 | 2.4841630377791 | 0.0158369622209 | 2.4683260755582 1.00 | 2.5 | 0 | 2.5000000000000

Graphing the ‘h’ value (X axis) against the top and bottom wave divergence/separation distance (Y axis), individually, looks like this:

image

But more importantly, graphing the total divergence/separation distance (X axis) against the ‘h’ value (Y axis), looks like this:

image

With that, I fit a polynomial trend line to the data points. This gave the result:

Function: f(x) = -0.00670355293312564x³-0.00127183932811061x²+0.445061615132567*x-9.72002679283619E-05

Testing this with a desired line spacing value of x = 0.6, gives the result of h = 0.265033939219937.

Testing this with a measured line spacing value of x = 0.9127744549692, gives the result of h = 0.399986081945084.

So, whilst using a known line spacing value doesn’t quite give the measured value of h = 0.4, it’s still very close. It may not be pretty, but I think it’s usable.

Now, if we graph the minimal surface gyroid:

Function: sin((2π)/ax)cos((2π)/ay) + sin((2π)/ay)cos((2π)/az) + sin((2π)/az)cos((2π)/a*x) = h

Where: a = 10 h = 0 z = Layer steps of 0.25

With a sheet solid form gyroid (not selecting the sheet region, just the outlines):

Function: (sin((2π)/ax)cos((2π)/ay) + sin((2π)/ay)cos((2π)/az) + sin((2π)/az)cos((2π)/a*x))² = h²

Where: a = 10 h = 0.265033939219937 (for a line separation of close to 0.6mm) z = Layer steps of 0.25

We get this graph:

image

Here we see 4 layers at z = 0.75, 1.0, 1.25, and 1.5. The interesting idea here is that we are graphing the minimal surface gyroid and sheet solid form gyroid together.

But, if we are using a line width of 0.6mm, and a line spacing of 0.6mm where h = 0.265033939219937, then in most areas, the blue lines will be touching, side by side. The only areas the green lines will actually appear, are those places where the blue lines separate. So most gaps between the blue lines, should be filled by the green lines.

For comparison, if we look at how grid infill behaves (image below), we see that by default, the extrusion paths intersect, which is not ideal. But, if we change the infill line multiplier to 2, we instead end up with numerous squares, individually printed, with no intersecting extrusion paths. This obviously uses more material, and will print slower, but is better in terms of avoiding intersecting extrusion paths.

image

When we approach out horizontal surface at z = 1.0, then reach our horizontal surface at z = 1.25, we have a similar looking result. We have separate segments printing without crossing extrusion paths (blue), and our fill lines (green) filling the gaps. We look to get our horizontal thickness, avoid overly sharp, unsupported direction changes, and keep extrusion paths relatively tidy.

I hope all of that makes some sense. I’ve written numerous things, and held backspace to delete it, over and over again. And I could hold off posting until I think some more and have some definite conclusion, but knowing me, that could takes months. So, I think it’s better to just vomit it all out so far, and see if this sparks some ideas, or if it could lead to some useful discovery.

limaciform commented 2 years ago

I graphed and coloured a sheet solid form gyroid with thickness of approx. 0.6 (to match extrusion width, with a h value calculated from polynomial function in last post), a z step (layer heights) of 0.2, and unit cell length of 8 (to work with the previously discussed pattern features/horizontal surface occurences).

We get 3 bridging layers (5, 6, and 7) to give us our 0.6 horizontal thickness to match our wall thickness. And I think intervening to control the pattern extrusion direction will allow the gaps to be bridged (see rough arrows).

image

smartavionics commented 2 years ago

I've just released https://github.com/smartavionics/Cura/releases/tag/4.20.3, it has a new setting Minimise Gyroid Holes that constrains the pitch so that you always get 2 "crosses" per gyroid cycle. Further more, the crosses are printed as straight lines rather than as right angles so they should print nicely.

limaciform commented 2 years ago

I've just released https://github.com/smartavionics/Cura/releases/tag/4.20.3, it has a new setting Minimise Gyroid Holes that constrains the pitch so that you always get 2 "crosses" per gyroid cycle. Further more, the crosses are printed as straight lines rather than as right angles so they should print nicely.

Thank you! I'm away from home for a week and a bit, but I'll definitely have a play with it when I get back!

Did any of those formulas above look like anything of use to you?

smartavionics commented 2 years ago

Did any of those formulas above look like anything of use to you?

Sorry, I'm not looking at implementing multi-layer gyroid infill so I'm letting all this math wash over me!

Cheers,

Mark

limaciform commented 2 years ago

Did any of those formulas above look like anything of use to you?

Sorry, I'm not looking at implementing multi-layer gyroid infill so I'm letting all this math wash over me!

Cheers,

Mark

Alright, no worries.