
2026/01/25 0:17
3Dプリントされた数学的ランプシェード(照明カバー)
RSS: https://news.ycombinator.com/rss
要約▶
Japanese Translation:
Summary
著者は、半透明PLAを使用してLidl LEDストリップ用の3Dプリントディフューザーを作成し、OnShapeデザインファイルを共有しました。ディフューザーの形状は、次式で定義されるスイーピング2‑Dプロファイルから導出されました。
[ r = \cos(5\theta) + 0.2\cos(9\theta)+0.05\cos(200\theta)+4 ]
この式は、大きく穏やかな波形に小さな揺れのあるリッジを生成します。著者は、このDesmosグラフをSVGにエクスポートし、InkscapeでDXFへ変換した後、そのDXFをOnShapeにインポートしてロフトモデリングを行いました。しかし、OnShapeのロフトツールは1 047点プロファイルで失敗し、スムーズなドームを生成せずにフリーズしました。
これを解決するために、著者はPythonスクリプト(ChatGPTの指導による)を書き、2‑Dプロファイルを縮小して単一の先端点に収束させました。これにより、印刷可能なSTLファイル(約70 + MB)が生成されました。完成したディフューザーは半透明PLAでプリントされています。また、著者はJupyterノートブックをMarimoアプリへ変換し、Pythonのインストールなしでブラウザベースの断面とプロファイルの可視化を提供しています。
本文
家庭で照明プロジェクトに使うため、半透明のPLAを試してみました。
今年初めに、Lidl の LED ストリップ用にディフューザー/ハウジングを作成しました。露出したLEDから発せられる光が冷たくて目障りだったのでです。設計ファイルは OnShape にありますが、実際のストリップや必要な取り付けエリアに合わせて調整する必要があるかもしれません。
最近 YouTube のフィードに出てきた数本のバイラル動画で、オーダーメイドの 3D 印刷ランプシェードを紹介していました。これらの揺れる膜は、2‑D プロファイルを空間内で上昇・回転させながらスイープした結果生まれる表面に似ているように感じました。最初から作るのは楽しい挑戦だと(しかもクリスマスプレゼントにもなる!)思いました。
2‑D プロファイル
Desmos で次式をプロットしました(リンクをクリックすると数式が表示されます)。
[ r = \cos(5\theta) + 0.2\cos(9\theta) + 0.05\cos(200\theta) + 4 ]
上に大きくて穏やかな波状の振れ、さらにその上に小さな揺らぎを重ねたような形です。
OnShape で試みる(失敗も)
Desmos は SVG 出力が可能で、これを Inkscape で DXF に変換してから OnShape にインポートできます。DXF ファイルはそのまま OnShape のスケッチに追加できるので、ここまで問題ありませんでした。しかし、Loft オブジェクトの作成には苦労しました。
Loft は先ほど述べたように、1 つの 2‑D プロファイルを別のプロファイルへ補間して体積または表面を生成するものです。今回の場合、2 番目のプロファイルは最初のプロファイルの上に置かれた一点だけです。
Loft ツールにはいくつか便利な設定があり、特に各プロファイルへのアプローチ角度(開始・終了)を指定できます。私は形状を 2‑D の輪郭から直立させ、最終点へ接線になるようにしたいと考えていました。こうすれば上部は鋭い尖端ではなく美しいドームになります。
1,047 点で構成されたこの複雑な有機的外観のプロファイルは、OnShape の主な用途にはあまり合わないようです。Loft 操作は処理に失敗し続け(見た目は良いものの)、何度かフリーズもしました。
新しいアイデア
そこで別の方法を思いつきました。点座標が既知であるなら、Python で形状を生成することはそれほど難しくないはずです。以前にこうしたことをやった経験がなかったので ChatGPT に相談しました。するとスクリプトを教えてもらい(リポジトリはこちら)、頂部へ向かって単一点に収束させる(高さに応じてプロファイルを縮尺)ように改変しました。その結果、70 + MB もの巨大な STL ファイルが出来上がり、現在もプリント中です…
更新
Jupyter Notebook を Marimo に移植し、生成されたランプシェードの断面とプロファイルをブラウザで直接 WebAssembly を使って可視化できるようにしました。Python をインストールせずともコードが実行できます(リンク)。