milvinae

web & product design.

  • 大事故!BambuP1Sでのマルチカラー印刷の注意点

    大事故!BambuP1Sでのマルチカラー印刷の注意点

    昨今、一般家庭でも超簡単に安価でハイクオリティな3Dプリンタが手に入る時代になりました。
    難しくて手が出せなかったフィラメントごとの適切なパラメータ設定も、オフィシャルが細かく準備してくれています。
    Bambuの良いところは自社フィラメントだけでなく他社フィラメントも(マイナーな会社のものも!)パラメータを準備してくれているところです。
    オートレベリング機能のような自動化機能やモジュール化されたマシン設計など、徹底して初心者が使いやすいようになっているところもすごくいいです。

    3Dモデルデータですら、AIが作ってくれるようになりました。
    もっと普及が進んでデータのやり取りだけで製造は各家庭で行うようになると、いくつかの社会問題が緩やかに解消していく気がします。
    そうなるといいですよね。



    さて、わたしはBambu社のP1SとAMS2Proを使用しております。
    AMS2Proは旧版でできることに加え、送り出し引き戻しのモーターのグレードアップ・配置最適化によるメンテ性向上・そして乾燥機能!!!がついているので、高い金出しても余裕で価値があります。
    1つのAMSで4つまでフィラメントを管理できるので、同じ色のフィラメントを入れておいてフィラメント切れが起きてもすぐに切り替えることができたり、マルチカラー印刷を行ったり、できることがかなり増えます。
    中途半端にフィラメントが残ることがなくなるので経済性もありお勧めです。


    マルチカラー印刷は”複数の色でモデルを作れる”というだけでなく、素材の違うフィラメントを使って”サポート面の見た目の向上”を行うことが出来ます。
    これは非常に魅力的な機能です…!

    なぜなら、フィラメント1種類でプリントすると、モデルのサポートとの境界面は大抵荒れます。
    これはサポートとモデルが同じフィラメントなので、溶着してしまって荒れる、もしくはZオフセットを広げすぎて底面がキレイに定着せずふにゃふにゃになって荒れるからです。
    もはや熱溶融積層型3Dプリントの宿命であり、いかにサポートの数を減らす設計をするかが腕の見せ所でもありました。


    しかし、PLAとPETGはくっつきにくいという性質を利用すると、サポートとモデルが接する面だけ別素材にすることでサポート面をキレイにすることができるのです!
    https://wiki.bambulab.com/en/filament-acc/filament/h2d-pla-and-petg-mutual-support
      
    サポート面がキレイになっていますね!
    PETGは研磨痕が残りやすいので、プリント物を製品として出したい場合はなるべく研磨せずに済ませたいものです。
    この手法はぜひ知っていただきたい。

    ただし、P1Sは射出ノズルが一つなのでPLAとPETGを入れ替えしなければいけません。
    ようやく今回のテーマとなりますが、特性の異なるフィラメントを同時に使う時に注意しなければいけないことをお伝えしていこうと思います。






      1.フィラメント切れで再生産したとき、AMS内部のフィラメント合流点でつまりが発生する
    今まで1度しか発生していませんが、生産中にフィラメントが切れて別フィラメントで生産再開したときに発生しました。
    AMS内部のフィラメントの合流点に何かが詰まり、そこから先にフィラメントが送られなくなります。
    私が試した方法は、”リリースボタンを押しながら前から後ろからフィラメントでつつく”です。
    フィラメントを差し込みながらリリースボタンを押したり離したりすると、微妙な押し具合の時にスッとフィラメントが通る瞬間があります。
    何度かフィラメントをスコスコしているとつまりが解消されます。 




      2.別素材でサポートすると、モデルとの境界面が大きくオフセットされる
    サポート面の美化のために別素材でサポート境界面を作ると、モデルと同じ素材でサポートしたときよりも境界面が広くなります。
    広くなるだけなので特に気にしなくてもいいのですが、サポートブロッカーとサポート補強を利用している場合にブロックしてる領域にオフセット分が入り込んでしまう場合があります。





      3.サポート面美化でPLAとPETGを使ったらエクストルーダーが詰まる
    大事故でした。
    サポート面美化でPLAとPETGを使う場合、どちらの素材をモデルに使うかでフィラメントパラメータが違います

    PLA:モデル・PETG:サポート境界面で生産したのち、何の気なしに素材を逆にして生産してしましました…。
    パラメータが違うことは分かっていたのに…。
    結果、サポート境界面印刷中にエクストルーダーにフィラメントが詰まりました。

    エクストルーダーを分解してみるも、本来簡単に外れるギアが全く外れません。
    隙間を覗くと、フィラメントを押し引きする部分に溶けたPLAフィラメントが詰まっているようでした。

    ハンマーとマイナスドライバーでギアをたたき出した結果、フィラメントが溶けて固まっていました。

    PETGをサポートにする場合、ノズル温度は265℃とかなり高めに設定されています。
    この設定のままモデルにPETGにした結果、チャンバー内の温度が高温になってPLA射出時にエクストルーダー内部がPLA融解温度(60℃あたり)に達してしまったのだろうと考えられます。
    このままリトラクト(引き戻し)した結果が詰まりが起きたようです。


    ここでさらに重要のなのが、エクストルーダーについているフィラメントセンサは、配線がめちゃくちゃ傷つきやすいということです!
    気付かないうちに配線に傷がついていました。(写真撮り忘れ…)
    組み立てなおしていざ生産…といった段で、カッターハンドルが引っ込んで動かないというエラーが発生して生産ができない状態になってしまいました。
    エラーコード:0300-800B
    https://wiki.bambulab.com/en/hmscode/0300800B-cutter-is-stuck

    配線をつけなおしても解消せず…。
    ほんとによくあることのようで、Redditも荒れております。
    こうなったらもうフィラメントセンサを買い替えるしかないのでした…。
    エクストルーダー周りのメンテや修理の際には配線を養生することをお勧めします。

    その後、パラメータを修復して生産したところPETGをモデルに使って生産完了することが出来ました。





    オフィシャルで公開しているサポート面美化のパラメータを書いておきますので参考にどうぞ。
    なお、オフィシャルでは以下の数値はBambu製PETG-HFとPLA-Basicを使った場合のものだそうです。
    他社フィラメントだけでなくBambuのPLA-Matteも成否不明とのことなので、自己責任で実施してみてください。
    一応、自前のP1SではPLA-Matteでも同じパラメータでうまくいきました。

    <モデル:PETG  サポート境界面:PLA>
    モデルPETG
    フィラメント設定
    initial layerother layerサポートPLA
    フィラメント設定
    initial layerother layer
    Print temperature
    Nozzle
    245245230230
    Smooth PEI plate /
    High temp plate
    60606060
    Textured PEI plate60606060


    <モデル:PLA  サポート境界面:PETG>
    モデルPLA
    フィラメント設定
    initial layerother layerサポートPETG
    フィラメント設定
    initial layerother layer
    Print temperature
    Nozzle
    230230265265
    Smooth PEI plate /
    High temp plate
    60606060
    Textured PEI plate60606060
    Max Volumetric speed10 mm2/s


    <共通サポート設定>
    support
    Enable supportchecked
    Typetree(auto)
    Support/raft basedefault or モデルと同じフィラメント
    Support/raft interfaceサポート境界面フィラメント
    Top Z distance0
    Bottom Z distance0
    Base patternrectilinear(直線グリッド)
    Top inerface layer3
    interface patternrectilinear(直線インターレース)
    Top interface spacing0
    <注意点>
    P1Sのような密閉型の場合はドアや天板を開けたほうがいいようです。
    溶ける温度が違う素材を使っているので熱がこもりすぎてしまうと溶融温度の低いPLAは溶けて詰まってしまうようです。


     
    まだまだお伝えしたいマルチカラー印刷の創意工夫はあるのですが、今日はこの辺で。

    Bambuは世界的にユーザが多いので、問題の切り分けもしやすいのがいいですね。
    そのうちH2Dも欲しいな!

    見ていただきありがとうございました。

     

  • FreeCADのRenderの使い方

    FreeCADのRenderの使い方

    ※下記内容はすべてWindows11向けです。
    ~~~~~~~~~~~~~~~~~~~~~~~

    ついでなのでRenderワークベンチの使い方について記録しておきます。
    使用するレンダーはCyclesです。

    まずは前の記事に従ってCyclesをセットアップします。
    ……できましたか?

    次に、モデルを準備します。
    igesでもstepでもstlでもFreeCADのPartsデータでも何でもいいです。
    特になかったらFastenersワークベンチでボルトでも生成しておいて下さい。
    ではRenderワークベンチを開きましょう。

    FreeCADにおけるRenderingの手順は以下の通りです。
    1.Projectを作る
    2.モデルにマテリアルを設定する
    3.カメラと光源を準備する
    4.モデル、カメラ、光源をプロジェクトに紐づける
    5.レンダー実行

    では追って解説していきましょう。
     

    1.Projectを作る
     前の記事で触れたとおり、FreeCADのレンダリングは外部レンダーを呼び出して実行しています。
     そのため、外部レンダーにひとまとまりの情報を渡す必要があり、Projectがそのひとまとまりとなっています。
     外部レンダーの種類ごとにProjectの種類が違うので気を付けましょう。
     今回はCycles projectを選択します。
     それぞれレンダーエンジンごとにプロジェクトが準備されていますが、基本的にはおなじ操作です。
     Project設定で主にいじるのはGround planeとRenderくらいでしょうか。

     Ground planeは、レンダリング時に地平を表示するかどうかの設定です。
     Colorは文字通り色、SizeFactorは地平の拡大率、Zは地平の高さを示しています。

     RenderHeight/Widthはレンダリング出力のピクセルサイズです。
     FHD(1080x1920)くらいにしておけばいいかと思います。





    2.モデルにマテリアルを設定
     マテリアルの宣言→モデルに適用の流れです。
     マテリアルは自作することも可能ですが、フリーのプリセットが数多く存在するのでそちらを使います。
     なるべく楽をしましょう。
     FreeCAD既存プリセットのほかに、ウェブで公開しているマテリアルもありますので合わせて説明していきます。
     

     <既存プリセットの選び方>
     Create Materialを選ぶ。


     プリセットを選択をクリックして、一覧から適当なものを選んでOK。
     名前は変えても変えなくても可。
     同名のマテリアルがある場合は変えておく。


     今回はAluminiumを選択。
     ツリービューのMaterialの中にマテリアルが追加されていることを確認する。
     マテリアルを適用したいモデルを選んで”プロパティビュー”ー”データ”を見ると、Materialの項目があるので作成したマテリアルに差し替える。
     これでマテリアルの設定は完了。

     

     次に公開マテリアルプリセットの選び方を解説します。 
     GPUOpenMaterialLibraryとAmbientCGMaterialLibraryがありますが、どちらも無料で公開されているので積極的に使っていきましょう。
     今回はAmbientのほうの使い方にフォーカスします。

     <Web公開されているプリセットの選び方>
     AmbientCG Material Library を開く。
     

     FreeCAD上でAmbientCG Material Libraryが開くので、適用したいマテリアルを探す。
     クリックすれば遷移していく。
     

     希望のマテリアルが見つかったら、1k~8kのJpegまたはPngをクリックしてダウンロード。
     ここでいうKは解像度を表しており、1kは長辺1080pxの画像データであることを意味している。
     kが上がっていけばより高精細なデータになるが重くなる。
     必要に応じたサイズのマテリアルを選択しよう。

     ダウンロードが完了すればマテリアルに追加される。
     モデルへの適用は既存プリセットと同じ。
     これで公開プリセットの選び方は完了。





    3.光源・カメラの準備
     見え方のシミュレーションには光源とカメラが必要です。
     準備していきましょう。

     カメラボタンを押してカメラを追加、電球ボタンから光源の種類を選んで光源を追加します。
     カメラはカメラですが、光源にはいくつか種類があります。
     興味がある方は下記URLを参照ください。
     https://github.com/FreeCAD/FreeCAD-render/blob/master/docs/Lights.md
     カメラと光源のプロパティを調整します。
     光源は種類によってプロパティが異なりますが、基本は光源の位置(Placement)、強さ(intensity)、方向(Direction)です。
     ※Sunの場合は無限遠に存在する体なので位置は存在しません。

     カメラの重要なプロパティは位置(Placement)、範囲(Near&Far Distance)、投影方法(Projection)です。
     レンダリングは光の反射などを追跡計算するので、描画する範囲を指定しないと計算が膨大になります。
     ですのでNear DistanceとFar DistanceでClippingする範囲を指定する必要があります。
     ProjectionはOrthographic(正投影)とPerspective(透視投影)があり、消失点が存在するのがPerspectiveです。




    4.プロジェクトへ紐づけ
     マテリアルを設定したモデル、カメラ、光源をレンダープロジェクトに紐づけます。
     ツリービューで、プロジェクトとモデル等をまとめて選択して”Rendering View”を押します。

     プロジェクト内に項目が追加されていればOkです。





    5.レンダリング実行
     実行したいプロジェクトを選択した状態で”Render project”を押します。
     

     無事レンダリングできました。


     
    …操作はシンプルでわかりやすいですが、正直、FreeCADのRender Workbenchは異常に重く時間が掛かりすぎるのでやんないほうがいいかもしれません。
    素直にBlenderなどでレンダリングしたほうがいいかと思います。
    https://wiki.freecad.org/Tutorial_Render_with_Blender/ja


    見ていただきありがとうございました。

     
  • FreeCADでGPUレンダリングする方法

    FreeCADでGPUレンダリングする方法

    ※下記内容はすべてWindows11向けです。
    ~~~~~~~~~~~~~~~~~~~~~~~


    CADソフトは世に数あれど、オープンソースで開発が進んでいるCADソフトはFreeCADだけでしょう。
    昨年2024年に満を持してVersion1.0正式リリースとなり、界隈の一層の発展が予想されるところであります。

    そんなFreeCADですが、数多くのワークベンチ(機能)が存在します。
    その一部にRenderというワークベンチがあります。

    これは作成したモデルにマテリアル情報を付与、カメラ・ライティングを設定して、”見え方”をシミュレートする機能です。
    3Dデータを実物に近づけることで、プロダクトアウトしたときとのギャップを減らすことが出来ます。

    そんな便利なレンダー機能ですが、機能実体はFreeCADの中にはなく、外部レンダーを呼び出しているのが実情です。

    レンダーソフトはAppleSeed、LuxCore、PovRayなどがありますが、GPUを使ってレンダリングするソフトは限られています。
    AppleseedはGUIを使った操作で多機能ですが、CPUレンダリングなので描画が遅いです。
    困りました。速いソフトが使いたい。

    そこで登場するのがCycles。
    Cyclesは、かのマルチメディアソフトBlenderに搭載されているパストレースレンダーであり、GPUを使った高速トレースが魅力のレンダーです。
    ありがたいことにFreeCADはCyclesレンダーをサポートしているのです。

    ですが、現時点(25年5月)ではCycles単体の配布は行われていないため、自前でコンパイルする必要があります。

    コンパイル方法は公式に従って進めていきます。
    https://projects.blender.org/blender/cycles/src/branch/main/BUILDING.md

    では下準備から。
    必要なのはGit、Cmake、Python3です。
    git   : https://gitforwindows.org/ or https://github.com/apps/desktop
    cmake : https://cmake.org/download/
    python3 : https://www.python.org/downloads/

    gitはGithubDesktopから導入するのが楽ですね。
    先だってアカウントを取得しておきましょう。

    cmakeは環境に合ったものをDL&インストールすればOKです。
    インストール時に ”Add Cmake to the System Path ~~” にチェックを入れることを忘れないようにしましょう。
    Python3もサイトで最新をDL&インストールすればOKです。
    もちろんインストール時に ”Add Python 3.xx to PATH” にチェックを入れましょう。

    全部インストールしたら、コマンドプロンプトでパスが通っているか確認します。
    git、cmake、python3をそれぞれ実行して、”操作可能なプログラムまたはバッチ ファイルとして認識されていません”とでないことを確認すればOKです。
    ※Python3のデフォルトエイリアスはpython3ですが、以前別のバージョンのPythonがインストールされてた場合望ましく呼び出されない場合があります。
    ”Python エイリアス”で調べれば解法が出てくるので自分でどうにかしてください。


    さて、下準備が終わったのでCyclesをコンパイルしていきます。

    1.Gitファイルを置くフォルダを任意の場所に作成(フォルダ名も何でもいい)
    2.作成したファイルでプロンプトを起動し、下記コマンドを実行
      git clone https://projects.blender.org/blender/cycles.git
    3.cyclesフォルダができるのでチェンジディレクトリしてmakeする
      cd cycles
      make update
      make
    4.makeを実行するとinstallフォルダができるので、その中にある”cycles.exe”のフルパスをコピーしておく


    これでCyclesがコンパイルできました。
    次はFreeCADに適用していきましょう。


    FreeCADのRenderワークベンチを選んで、Render Settingを開きます。
    Cyclesの設定があるので、Executableに先ほどコピーしたcycles.exeのパスを入れます。
    Testボタンを押してエラーが出なければOKです。

    ここで重要なのがRender parametersです。
    ここに --device CUDA を指定します。
    このパラメータを指定することでGPUレンダリングが有効になります。


    左はGPUあり、右はGPUなしのRender実行時のパフォーマンスです。
    いい感じですね!
    ちゃんとCPU使用率が下がってGPU使用率が上がっています。

    Renderは頻繁に使う機能ではありませんが、使うとなった時に遅いとイライラしてしまいます。
    なるべく高速化できるところは高速化しておきましょう。

    ~~20250724 追記~~
    実行されない場合、使っているVisualstudio再配布パッケージが新しすぎる可能性があります。
    Cycle.exeはVisualstudioのC++デスクトップ開発に含まれるcl.exeを参照しており、2022版以降は動きません。2019版が必要です。
    ですので、VisualstudioInstallerからVisualstudio2019のC++によるデスクトップ開発をインストールしましょう。

    cl.exeは、Visualstudioインストール先ー2019ーCommunity-VC-Tools-MSVC-XX.xx.xxxxx(バージョン)-bin-Hostx64-x64の中にあります。
    Pathをコピーして環境変数に追加しておきましょう。

    今では32bitPCはほぼないと思いますが、32bitPCのかたはHostx86から。



    閲覧ありがとうございました!



  • ウェブサイトにあげる3Dデータをスクレイピングから守るには?

    ウェブサイトにあげる3Dデータをスクレイピングから守るには?

    やった!3Dデータを作ったぞ!
    3Dプリントもできるし、モデルデータ販売サイトにも登録した!
    よーし、サイトに公開してみんなに周知しよう!

    ………これ、配置しただけだとスクレイピングでデータ窃取できちゃうな…。



    サイバー空間にアップしたいけど上げれない、そんなジレンマがあるかと思います。
    今回は本サイトでも採用している回避方法を紹介します。


    まずやりたいこととその問題を洗い出していきましょう。


    <やりたいこと>
    ・3Dモデルをサイト上に公開したい。
    ・回転させたり拡大縮小させたりしてぐりぐり操作したい。
    ・パスは隠してDLできないようにしたい。
    ・サイトへの導入はシンプルに、使いまわせるようにしたい。

    <問題>
    ・3Dビューアを作るのはコストがかさむ。
     → model-viewerを使う。
    ・Wordpressのメディアライブラリでは3Dモデルを扱えない。
    ・クライアント側(model-viewer)にモデルのパスを渡す形では、DLできてしまうしディレクトリトラバーサルされる危険性もある。


    クライアント側(JavascriptとCSS)だけではちょっと解決が難しいかもしれません。
    サーバ側のことはあんまりよくわからないので、こういう時はGPTちゃんに聞くことにします。

    GPTちゃん、頼りになるわぁ。

    ユーザ側に表示されている以上完全に防御することは不可能。
    まぁそうだよね。
    とはいえ、し難くすることはできそうな感じです。

    アクセス制限やログイン制にするのは本末転倒なので、glTFストリーミングする方向で考えていきましょう。
    ただし、分割処理や暗号複合、アクセス制限などはコスト高めなので、とりあえず”サーバから生データでモデルをもらう”という形にしておきましょう。


    さて、全体の構成を考えていきましょう。



    構成はいたってシンプル。
    model-viewerはWordpressのカスタムURLで記述、データ問い合わせとViewerへのセットを担当するJS、サーバ側のデータ処理を担当するPHPで構成されています。

    1.model-viewerが表示されるのをトリガーに、PHPにモデル名をFetch。
    2.PHPでモデル名を検索して、見つかればモデルの生データをSend。
    3.データが返ってきたら生データにURLを付与してmodel-viewerのsrcに流し込む。

    というシーケンスです。

    では カスタムHTML ⇒ JS ⇒ PHP の流れで見ていきましょう。
    <script  type="module" src="https://unpkg.com/@google/model-viewer/dist/model-viewer.min.js"></script>
    <model-viewer class="mviewer" name="modelname" loading="lazy" type="model/gltf-binary" exposure="0.6"></model-viewer>
    document.addEventListener("DOMContentLoaded", () => {
        var mvlist = document.querySelectorAll(".mviewer");
        if(mvlist){
            const observer = new IntersectionObserver((entries) => {
                entries.forEach(entry => {
                    if(entry.isIntersecting){
                        loadmodel(entry.target);
                        observer.unobserve(entry.target);
                    }
                })
            })
            mvlist.forEach(mv => {observer.observe(mv);});
        }
    });
    
    function loadmodel(target){
        const fileName = target.getAttribute("name") + ".glb"; 
        const url = `/wp/response.php`;
    
        fetch(url, {
            method: "POST",
            headers: { 'Content-Type': 'model/gltf-binary' }, 
            body : fileName
        })
        .then(res => {
            if (!res.ok) throw new Error("取得失敗" + url);
            return res.blob();
        })
        .then(blob => {
            const objectURL = URL.createObjectURL(blob);
            target.src = objectURL;
        })
        .catch(err => console.error("モデル読み込みエラー: ", err + url));
    }
    <?php
    if (class_exists( 'loadmodel' ) ) {
        error_log("double exist ");
    	return;
    }
    
    $filename = file_get_contents('php://input');
    if (!preg_match('/^[a-zA-Z0-9_\-]+\.glb$/', $filename)) {
        error_log("loadmodel not glb : " . $filename);
        http_response_code(400);
        exit("Invalid file name");
    }
    
    $baseDir = __DIR__ . '/wp-content/uploads/model/';
    $filePath = $baseDir . $filename;
    
    if (!$filePath || strpos($filePath, realpath($baseDir)) !== 0) {
        error_log("loadmodel access denied : " . $filePath);
        http_response_code(403);
        exit("Access denied");
    }
    
    if (!file_exists($filePath)) {
        error_log("loadmodel not found : " . $filePath);
        http_response_code(404);
        exit("File not found");
    }
    
    header('Content-Type: model/gltf-binary');
    header('Content-Disposition: inline; filename="'.$filename.'"');
    header('Content-Length:' . filesize($filePath));
    readfile($filePath);
    exit;
    ?>

    JSでは、intersectingObserverでmodelviewerの表示を検知しFetchを実行します。
    Fetchでは指定したPHP(response.php)にファイル名を投げて処理を依頼。
    レスポンスが返ってきたら中身をチェックして、問題なければ中身にURLを付与してModelViewerのSrcに渡します。

    なお、表示されるたびに実行されても無駄なので一回実行したらObserve対象から外しています。


    PHPはかなりシンプルで、Fetchでもらったファイル拡張子のチェック・パスのチェック・レスポンスヘッダの記述・生データの取り出しという流れです。

    注意点として、PHPはhttpから始まるURLは処理できません。
    パスを渡すときはローカルパスで指定するようにしましょう。
    PHPは全く触ったことがなかったので、ここでかなり躓いてしまいました…。
    なぜかPHPの純正ログも出ないしWordpressのログも使えないしよー……チクショー…。


    重要なのはcontent-typeにmodel/gltf-binaryを指定すること。
    Fetchで指定するかレスポンスで指定するか、どちらかでいいと思います。たぶん。
    今回は念のため両方とも書いてます。


    いい感じですね!
    DevToolのインスペクターにはURLも書かれていませんし、PHPからの応答も生データなのでデータの窃取もしにくくなっています。

    場合によってはサーバがglb,gltfに対応してない場合があります。
    その場合は.htaccessにてMIMEタイプの追加をしてみるといいかもしれません。
    <IfModule mime_module>
    AddType model/gltf-binary .glb
    </IfModule>

    この仕組みは、Content-typeを変えれば3Dデータだけでなく画像や動画にも応用できそうですね。
    良ければご活用ください。