野球のシーム(縫い目)のようなボールを作る②

はじめに

球体POVというものを作成しています.

tajmahal0707.hatenablog.com

 その中で,今は外殻に相当するボール部分を制作しています.

tajmahal0707.hatenablog.com

なかなかいいところまでは行ったのですが,肉厚が足りないのか,くびれが強いためか,かなり無理矢理嵌めなければならなかったので緩んで隙間ができてしまいカタカタ鳴るくらいユルユルになってしまっていたのでした.


Printed seam ball

今回はこの問題を解決するために,接合部分に凸凹の嵌合部をblenderベースで作ってみたので紹介します.

 

blenderプログラマブルに任意の軌跡のパイプを作りたい人には参考になるのではないかな,と思っています.

やりたいこと

前回のブログではB値の設定を変更(B=0.5→B=0.35)してもうちょっと調整しようというところでおわっていたのですが,その調整して打ち出したものがこちらになります

f:id:tajmahal0707:20191224133410j:image

 途中から色が変わっているのはフィラメントがなくなって継ぎ足したからですw

でもこれだとかなりカチっと嵌ってくれます.

f:id:tajmahal0707:20191224133439j:image

前回はB値が大きかったためくびれが大きくて嵌めるときにかなり無理矢理行かないといけなかったのですが, 今回はザクッと差し込むことができました.

 

懸案だったボール内へのデバイス収納問題も,B=0.5のときは無理そうでしたが今回(B=0.35)では無事収納できました.

f:id:tajmahal0707:20191224133402j:image

 (とはいえ,実は対のパーツを組み込むことができないことが発覚して,未だ未解決になってしまっているのですが....)

 

 

 

しかーーーーーし

 

最初はしっかり嵌っていたのですが,しばらくすると緩んできてしまいます.

というより,印刷時に付いているサポート材(一番上の写真にボールの上下についている円柱のような部分)が付いているときはパーツを閉じる効果が強くて嵌め合い時の力も強かったのですが,このサポート材を取り外したら閉じる力が弱くなってしまったようなのです.

前回よりはマシなのですが,やっぱりこれじゃあ心配だ.

 

そこで嵌合部に凸凹を付けてしっかりと嵌るように作ることにします.

要するに作りたいものはこんなもの

f:id:tajmahal0707:20191224132311p:plain

 各パーツに対して,一方はUNIONで

f:id:tajmahal0707:20191224135555p:plain

他方はdifferenceで

f:id:tajmahal0707:20191224135657p:plain

このような凹凸をつけてあげれば重ねたときにパチっと嵌るのではないか,と期待したわけです.

Blenderでの作業

前のプログラムを変更して作ります.

Blender自由形状のパイプを作るにはパスを作って,そのパスに沿って形状をbevelする必要があります.前回のPolygonを作るコードは下にあります.

github.com

 参考にしたのはこのあたり

gist.github.com

使うのはcurve operatorです

shuvit.org

pythonプログラムで前回作ったpolygonのvertex値をつないでパスを作ります.

f:id:tajmahal0707:20191224132328p:plain

 まずは原点にbezierのオブジェクトを置きます.

bpy.ops.curve.primitive_bezier_circle_add(location=(0, 0, 0))

このときに作られるベジェのオブジェクトはedit modeにするとわかりますが,制御点が4つしかありません.これから軌跡に沿ってvertexを追加していくので今回は最初の4点は下のコマンドで消してしまいます.

bpy.ops.curve.delete(type='VERT')

それが終わると前回と同じ方法でちょうどパーツの中間になる値(今回は半径50mmで肉厚5mmの球のため,パスの半径(SEAM_RADIUS)は0.475ということになります)

角度に応じた軌跡上の点(x1, y1, z1)を計算したらその座標を追加してパスを伸ばしていきます.

bpy.ops.curve.vertex_add(location=(x1,y1,z1))

角度を0〜360まで回すとパスは一周して完了です.閉じる処理も必要ですがそれは手作業でやっちゃいました.

 

同時に角度が0のときの位置(開始点:xx1)にパイプの形状を決める円を配置します.

bpy.ops.curve.primitive_bezier_circle_add(location=xx1)

ちなみに開始点は,一度座標値をプリントしてそれをコピペしただけですw

配置した円は,向き・大きさを手動で整えておきます.

xx2まで出したのはxx2-xx1のベクトルがパイプ断面の法線になると思ったのですが,開始点はそのまま垂直なので使いませんでした.

 

 

えい,実行

f:id:tajmahal0707:20191224132259p:plain

パスを選択して,プロパティからcurveを選ぶと右のようなプロパティが出てきます.

bevel object」という項目に先程作った開始点にある断面形状(今回は円)を選んでやると上のようなパイプを作ることができるのでした.

 

これを前回作成したボールパーツに対してそれぞれboolean演算してやることで,各パーツに凹と凸を付けることができるのでした.

f:id:tajmahal0707:20200429134717p:plain

f:id:tajmahal0707:20200429134853p:plain
ただし,このままだとbezier curveがカーブオブジェクトのまま(図中の赤丸で囲った部分)なので,「object」「convert to」「Mesh from curve」を使ってカーブオブジェクトをメッシュに変換します.

f:id:tajmahal0707:20200429135037p:plain

こうすることでbooleanで凹凸をつけることができるようになります.

 

 

 

これを3Dプリンタにもっていき,印刷開始!

f:id:tajmahal0707:20191224133334j:image

じゃん.

上が凸で下が凹.

f:id:tajmahal0707:20191224133330j:image

ちゃんと凹みを表現できています.

 

 

実際に組んでみると 

f:id:tajmahal0707:20191224133322j:image

こんな感じ!!


piped seam ball

一部白いのは,今回もフィラメント不足で継ぎ足しましたw

左にあるボールはこのブログの最初に印刷した嵌合部なしのもの.右の透明が今回打ち出した嵌合部アリのボール.噛み合いが全然ちがいます.

これは流石にぴったり.ほとんどズレません.フィラメントの消費量は殆ど変わらないのにこれくらい造形がしっかりしてくるのは面白いですね.

工夫すればするほど良いものになっていく.

 

本番は光造形で打ち出すため素材が違うので嵌合部がどれくらい行くかはわかりませんが,なかなか満足の行くものができました.

 

 

 

 

でも,まあそれよりもこのボールの中にちゃんと本体が収納できるようにしないと光造形までたどり着くことはできないんですけれどね.....