# Double QuickCurve: revisiting 3-axis non-planar 3D printing

E Ottonello, P.-A Hugron, A Parmiggiani, Sylvain Lefebvre

► To cite this version:

E Ottonello, P.-A Hugron, A Parmiggiani, Sylvain Lefebvre. Double QuickCurve: revisiting 3-axis non-planar 3D printing. EG 2025 - 46th Annual Conference of the European Association for Computer Graphics (short papers), Apr 2025, Londres, United Kingdom. 10.2312/egs.20251052. http://05466215

HAL Id: hal-05466215

https://inria.hal.science/hal-05466215v1

Submitted on 20 Jan 2026

HAL is a multi-disciplinary open access
archive for the deposit and dissemination of sci-
entific research documents, whether they are pub-
lished or not. The documents may come from
teaching and research institutions in France or
abroad, or from public or private research centers.

L'archive ouverte pluridisciplinaire HAL, est
destinée au dépôt et à la diffusion de documents
scientifiques de niveau recherche, publiés ou non,
émanant des établissements d'enseignement et de
recherche français ou étrangers, des laboratoires
publics ou privés.

<figure><img src="image_1.png" /></figure>

Distributed under a Creative Commons CC BY 4.0 - Attribution - International License
# Double QuickCurve: revisiting 3-axis non-planar 3D printing

E. Ottonello<fnref n="1" />, P.-A. Hugron<fnref n="2" />, A. Parmiggiani<fnref n="1" /> and S. Lefebvre<fnref n="2" />

<figure><img src="image_2.png" /><figcaption>**Figure 1:** Our technique slices a 3D model (left, middle) into non-planar deposition paths. It optimizes for slicing surfaces (left, top and bottom) that are interpolated along the height to extract non-planar layers. We align trajectories with respect to the curvature, here giving an angled orientation to the paths (middle, closeup). The optimized slicing surfaces precisely align with the top and bottom facing features, in this case achieving a single, curved layer for both. Final print on the right, with and without supports. Note how the lower parts of the spinner is curved, without being hindered by the presence of the vertical pillar. (Zoom in for details).</figcaption></figure>

## Abstract

Additive manufacturing builds physical objects by accumulating layers of solidified material. This is typically done with planar layers. Fused filament printers however have the capability to extrude material along 3D curves, leading to the idea of depositing in a non-planar fashion. In this paper we introduce a novel algorithm for this purpose, targeting simplicity, robustness and efficiency. Our method interpolates curved slicing surfaces between two top and bottom slicing surfaces, optimized to align with the object curvatures. These slicing surfaces are intersected with the input model to extract non-planar layers and curved deposition trajectories. We further orient trajectories according to the object's curvatures, improving deposition.

## 1. Introduction

Decomposing a part in flat layers leads to the so-called *staircase defect* that damages the surface finish and accuracy of the final parts. By producing curved layers, non-planar slicing techniques attempt to improve the part in terms of its surface finish and accuracy [AWHZ19, ERP*19], support requirements [DWW*18] and structural strength [FZH*24], possibly combining these objectives [ZFH*22, LZC*24]. The main strategy of prior works has been to deform the input model, slice it with planar layers, and deform back the obtained trajectories.

We focus on non-planar 3D printing on standard 3-axis machines, with the primary objective of improving the surface finish of a print. Our technique is readily applicable on widely available FFF printers with little to no hardware modifications. Non-planar printing on 3-axis machines however suffers from a nozzle gouging issue, where the nozzle scratches already deposited material due to its physical shape [AWHZ19]. This limits the maximum angle that can be reproduced with satisfactory quality. However, it is worth noting that the staircase defect worsens at lower slopes. Therefore even a limited non-planarity brings great benefits in ac-

currency [ERP*19, AWHZ19]. To further mitigate this issue, we built upon recent work in trajectory optimization [CZM*23] to align deposition along the surface curvature.

We place a particular emphasis on designing an efficient and robust slicing procedure. Prior works require expensive optimizations in tetrahedral volumes [ERP*19, ZFH*22, LZC*24], with a large number of terms and constraints. In contrast, our technique defines the (non-planar) slicing surface of each layer by interpolation from two optimized slicing surfaces. These two base surfaces are obtained by solving simple least-square problems in 2D grids, robustly and efficiently, without having to build a tetrahedral mesh.

## 2. Method

In our method, the contour of every layer is obtained by intersecting the part with a non-planar slicing surface, which shape varies across heights, see Figure 1. The slice surface at every height is obtained by interpolation between two base slicing surfaces, noted $S_t$ and $S_b$. The two are optimized in a similar manner (Section 2.2.3), considering the top-facing surfaces and $S_b$ the bottom-facing surfaces. Note that after optimization these surfaces have no holes, and fully cover the domain as seen from above.

<footnote n="1">¹Istituto Italiano di Tecnologia, Genova, Italy</footnote>

<footnote n="2">²Université de Lorraine, CNRS, Inria, LORIA, Nancy, France</footnote>

<footnote>© 2025 The Authors.
Proceedings published by Eurographics - The European Association for Computer Graphics.
This is an open access article under the terms of the Creative Commons Attribution License, which permits use, distribution and reproduction in any medium, provided the original work is properly cited.</footnote>
<figure><img src="image_3.png" /><figcaption>**Figure 2: From left to right: A shape with sloped surfaces; A single slicing surface optimized by our approach; The obtained trajectories. All surfaces are exactly reproduced (zoom for details). Note how the vertical ridges do not prevent curving the top surfaces.**</figcaption></figure>

The base slicing surfaces are such that they exactly reproduce the top (respectively bottom) facing surfaces of a part when they align with them. This is illustrated in Figure 2 for a single slicing surface. During slicing, we interpolate the slicing surface at every height from $S_t$ and $S_b$ (Section 2.3), with an interpolation that maximizes cases where the slice aligns with the curved features.

## 2.1. Input geometry and output trajectories

Our method takes as input a mesh or solid definition $\mathcal{M}$. The only requirement on $\mathcal{M}$ is to properly define a volume, such that it can be intersected by a slicing surface to extract a (non-planar) contour.

The output is an ordered set of toolpaths, polylines in x, y, z. In addition, each vertex is associated with an attribute $E$ which controls the amount of material extrusion from one segment to the next.

## 2.2. Base slicing surfaces

Our algorithm optimizes for two base slicing surfaces $S_t$ and $S_b$. These are interpolated across heights to obtain the final set of slices (Section 2.3). We define a base slice surface $\mathcal{S}$ as a height field $S(x, y) : \mathbb{R}^2 \to \mathbb{R}$. We now discuss how we formulate the optimization of $\mathcal{S}$ in terms of constraints and objectives. The optimization is similar for both $S_t$ and $S_b$. We focus next on the description for $S_t$ only, which optimizes the slicing surface for the top facing curved features of a part.

### 2.2.1. Surface accessibility

A conical nozzle collision model [AWHZ19, ERP*19] leads to the observation that surfaces with an angle everywhere below a critical angle $\theta_{max}$ can be printed without self-collisions [AWHZ19].

We thus define a valid slicing surface as a continuous surface where everywhere the slope is below $\theta_{max}$. Such a surface has a bounded gradient [ERP*19] and guarantees fabricability: all print trajectories for a layer are along the slicing surface, the slicing surface is itself free of self-collisions, and the previously printed layers are all contained below.

### 2.2.2. Sloping control

Our method is controlled by a target map $\Theta: \Omega \to \mathbb{R}$ with $\Omega \subset \mathbb{R}^2$. This sparse map indicates in selected x, y locations the ideal shape of the surfaces to be fabricated, forming connected pieces of heightfields. We measure the slope of $\Omega$ at a location x, y by noting $\Theta(\Theta(x, y))$. This operator computes the slope through finite differences in $\Omega$. The target map has to be such that $\Theta(\Theta(x, y)) < \theta_{max}$ everywhere — i.e. the provided target is always below the critical collision angle.

We obtain $\Theta$ by selecting the top-facing (resp. bottom-facing for $S_b$) surfaces of $\mathcal{M}$. These are the surfaces which as seen from above have a slope below $\theta_{max}$. Of course, the map could be obtained by other means – e.g. optimized for structural objectives – and the surfaces in $\Theta$ do not necessarily have to be a subset of those of $\mathcal{M}$.

### 2.2.3. Slice surface optimization

In this section we describe how we optimize a slicing surface $\mathcal{S}$ from the input target map $\Theta$. The primary objective is for the slicing surface to reproduce the slopes of the surfaces given in $\Theta$. This guarantees that, at the time of slicing, the slicing surface exactly aligns with the shape of each selected top-facing surface in $\mathcal{M}$ (Figure 3, right). Note that following this reasoning the absolute altitudes of the surfaces do not matter: it suffices that there exists a height where the slicing surface aligns with the target surface. This is the key observation onto which we base our optimizer.

The slicing surface should also be valid to ensure a correct fabrication (Section 2.2.1). In the optimization step we consider slice validity as an objective. We later enforce validity as a post-process (Section 2.2.4).

We optimize $\mathcal{S}$ as a discrete height field. Therefore, the variables we optimize for are a set of displacements (or altitudes) from the printing bed, noted $h_{(i,j)}$ with $i, j$ an index in the 2D discretized version of $\mathcal{S}$. The degrees of freedom are the altitudes where a target is not specified in the control map $\Theta$. Where a target is specified in $\Theta$ we want to enforce that the slice surfaces matches its slopes.

Note that matching the slopes is different from trying to match the absolute altitudes of the surfaces. In the example Figure 3 (left) the top surfaces (in green) could not be all reached if using a top view heightfield as the slicing surface: the red slopes exceed by far the angle constraint, so this would result in collisions between the part and the printer.

<figure><img src="image_4.png" /><figcaption>**Figure 3: Left:** Green tops are compatible with $\theta_{max}$, the red slopes exceed the limit. **Right:** Our approach finds the best possible slice (dashed line) that captures all surfaces at different heights.</figcaption></figure>

To abstract out the absolute altitude we introduce additional variables, one per connected component in $\Theta$ (green in Figure 3). Intuitively these allow each target surface to move vertically, to 'float' up and down. Let us denote the set of connected components in $\Theta$ as $C$. We associate a variable $z_c$ with each $c \in C$. The values of $h_{(i,j)}$ in a component $c$ are fully determined by $z_c$ as $h_{(i,j)} = z_c + \Theta(i, j) - \Theta(c_0)$, with $c_0$ a reference point arbitrarily chosen in $c$. In the reminder we call the altitudes $h_{(i,j)}$ outside of any component $c$ the free variables of the problem, as they are not tied to a $z_c$ variable.

Every free variable in $\mathcal{S}$ neighboring a connected component is requested to match the height of its neighbor. That is, given a coordinate $i, j$ in component $c$ with a free neighbor $h_{(i,j)}+\delta$ with $\delta \in [-1, 1]^2$, we add the objective that $h_{(i,j)}+\delta = z_c + \Theta(i, j) - \Theta(c_0)$.

Within the regions where $\Theta$ is not specifying a target angle, we consider two cases. If the $(i, j)$ location is covered by $\mathcal{M}$ as seen from above, we encourage the slice surface gradient to steepen. This follows the observation in [ERP*19] that surfaces should be either exactly curved, or sliced at an angle as orthogonal as possible to the surface. Given a free variable at coordinate $(i, j)$ with a free neighbor $(i, j) + \delta$ with $\delta \in [-1, 1]^2$ we add the objective
$$h_{(i,j)} - h_{(i,j)+\delta} = H_{\text{target}} \quad \text{if } \mathcal{Z}_{\mathcal{M}}(i, j) > \mathcal{Z}_{\mathcal{M}}((i,j) + \delta)$$

$$h_{(i,j)+\delta} - h_{(i,j)} = H_{\text{target}} \quad \text{otherwise}$$

Where $\mathcal{Z}_{\mathcal{M}}$ is the Z coordinate of the top-most (respectively bottom-most for $S_b$) surface of $\mathcal{M}$ at coordinate $(i, j)$, and $H_{\text{target}}$ is computed from $\theta_{\text{max}}$ given the chosen discretization step of $S$ (we typically use 50µm). We therefore request the local gradient to increase to match the selected target slope.

If $\Theta$ is not specifying a target angle and the location $(i, j)$ is not covered by $\mathcal{M}$, we request that

$$h_{(i,j)} - h_{(i,j)+\delta} = 0$$

This makes empty regions around the part as smooth as possible.

From this, we optimize for the free variables $h_{(i,j)}$ and per-component variables $z_c$ to obtain a surface having the target gradient. This leads to a least square problem similar to solving for the Poisson equation in a grid [PGB03], with the addition of the per-component variables. We solve it using the Eigen library [GJ*10].

A result is shown in Figure 1. Figure 4 shows the effect of steepening, revealing that even where the curvature is not followed our technique improves compared to horizontal slices. The optimizer produces smooth surfaces in empty regions around the model, as is visible in e.g. Figure 8.

<figure><img src="image_5.png" /><figcaption>**Figure 4:** Steepening. Left: All layers. Right: Top-most layers hidden to reveal the inside. Note how the slice is angled where the top exceeds $\theta_{\text{max}}$, reducing staircasing compared to horizontal layers.</figcaption></figure>

### 2.2.4. Post-processing

The optimizer may generate a surface where the slope exceeds $\theta_{\text{max}}$ in sparse locations. This is typically triggered by near surfaces of very different slopes, as shown in Figure 5.

Our formulation could enforce the constraint through inequality constraints. Instead we choose to keep the solver simple and rely on the sweep algorithm of Hornus et al. [HL18] to fill all concavities in $S$ producing slopes steeper than the constraint. In Figure 5 (right) this removes the vertical slopes that would otherwise make the nozzle collide with the layer being printed. The deposition trajectories in the affected regions are no longer aligned with the object surface.

<figure><img src="image_6.png" /><figcaption>**Figure 5:** Shape to be sliced, optimized slice surface (the vertical ridge violates $\theta_{\text{max}}$), the resulting GCode cannot be printed safely, the corrected slice surface (angle everywhere below $\theta_{\text{max}}$), final GCode (parts of the surfaces are now sliced to avoid collisions).</figcaption></figure>

## 2.3. Slice interpolation

After optimization we obtain the top and bottom slicing surfaces $S_t$ and $S_b$, optimized respectively for the top-facing and bottom-facing features of the model. During slicing we use a family of slicing surfaces, each positioned at a given height. If we were to use a translation of (e.g.) $S_t$ everywhere, we would align the curved trajectories only with the top surfaces. To obtain trajectories aligned with both the tops and bottoms, we interpolate the slicing surfaces at different heights between the top/bottom surfaces $S_t$ and $S_b$.

<figure><img src="image_7.png" /><figcaption>**Figure 6:** Zelda shield. a) Planar print. b) Ours with a compromise between curving and steepening ($\theta_{\text{max}} = 27^\circ$). Path orientations follow the maximum principal curvature (please zoom).</figcaption></figure>

A first approach. A first possibility is to position $S_t$ as the top most slice, $S_b$ as the lowest, and perform interpolation in between at regular intervals. This works very well when the part has single large top/bottom surfaces, e.g. shells or height fields. However, in general the slicing surfaces will not align with top/bottom facing regions appearing at intermediate heights, as illustrated in Figure 7.

<caption>**Figure 7:** Interpolated slices from $S_t$ (blue) and $S_b$ (red) no longer align with features at intermediate heights (red arrows).</caption>

Such a misalignment is especially unfortunate as $S_t$ in Figure 7 would have otherwise perfectly reproduced the intermediate top-facing feature. Clearly, a better interpolation would have postponed deforming $S_t$ until the intermediate feature was captured. We present below one common special case where this can be easily achieved, and leave generalization as future work.

**Separating heights.** In many cases, the top-facing and bottom-facing features of a part can be separated between two heights $h_t$ and $h_b$ — see the inset Figure. It then becomes possible to ensure that $S_t$ (respectively $S_b$) is used on all top-facing (respectively bottom-facing) features. In this case the interpolation of slicing surfaces occurs only within the $[h_b, h_t]$ interval. The interpolation is linear, such that the average of $S_t$ and $S_b$ is met at $\frac{h_b+h_t}{2}$. Our results use this approach unless a separating plane cannot be found, in which case it reverts to the simpler interpolation.

<figure><img src="image_8.png" /></figure>

**Implementation notes.** During interpolation the inter-spacing between slices varies. We select the set of slices such that the (vertical) thickness between slices never exceeds a maximum distance $\tau$. The thickness will however become smaller than $\tau$ in compression areas. We adjust the material flow accordingly during deposition. Support structures are sliced similarly to the part, interpolating slicing surfaces from the print bed towards $S_b$ just below the part.

## 2.4. Deposition orientation

We generate toolpaths in a top-view, flat version of the layer. The toolpaths are then lifted onto the slicing surface, adjusting flow
<figure><img src="image_9.png" /><figcaption>**Figure 8:** Left: Top and bottom slicing surfaces surrounding the printed bird model, with supports. Right: Final print.</figcaption></figure>

<figure><img src="image_10.png" /><figcaption>**Figure 9:** Top: A wing model printed with supports, the left part is curved while the right, more vertical region is sliced with steepening. Bottom: First layer (left) and all layers (right). Both side of the wing are produced with large non-planar areas where possible.</figcaption></figure>

based on the local distortion [ERP*19]. We optionally generate toolpaths with an orientation based on curvature, building upon the work of Chermain et al. [CZM*23]. In this case the user chooses the orientation as an angle wrt. the maximum curvature. Figure 1 uses a 45 degrees angle, while Figure 6 aligns with the maximum curvature. When paths follow the maximum curvature the slice deformation naturally elongates them, minimizing flow adjustment.

## 2.5. Results and conclusion

We show a gallery of results in Figures 6, 9, 8, 10 and 11. Our slicer produces results in a few minutes at most on shown cases, the main cost being the least-square optimization of the slicing surfaces. On a 4GHz i7-4790K CPU, 32GB RAM, NV GTX 980, the wing from Figure 9 took 1min43s for ours and 3min12s for CurviSlicer. Note that we use CurviSlice commit #1ea03fe with command line `--skipalign -r 100` to disable slice top alignment and allow very thin slices, otherwise CurviSlicer would not terminate after 1

<figure><img src="image_11.png" /><figcaption>**Figure 10:** Left: 3D Model surrounded by top and bottom slicing surfaces. Middle: All layers (top) and first layer above supports (bottom). Right: First layers during fabrication.</figcaption></figure>

<figure><img src="image_12.png" /><figcaption>**Figure 11:** Left: A plate with a wavy surface, comparing flat printing (left) to our technique (right) with the same number of slices.</figcaption></figure>

hour. The bird from Figure 8 took 4min59s with ours, and failed after 50min with CurviSlicer (same settings). Our approach is more efficient and robust, it does not require an expensive tetmesh construction, and it is compatible with standard slicer features such as supports and complex infills.

Interpolating from two surfaces is sufficient on many objects, but is limited on complex shapes with multiple vertically stacked surfaces. The principle could be generalized to more than two base surfaces. Finally, excessive slice compression could be addressed by locally and hierarchically decimating layers [EFE18].

**Acknowledgments** We thank Xavier Chermain and Eric Garner for insightful discussions about non-planar additive manufacturing, as well as Vincent Belle for crucial technical help with manufacturing. Figures use Thingiverse models 3272612, 1030921, 2677486, 1036458 and 401058.

## References

[AWHZ19] AHLERS D., WASSERFALL F., HENDRICH N., ZHANG J.: 3d printing of nonplanar layers for smooth surface generation. In *IEEE CASE* (2019), pp. 1737–1743. 1, 2

[CZM*23] CHERMAIN X., ZANNI C., MARTÍNEZ J., HUGRON P.-A., LEFEBVRE S.: Orientable dense cyclic infill for anisotropic appearance fabrication. *ACM TOG* 42, 4 (2023). 1, 4

[DWW*18] DAI C., WANG C. C. L., WU C., LEFEBVRE S., FANG G., LIU Y.-J.: Support-free volume printing by multi-axis motion. *ACM TOG* 37, 4 (jul 2018). 1

[EFE18] EZAIR B., FUHRMANN S., ELBER G.: Volumetric covering print-paths for additive manufacturing of 3d models. *Computer-Aided Design* 100 (2018), 1–13. 4

[ERP*19] ETIENNE J., RAY N., PANOZZO D., HORNUS S., WANG C. C. L., MARTÍNEZ J., MCMAINS S., ALEXA M., WYVILL B., LEFEBVRE S.: Curvislicer: slightly curved slicing for 3-axis printers. *ACM TOG* 38, 4 (jul 2019). 1, 2, 4

[FZH*24] FANG G., ZHANG T., HUANG Y., ZHANG Z., MASANIA K., WANG C. C.: Exceptional mechanical performance by spatial printing with continuous fiber. *Additive Manufacturing* 82 (2024), 104048. 1

[GJ*10] GUENNEBAUD G., JACOB B., ET AL.: Eigen v3. http://eigen.tuxfamily.org, 2010. 3

[HL18] HORNUS S., LEFEBVRE S.: Iterative carving for self-supporting 3D printed cavities. In *Eurographics 2018 - Short Papers* (Apr. 2018). 3

[LZC*24] LIU T., ZHANG T., CHEN Y., HUANG Y., WANG C. C. L.: Neural slicer for multi-axis 3d printing. *ACM TOG* 43, 4 (2024). 1

[PGB03] PÉREZ P., GANGNET M., BLAKE A.: Poisson image editing. *ACM TOG* 22, 3 (jul 2003), 313–318. 3

[ZFH*22] ZHANG T., FANG G., HUANG Y., DUTTA N., LEFEBVRE S., KILIC Z. M., WANG C. C. L.: S3-slicer: A general slicing framework for multi-axis 3d printing. *ACM TOG* 41, 6 (nov 2022). 1