3DプリントとモデリングのためにSTLをOBJに変換する方法
STLとOBJの比較:2つのフォーマットの本当の違い
STLとOBJはどちらも3D界の定番ですが、互換性があるわけではありません。それぞれが保持するデータは異なり、その違いを知ることで、変換が有益な場合と単なる手間仕事になる場合を見極めることができます。 STLファイルは、いわば機械の中の幽霊です。表面のジオメトリ情報、つまり頂点座標と法線ベクトルで記述された三角形の面の単純なメッシュしか保存しません。それだけです。色も、テクスチャも、マテリアルのプロパティもありません。このフォーマットは1987年に3D Systems社が自社の光造形機のために開発したもので、その最低限の性質が強みであり、最大の弱点でもあります。機械部品の典型的なSTLは、5万から50万の三角形で構成されていることが多いです。 一方、ほぼ同時期にWavefront Technologies社によって作られたOBJファイルは、はるかに多くの情報を記述できます。ジオメトリだけでなく、OBJファイルはコンパニオンとなるMTL(Material Template Library)ファイルを参照でき、そこには表面の色、鏡面反射、透明度、テクスチャマップなどが定義されています。OBJはまた、四角形やNゴンといった3つ以上の辺を持つポリゴンや、フリーフォームカーブもサポートしていますが、実際に使われることは稀です。 単に3Dプリントするだけなら、STLでほとんどの場合十分です。OBJの真価が発揮されるのは、レンダリング、ゲーム開発など、見た目の品質が重要になるパイプラインです。スライサーからBlenderにモデルを移して製品ショットを作成したり、Unityのようなゲームエンジンにアセットを送ったりする場合、OBJ(またはその現代版であるFBXやGLTF)は、単なる生のジオメトリよりもはるかに多くの情報をツールに提供してくれます。 はっきりさせておきたいのは、STLからOBJに変換しても、色やテクスチャのデータが魔法のように現れるわけではないということです。変換は、同じ三角形分割されたジオメトリを別のパッケージに包むだけです。テクスチャ付きのモデルが必要なら、変換後に3Dアプリケーションでテクスチャリング作業を自分で行う必要があります。
STLからOBJへの変換が本当に必要なとき
変換のためだけに変換するのはやめましょう。まず、自分のワークフローで本当にOBJファイルが必要なのかを確認してください。多くの場合、それは不要なステップです。 変換する最も一般的な理由は単純です:ソフトウェアの互換性です。一部のモデリングツールやゲームエンジン、特に古いものは、STLファイルとの相性が良くありません。全くインポートできないか、ジオメトリを破壊して面を裏返してしまうことがあります。例えば、Autodesk MayaのOBJインポータは、STLサポートよりもはるかに成熟しており信頼性があります。スキャンデータやCADのエクスポートデータをMayaに取り込んでさらにモデリングする場合、先にOBJに変換しておくのは、頭痛の種を減らすプロの動きです。 複数のパーツからなるアセンブリも、OBJに切り替える絶好の理由です。12個の別々のコンポーネントがすべて1つのシェルに統合された機械筐体のSTLを想像してみてください。OBJ形式では、名前付きのグループ('g'タグを使用)を定義でき、これにより下流のソフトウェアで個々のパーツを選択して操作できます。これはBlenderで非常に役立ち、OBJグループは便利なことに別々のメッシュオブジェクトとしてインポートされます。 ビジュアライゼーションスタジオやレンダーファームは、彼らのパイプラインがOBJを基本的な交換フォーマットとして構築されているため、しばしばOBJを要求します。Houdini、Cinema 4D、KeyShot 11のようなツールは、OBJを開いてすぐにマテリアルの適用を開始できます。一方、STLは、本格的なシェーディング作業を始める前に、デフォルトのマテリアルを割り当てるという余分なステップが必要になることがよくあります。 最後に、Three.jsのようなライブラリを使ってウェブサイトに3Dモデルを配置する場合、OBJは広くサポートされていますが、STLはそうではありません。ウェブやARアプリケーションでは、最終的に本番用にGLTFのようなウェブ最適化フォーマットに移行する前の、堅実な出発点としてOBJが適しています。 しかし、はっきり言います。FDMやレジン方式のプリンターにファイルを送り、お使いのスライサー(Chitubox、PrusaSlicer、Bambu Studio)がSTLを問題なく開けるのであれば、そこで止めてください。変換する必要はありません。あなたの作業はすでに完了しています。
CocoConvertを使ってSTLをOBJに変換する方法
CocoConvertを使ったこの変換は非常に簡単で、ブラウザ内で完結するため、ソフトウェアをインストールする必要がありません。標準プランでは最大500MBのファイルに対応しています。 まず、/convert/stl-to-obj の変換ページにアクセスします。大きなドラッグ&ドロップエリアが表示されます。デスクトップからSTLファイルを直接ドラッグするか、クリックしてファイルピッカーを開くことができます。バイナリ形式とASCII形式の両方のSTLファイルに対応しており、どちらがアップロードされたかを自動的に判別します。 ファイルがアップロードされると、簡単な分析が実行されます。通常、50MB未満のファイルであれば2〜5秒しかかかりません。200MBを超える高密度のメッシュの場合は、もう少し時間がかかります。その後、三角形の数とファイルサイズの概要が表示されます。ここで、単一のOBJファイルをダウンロードするか、OBJと基本的なMTLスタブの両方を含むZIPアーカイブを取得するかを選択できます。私はZIPの取得をお勧めします。この小さなMTLスタブは、デフォルトのグレーのマテリアル(Kd 0.8 0.8 0.8)を定義し、他のアプリで面倒な「マテリアルが見つかりません」という警告を防ぐことができます。 「変換」をクリックすると、ファイルは数秒で準備完了です。約280万個の三角形を持つ150MBのバイナリSTLなら、処理には約25〜40秒かかるはずです。 さて、正直なところ、いくつかの制限事項もあります。CocoConvertは変換中にメッシュの修復を行いません。ソースのSTLが非多様体エッジ、穴、反転した法線などでめちゃくちゃな場合、出力されるOBJも同様になります。ひどい3Dスキャンデータと格闘したことがある人なら誰でも知っていますが、自動修復は別個の、しばしば骨の折れるステップです。そのためには、Microsoft 3D BuilderやMeshmixerのような専用ツールが必要です。また、CocoConvertはメッシュを単純化しません。巨大な500MBのSTLは、巨大なOBJになります。もっと小さなファイルが必要な場合は、変換前または変換後にBlenderのようなツールでデシメーション(ポリゴン数削減)する必要があります。
代替手段:Blender、MeshLab、そしてCADツール
ブラウザツールは手軽な作業には最適ですが、デスクトップソフトウェアはより複雑なプロジェクトに必要な制御を提供してくれます。 Blenderは、この種の作業におけるスイスアーミーナイフのような存在です。無料で、どこでも動作し、完全な制御が可能です。STLをインポートし(ファイル > インポート > STL)、OBJとしてエクスポートします(ファイル > エクスポート > Wavefront (.obj))。魔法はエクスポートダイアログにあります。「前方軸」と「上方向の軸」をターゲットアプリの座標系に合わせて設定したり、MTLファイルを生成するかどうかを選択できます。重要なのは、モデルの法線が反転している場合、エクスポート前に編集モードでShift+Nを押すだけで修正できることです。これは、オンラインツールでは不可能な手動修復の一種です。 本当に巨大なファイルには、MeshLabがヘビー級のツールです。この無料のオープンソースツールは、巨大なメッシュの処理に特化して作られており、500万面を超えるファイルをブラウザベースのコンバータよりも高速かつ確実に処理することがよくあります。プロセスは簡単です。STLを開き、「ファイル > メッシュをエクスポート」に進み、OBJを選択します。ダイアログには、法線、色、テクスチャ座標のトグルが表示されます。 もしSolidWorks、Fusion 360、またはFreeCADの元のCADファイルにアクセスできるなら、今やっていることを止めて、そちらに戻ってください。ソースから直接OBJをエクスポートするのが、常に最もクリーンな方法です。これにより、テッセレーション(ポリゴン化)の前にメッシュの細分化設定を制御でき、ほぼ常にクリーンなメッシュを生成できる「二重テッセレーション」(CADからSTLへ、そしてOBJへ)という厄介な問題を避けることができます。 大量の変換を自動化したい場合は、オープンソースのコマンドラインツールassimp(Asset Importer Library)が最良の友です。「assimp export input.stl output.obj」という単一のコマンドで作業が完了します。これは、何十ものファイルを処理する必要がある場合に、PythonスクリプトやCIパイプラインに統合するのに最適です。
変換後のOBJファイルのチェック方法
変換が完璧にうまくいったと決めつけないでください。今、60秒の簡単なチェックを行うことで、後々の何時間ものフラストレーションを節約できます。 まずは簡単な目視検査から始めましょう。OBJを軽量なビューア—Windowsの3Dビューアー、macOSのプレビュー、または3D Viewer Online(3dviewer.net)のようなオンラインツール—で開いて、ただ見てみてください。モデルを回転させてみましょう。奇妙な黒いパッチはありませんか?それらはおそらく反転した法線です。穴や二重になったジオメトリは見えますか?これらの問題は通常、ソースのSTLに元々含まれていますが、見つけるのは今です。 テキストエディタを使うことに抵抗がなければ、ファイルを開いてみてください。OBJは単なるプレーンテキストです。VS CodeやNotepad++で見ると、一番上に「mtllib filename.mtl」という行(そのオプションを選択した場合)、次に「v」(頂点)と「vn」(頂点法線)の行の大きなブロック、そしてそれに続く「f」(面)の行が見えるはずです。もし頂点より前に面が定義されていたら、そのファイルは壊れています。 より定量的なチェックとして、三角形の数が一致していることを確認してください。OBJファイル内の「f 」で始まる行の数は、ソースSTLの三角形の数と同じであるべきです。テキストエディタで「f 」を検索すれば、その出現回数を数えられます。大きな差(0.1%以上)がある場合、解析プロセスで何か問題が起きたことを意味します。 OBJを3Dプリンタのスライサーに送る場合、最後のチェックが重要です:スケールです。PrusaSlicerやBambu Studioにインポートして、寸法が正しいか確認してください。初心者がよくやる間違いは、単位の不一致により50mmのパーツが50,000mmとして表示されることです。STLは単位を持たないため、混乱を引き起こすことがあります。もしこうなっても慌てないでください。スライサーで0.001倍にスケールダウンするか、より良い単位設定で再エクスポートするだけです。
3Dプリント用とレンダリング用、それぞれのOBJファイルの最適化
3Dプリント用に最適化されたOBJファイルは、レンダリング用に最適化されたものとは異なります。いくつかの的を絞った調整で、どちらのワークフローでも大きな違いが生まれます。 3Dプリントでは、ジオメトリがすべてです。スライサーは「ウォータータイト」(水密、またはマニフォールド)なメッシュを必要とします—穴がなく、自己交差もなく、すべてのエッジが正確に2つの面によって共有されているクリーンなサーフェスです。変換後、OBJを修復ツールにかけるのが賢明です。PrusaSlicerはインポート時にこれを自動的に行いますが、Meshmixerの「解析 > インスペクタ」を使って問題を見つけて修正することもできます。また、曲面で目に見える角張りを避けるために、十分な数の三角形を維持したいものです。0.2mmの積層ピッチを持つFDMプリンターの場合、経験則として、三角形の一辺が約0.1mm以下になるようにすると良いでしょう。 レンダリングでは、優先順位が全く変わります。ここでは、膨大な三角形の数が敵です。レンダリングを遅くし、編集を苦痛にします。もしあなたのOBJがフォトグラメトリスキャンや数百万の三角形を持つ高解像度のCADエクスポートから来たものなら、おそらくデシメーション(ポリゴン数削減)すべきです。Blenderの「デシメート」モディファイヤはこれに最適です。「比率」を0.1〜0.3に設定すると、200万の三角形を持つモデルを、一般的なカメラ距離ではほとんど見た目の違いなく20万の三角形にまで積極的に削減でき、ワークフローを劇的に高速化できます。 マテリアルの設定は、レンダリングにおけるもう一つの重要な要素です。CocoConvertから得られるMTLスタブは出発点であり、最終製品ではありません。Blenderのシェーダーエディターでは、「プリンシプルBSDF」の設定を調整する必要があります—「粗さ」を調整し、金属の場合は「メタリック」を1.0に設定し、テクスチャ画像があればそれを接続します。Unityのようなゲームエンジンの場合、OBJをインポートする前に、MTLファイル内のマテリアルエントリの名前をプロジェクトのマテリアルライブラリと一致させる必要があるかもしれません。
よくあるエラーとその修正方法
STLをOBJに変換する際には、同じいくつかの問題に何度も遭遇することになります。幸いなことに、修正方法はたいてい非常にシンプルです。 断トツで最も一般的な頭痛の種は、反転した法線です。これにより、モデルの一部が黒く見えたり、透けて見えたりします。これは、ソースのSTLに一貫性のない法線データがあったために起こります。修正は簡単です。Blenderでは、編集モードで全てのジオメトリを選択し、「メッシュ > ノーマル > 面の向きを外側に揃える」を使用します。MeshLabでは、「フィルタ > Normals, Curvatures and Orientation > Re-Orient all faces coherently」に進みます。数クリックで問題は解決します。 もう一つの典型的な問題はスケールです。モデルが非常に小さく、あるいは巨大にインポートされてしまいます。これはSTLファイルが単位を保存しないためです—「25.4」という値はミリメートルなのかインチなのか?ソフトウェアは推測するしかありません。元のCADツールがミリメートル(SolidWorksなど)やインチを使用していたことがわかっていれば、ターゲットアプリケーションのインポート設定で25.4(またはその逆数)のスケール係数を適用することで、すぐに修正できます。 時々、MTLファイルが見つからないというエラーが出ることがあります。これは、アプリケーションがOBJと一緒にマテリアルライブラリを期待している場合に発生します。CocoConvertから取得しなかったり、紛失してしまったりした場合は、自分で作成できます。OBJと同じ名前で拡張子が.mtlの新しいテキストファイルを作成するだけです。その中に「newmtl default」「Kd 0.8 0.8 0.8」「Ka 0.0 0.0 0.0」「Ks 0.0 0.0 0.0」という4行を貼り付けます。同じフォルダに保存すれば、警告は消えるはずです。 300MBを超える巨大なファイルを扱っている場合、CocoConvertのようなブラウザベースのツールが苦戦したりタイムアウトしたりしても驚かないでください。そんな時は、MeshLabやassimpコマンドラインツールのようなデスクトップアプリケーションに切り替える時です。それらは、汗をかくことなく巨大なデータセットを処理できるように作られています。可能であれば、巨大なアセンブリを変換前に小さなパーツに分割するのは、さらに良い戦略です。