3Dプリンタで斜めの平面や曲面を滑らかに印刷するNon-planar slicing

# 何ができる？

![top.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/45036/bbf01258-c6c2-eb59-c202-53ecb15c765a.png)

本記事は、3Dプリンタで斜めの平面や曲面を滑らかに印刷できるようにする方法を紹介します。

といっても3Dプリンタを大きく改造するわけではなく、**ソフトウェアによって**実現します。

# Non-planar slicingとは？

FDM方式の3Dプリンタ（フィラメントに熱を加えて積層することで印刷する一般的なタイプの3Dプリンタ）を使用したことのある方ならわかると思いますが、**FDM方式の3Dプリンタで斜めの面や曲面を持つ形状を印刷すると、その表面がギザギザとした階段状になってしまいます。**特に傾きが緩やかな場合には、ギザギザが目立ちます。

これにはスライシングという工程が関係しています。3Dプリンタは3Dデータを印刷しますが、3Dプリンタは3Dデータそのものではなくツールパス等を含むG-codeと呼ばれるデータを読みます。3DデータからG-codeデータに変換する工程をスライシングといい、[Cura](https://ultimaker.com/ja/software/ultimaker-cura)、[Simplify3D](https://www.simplify3d.com/)などが代表的なスライサー（スライシングを行うソフトウェア）です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/45036/2c9ef580-0dce-0397-e540-74ff98eae7c6.png)
↑Curaでモデルをスライシングした様子。船のモデルが水平なレイヤーに分割されている。

FDM方式の3Dプリンタは3D形状を複数の層に分け1層ずつ印刷するので、スライシングにおいては3DデータをZ軸に垂直な平面で細かくスライスし、それを積み重ねていくように印刷するようなG-codeを生成します。その結果、Z軸に垂直でない斜めの平面や曲面が3Dデータに存在していると、その面がスライシングによって細かく分割されてギザギザの階段状になってしまうのです。

しかし、せっかく3DプリンタのX, Y, Z軸は同時に独立に制御できるわけですから、**斜めの平面や曲面はその面に沿った層として印刷するようにすれば、表面がギザギザにならず滑らかになるはずです。**これを実現するのがNon-planar slicingです。

# 実現方法

Non-planar slicingを実際に試してみる方法を見ていきます。

## ソフトウェア

スライシングは3DプリンタでなくPCで行う工程のため、PCでNon-planar slicingを行いさえすれば基本的には3Dプリンタ側に変更を加えることなく滑らかな印刷が可能になります（実際には多少手を加える必要がありますが）。
通常のスライサーはNon-planar slicingに対応していないため、PCに特殊なスライサーを導入する必要があります。

私が試したNon-planar slicing対応のスライサーは以下の2つです。どちらも無料で使えます。

### [Slic3r mod](https://github.com/Zip-o-mat/Slic3r/tree/nonplanar)

[Slic3r](https://slic3r.org/)というオープンソースの有名なスライサーを改造しNon-planar slicingに対応させたものです。本記事では便宜上「Slic3r mod」と呼ぶことにします。
[Daniel Ahlers氏の修士論文](https://tams.informatik.uni-hamburg.de/publications/2018/MSc_Daniel_Ahlers.pdf)が元になっており、本論文に詳細があります。斜めの平面や曲面を検出し、エクストルーダーとモデルの衝突が起こらないかチェックし、最後に曲面とツールパスを生成するという段階的な方法をとっているようです。
既存のソフトウェアを改造したものなので、GUIもSlic3rのものを踏襲しており使いやすいです。もちろんNon-planar slicingを無効にして通常のスライサーとして使うこともできます。

公式の紹介動画は[こちら](https://youtu.be/km1lvuva5mI)

### [CurviSlicer](https://github.com/mfx-inria/curvislicer)

[CurviSlicer: slightly curved slicing for 3-axis printers](https://dl.acm.org/doi/10.1145/3306346.3323022)という論文が元になったスライサーです。曲面を検出しそれに沿ったツールパスを生成する前者とちがい、問題を何らかの最適化問題に変換してそれを解くことでNon-planar slicingを実現するようです。従って、表面のみを滑らかにする前者と違い、モデル全体を滑らかに押しつぶすような感じで滑らかにスライスするようです（[YouTube動画](https://youtu.be/qtJo92X_bRU)）。

しかし、インストールが面倒であること、CLIツールであり使いにくいこと、最適化計算が非常に重いためハイスペックなPCでも小さなモデルのスライシングに数分かかること、サンプルとして提供されたモデル以外では計算が収束しない場合が多いことなど完成度にかなり問題があり、使用するのを諦めました。

## インストール

[Slic3r mod](https://github.com/Zip-o-mat/Slic3r/tree/nonplanar)のREADMEに従いインストールします。私はUbuntu 18.04で確認しました。Windows上で動かすのは少し難易度が上がるようです。

## 3Dプリンタ側の準備

通常の印刷と違い、Non-planar slicingにより生成されたツールパスは印刷中にZ軸が上下に動きます。そうするとモデルによってはエクストルーダー周りの部品とぶつかってしまい印刷ができません。

Non-planar slicingがしやすいプリンタは、エクストルーダー周りにスペースがあり、モデルとエクストルーダー周りの部品がぶつかりにくいようなプリンタです。エクストルーダーの先端がほとんど出っ張っていないようなプリンタでは、少しでもモデルに凹凸があるとぶつかってしまうため、表面が平らに近いような造形物でないと印刷できないかもしれません。

私が使用したのは[Creality Ender 3 Pro](https://www.creality3dofficial.com/products/creality-ender-3-pro-3d-printer)という安価で人気のプリンタです。このプリンタはエクストルーダーが7.5 mmほど出っ張っているため多少凹凸があるモデルにも対応できます。しかし印刷範囲を最大化するため多少手を加えます。

![cover.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/45036/f93c6fdf-861f-47f2-2485-9801f6a94fb2.png)

アレンキーを用いてエクストルーダーのカバーを外し、写真左のエクストルーダーについているシリコーン製のカバー（黄色枠内）を外すだけです。外すと写真右のように金属が露出します。なお、カバーを外すと印刷失敗時にエクストルーダーに溶けたフィラメントがくっつきやすくなるため、普段はカバーを付けておくことをお勧めします。


## モデルの制限

Non-planar slicingはまだまだ発展途上の技術であり、現状ではかなり制限が多いです。実際に印刷する前に、まず今回使用するSlic3r modでどのようなモデルが印刷できるかについて説明します。

1. まず、サポートの使用は非推奨です。これはエクストルーダーがサポートと干渉するおそれがあるためです。サポート構造がモデルの下の方にしかないなど、サポートとエクストルーダーが干渉しないことが分かっている場合にはサポートを使えますが、もし干渉する場合でもスライサー側で警告などは出ないため自己責任で行う必要があります。

2. 同様の理由で、スカートをファーストレイヤーより高く印刷する場合も、スカートとエクストルーダーが衝突しないように注意が必要です。

3. アダプティブレイヤーハイトは使用できません。

また、斜めの平面や曲面の形状は、`Maximum nonplanar angle`と`Maximum nonplanar height`の2つのプリンタ固有のパラメータにより制約されます。

- `Maximum nonplanar angle`: 許容される面の角度の最大値です。
- `Maximum nonplanar height`: 許容される面の高さの最大値です。

![Extruder image](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/45036/80a1e299-9345-2b30-b13f-09dad7ead5a5.png)

上の図は3Dプリンタのエクストルーダー付近の模式図ですが、`Maximum nonplanar angle`と`Maximum nonplanar height`はこの図中に示した値になります。プリンタごとにこれを測定して値を決めます。
Ender 3 Proの場合、`Maximum nonplanar angle`は`45°`、`Maximum nonplanar height`は`7.5 mm`とするとよいでしょう。

## スライサー設定

`Maximum nonplanar angle`と`Maximum nonplanar height`の設定は、`Print Settings`の`Layers and perimeters`から行います。

その他の設定は通常のSlic3rと同様です。

印刷に関するパラメータは、レイヤー高さを`0.2 mm`、外周のレイヤーを`3層`ずつ、インフィルを`20%`としました。

## Slic3r mod使用上の注意

`Maximum nonplanar angle`や`Maximum nonplanar height`に違反したモデルをスライスしようとした場合など、Non-planar slicingに失敗した場合はコンソールにエラーが吐かれます。**GUI上ではエラーや警告はないので注意してください。**
この場合、生成されたツールパスはNon-planar slicingでなく通常のスライシングを行ったツールパスになります（おかしなツールパスが生成されることもあります）。

以下がエラーの例です。

```
Surface removed: area too small (0 mm²)
Surface removed: area too small (0 mm²)
Surface removed: area too small (0 mm²)
Surface removed: area too small (0 mm²)
Surface removed: area too small (0 mm²)
Surface removed: area too small (0 mm²)
Surface removed: collision on layer 5.2mm (105.668 mm²)
Surface removed: collision on layer 5.2mm (105.667 mm²)
Surface removed: collision on layer 5.2mm (106.709 mm²)
Surface removed: collision on layer 5.2mm (105.646 mm²)
```

また、Slic3r modには**何度か連続でモデルを追加→スライス→削除を繰り返すとうまくスライシングができなくなるバグがあるようです。**毎回Slic3rを再起動することをお勧めします。

# 印刷結果

Non-planar slicingの効果を検証するため、4種類のモデルを実際に印刷し、通常のスライシングと結果を比較しました。

## 翼断面

![simple.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/45036/728432cd-3a22-abb9-d9fe-0b791706de78.png)

画像上側が通常のスライシング、画面下側がNon-planar slicingです。
通常のスライシングでは表面が階段状になっているのに対し、Non-planar slicingでは最上層が表面の曲面に合わせて湾曲しているため、表面が階段状にならず滑らかなのがわかります。

しかし、右端ではプリンタのZ軸が下に行き過ぎてしまい、少し樹脂が盛り上がってしまいました。これはスライサーの問題ではなくプリンタの精度の問題と考えられます。

## 凹面

![concave.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/45036/53c699d5-2cb0-ee41-b582-d87e34c89c09.png)

凹面についてもNon-planar slicingで表面を滑らかにすることができました。

しかし、翼断面の例よりも傾きが急であったせいか、側面を見ると表面のレイヤーとその下のレイヤーが完全に接合しておらず、隙間ができてしまっていることがわかります（下の写真に示しています）。これにより表面が若干上に浮き出たような形になってしまっています。

Non-planar slicingでは印刷中にZ軸がダイナミックに動くため、Z軸方向の精度が非常に重要になります。通常の印刷で問題ない精度でも、Non-planar slicingでは印刷の形が崩れる原因となってしまいます。私のプリンタではZ軸の調整をすることで凹面の浮きや翼断面端の盛り上がりは多少改善しましたが、完全に無くすことはできませんでした。Non-planar slicingを試す際は、Z軸の精度が高精度に出ているプリンタを使用することをお勧めします。

![concave_failure.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/45036/ff571415-269a-d70c-42b4-b6b5aa9ad2fe.jpeg)

## 段差のある形状

![2steps.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/45036/540cb46d-e11e-64f8-d0e5-6b8b60e89138.png)

今までの例はすべて表面が連続的な面でしたが、このように段差のある形状でもNon-planar slicingを使用することができます。

## 急な斜面

![40deg.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/45036/f34088af-17f1-02c8-c876-43db71471b0c.png)

傾斜角40°の斜面を印刷してみました。この角度でもNon-planar slicingを用いて印刷できますが、無理のある角度でフィラメントを吐出しているので表面はかなり汚くなります。そもそも角度が急な場合は通常のスライシングできれいに印刷できるので、Non-planar slicingを使用するメリットは少ないといえます。

# おわりに

無料のツールを用いて斜めの平面や曲面を滑らかに印刷することができるということがわかりました。

綺麗に印刷するには、モデルの面の傾きが重要であったり、プリンタの精度も求められたりなどハードルは低くはありませんが、緩やかで滑らかな表面を3Dプリンタで表現したい場合には役に立つのではないでしょうか。

また、Non-planar slicingを使用する面と使用しない面を個別に設定するなど、もっときめ細かな設定ができればより使いやすくなると感じました。

まだ完成度は低く問題も多いですが、開発者の方はSlic3rメインラインへのマージを実現したいと考えているようなので、今後の発展に期待したいと思います。

# 参考

[Achieve true 3D printing with non planar slicing](https://youtu.be/gmePlcU0TRw)
英語ですがわかりやすい解説動画です。