札幌日大中高一貫ロボット部 「非公式」ブログ

札幌日大中高一貫ロボット部の「非公式」ブログです!

全方位ミラーの3Dモデルを作る 後編

こんにちは。ONCです。今回の記事は、前回の続きとなります。

この記事では、前回までの手順で求めた双曲線の式から、3Dモデルを作る手順について書いていきます。

3Dモデルの作成

前回までの手順で、y=\sqrt{\dfrac{b^2}{a^2}*x^2 + b^2} (a,bは実際には実数)のような式が求まっているという前提で話を進めていきます。

 

3Dモデルを制作する大体の手順は、以下の通りです。

  1. 求めた式から、50個程度、曲線上の座標を求めます。
  2. 求めた座標を、CADソフトにプロットします。
  3. プロットした点を直線で繋ぎ、双曲線を近似します。
  4. CADソフトで、出来上がった図形を回転押出しします。

 

ちなみに、私はLinux(Mint)ユーザーなので、使うソフトはすべてオープンソースのソフトです。

曲線上の座標を出力するソフトとして、今回使うソフトは、「gnuplot」というソフトです。

LinuxWindows,Mac OSに対応しています。

また、2〜4の手順で使うCADソフトは、「OpenSCAD」という、少し変わったソフトです。

このソフトは、コードを書くことで3Dモデルを作っていくという、プログラマブルなものです。

 

ここからは、もうすでにPCなどにこれらのソフトが入っているという前提で話していきます。 

では、さっきの手順の通り進めて行きましょう。

 

gnulotを用いて曲線をプロットする

まず、gnuplotを立ち上げます。

f:id:snjrc:20190505013346p:plain  

ほんの少し使い方について説明すると、

plot 〜 これで、二次元のグラフをプロットできます。

splot 〜 これで、三次元のグラフをプロットできます。

set xrange[min:Max] これで、x軸の範囲を設定できます。

set yrange[min:Max] これで、y軸の範囲を設定できます。

replot これで、直前にプロットしたグラフを再度プロットすることができます。

 

では実際に、前回までで作った式をプロットします。

注意する点は、x^2などの累乗は、"x**2"という風になります。また、\sqrt{x}などは、"sqrt(x)"という風に表します。今回は、a,bは適当に設定してプロットしてみます。

f:id:snjrc:20190505014621p:plain

f:id:snjrc:20190505014936p:plain

 

次に、ミラーの半径から、x軸の範囲を設定します。今回は適当に半径=20と設定します、つまりx軸の範囲は[−20、20]となります。gnuplotにて、範囲を設定するコマンドを打ちます。

f:id:snjrc:20190505122358p:plain

"replot"コマンドで、再び同じ曲線をプロットします。

f:id:snjrc:20190505123252p:plain

ちゃんと、x軸の範囲が-20から20になっていることが分かると思います。

 

次にこの曲線状の座標を、gnuplotを用いてテキストファイルに出力します。

まず、"set table hoge.table"というコマンドで、出力するファイルを設定します。

f:id:snjrc:20190505123627p:plain

今回は、"mirror.table"という名前をつけました。

この状態で"replot"コマンドを実行すると、曲線の座標の情報が、設定したファイルに書き込まれます。

f:id:snjrc:20190505124028p:plain

では、どのような感じで出力されたのか見てみましょう。

f:id:snjrc:20190505124200p:plain

このような形で、x座標とy座標が100個出力されていることがわかります。

試しに、この座標の点をプロットしてみると、(plot "mirror.table")

f:id:snjrc:20190505163541p:plain

このように点がプロットされていますね。


OpenSCADに座標のデータを取り込む 

次に、この座標の情報をOpenSCADに取り込みます。

今回、最終的にはCADソフトを使って回転押し出しをするため、プロットした座標の中から、

xが-20〜0、または0〜20までの範囲どちらかの情報だけで十分です。

 

つまり、こんな感じのグラフ:

f:id:snjrc:20190505124837p:plain

 

そのため、今回は、xの範囲が0〜20 の部分の座標だけ抜き出しました。

 では、実際にこの情報を、CADに取り込みます。

 

OpenSCADを起動するとこんな画面になります。

f:id:snjrc:20190505125236p:plain

試しに、球体を表示させてみましょう。

f:id:snjrc:20190505170845p:plain

たった二行だけで、このような3Dモデルを作れてしまうため、とても便利です。

 

早速、さっきの座標をプロットします。

点をプロットしてすべて直線でつなぎ、平面図形を作る時に書くコードは、

polygon(points=[ {x_1,y_1},{x_2,y_2} 〜{x_n,y_n} ]);

のようなコードです。((x_n,y_n)には、書きたい図形の頂点の座標が入ります)

f:id:snjrc:20190505174631p:plain

はい。座標は全部手打ちなので、めちゃくちゃ大変です。

だれかgnuplotの出力ファイルから、自動的に座標を入力してくれるPythonコードなんかを書いてくれる人募集してます。

ちなみにファイルの中の座標は、x=0のときのものがあるとは限らないので、そこは自分で計算して打ち込みます。

 

これで、ほとんどすべての手順が終わりました。あとは、この平面図形を回転押し出しするだけです。

 

3Dモデルを完成させる

最後に、回転押し出しを使って3Dモデルにします。
OpenSCADで回転押し出しをするコードは以下の通りです。

rotate_extrude($fn=?)

この?の部分の数値は、大きければ大きいほど細かく押し出しがされるため、滑らかになります。

最初に、30でやってみましょう。

f:id:snjrc:20190505180409p:plain

結構荒いですね。では、次に1000でやってみます。あまりにも値を大きくし過ぎると、出力するSTLファイルのサイズがやばいくらいでかくなるので注意してください。

f:id:snjrc:20190505180643p:plain

かなり細かいので、ほとんどつなぎ目が見えませんね。では最後に、この3DモデルをSTLファイルに変換します。

"Editor"にある、"STL"と書かれたアイコンをクリックし、好きな名前で保存します。

これで、このSTLファイルを使って実際の形状を出力できるようになりましたね。

 

あとは3Dプリンターなどで印刷して、ヒートプレスなどの方法でミラーを作ることができるでしょう。

 

これで今回の記事は終わりです。ここで紹介した、「gnuplot」や、「OpenSCAD」は、これ以外にも様々な活用する方法があると思います。皆さんぜひ活用してみてください。