ソースに絡まるエスカルゴ

貧弱プログラマの外部記憶装置です。

【Blender】ベルトコンベアの作り方と物理演算

 タイトルにある通りBlenderでベルトコンベアを作り、物理演算でベルトコンベア上のオブジェクトを動かすというのをやってみました。
f:id:rikoubou:20180331035809g:plain

 こんな感じのものをBlenderで作る方法を備忘録として残しておきます。


1:ベルトコンベアの軌道を作成する
 Blenderを起動させたら、3Dモデル上にマウスカーソルを持って来て「Xキー」を押して邪魔なCubeを削除します。
f:id:rikoubou:20180331003520p:plain

 次に3D Cursorが原点にある状態で3D View画面左側にある「Create」タブを左クリックし、Curveの項目の中にある「Nurbs Circle」を左クリックします。
f:id:rikoubou:20180331004341p:plain

 3D View画面上に「BezierCircle」という名前の輪が作成されます。
f:id:rikoubou:20180331004556p:plain

 この「BezierCircle」を選択した状態(選択されていない場合は右クリックで選択)で箱のような見た目のオブジェクトボタンをクリックします。出て来た項目にあるTransformのRotationのXを「90」、ScaleのXを「0.7」、Yを「0.05」と入力します。
 すると3D View画面上のBezierCircleがこのような形になり、ベルトコンベアの軌道が作成できました。(マウスのホイールを使って拡大させたり、ホイールをクリックした状態で動かして見たい角度にしてください)
f:id:rikoubou:20180331020237p:plain

 また3D View画面上にマウスカーソルがある状態でテンキーの「1キー」を押すと、BezierCircleの楕円を真正面から見ることができます。
f:id:rikoubou:20180331020355p:plain

2:ベルトコンベアの1つ分のパーツを作る
 1でベルトコンベアの軌道を作成したので、次はパーツを作ります。

 3D Cursorが原点にある状態で3D View画面左側にある「Create」タブを左クリックし、Meshの項目の中にある「Plane」を左クリックします。
f:id:rikoubou:20180331010639p:plain

 3D View画面上に「Plane」という名前でオブジェクトが作成されます。
f:id:rikoubou:20180331010819p:plain

 この「Plane」を選択した状態で箱のような見た目のオブジェクトボタンをクリックします。出て来た項目にあるTransformのScaleのXとYをそれぞれ「0.02」、「0.05」と入力します。
f:id:rikoubou:20180331020504p:plain

 すると「Plane」はこのような形になります。これが複数あるとベルトコンベアっぽい感じになるのがイメージできると思います。
f:id:rikoubou:20180331020544p:plain

 このScaleの値を基準とさせるため、3D Viewの左下にある「Object」を左クリックし「Apply」、そして「Scale」と左クリックで選択します。
f:id:rikoubou:20180331013417p:plain

 これで「Plane」の形はそのままでScaleの値が全て1に設定されます。
f:id:rikoubou:20180331020653p:plain

 しかしこのままでは厚みがないため「Plane」に厚みを持たせます。「Plane」を選択した状態でスパナのような見た目のModifierボタンを左クリックし「Add Modifier」プルダウンの中から「Solidify」を左クリックで選択します。
f:id:rikoubou:20180331011649p:plain

「Offset」に「1」、「Thickness」という項目の値を適当な値として「0.01」と入力して「Apply」ボタンを左クリックして適用させます。
f:id:rikoubou:20180331020844p:plain

 これで「Plane」に厚みが適用され、1つ分のパーツが完成です。
f:id:rikoubou:20180331020923p:plain


3:軌道に沿ってパーツを配置させる
 2で作成した「Plane」を選択した状態でスパナのような見た目のModifierボタンを左クリックし「Add Modifier」プルダウンの中から「Array」を左クリックで選択します。
f:id:rikoubou:20180331012523p:plain

 追加されたArrayの中にあるFit Typeのプルダウンを左クリックし「Fit Curve」を左クリックで選択します。
f:id:rikoubou:20180331012706p:plain

 でてきたCurveの項目を左クリックして1で作成した軌道の「BezierCircle」を左クリックで選択します。
f:id:rikoubou:20180331012952p:plain

 すると「Plane」が大量に出て来るので、Relative Offsetの一番上の値を調節して幅を持たせます。(ここでは値を1.1にしました)
f:id:rikoubou:20180331021115p:plain

 次に「Plane」を選択した状態でもう一度「Add Modifier」プルダウンを左クリックし「Curve」を選択します。
f:id:rikoubou:20180331014011p:plain

 追加されたCurveのObjectの箱部分を左クリックして「BezierCircle」を左クリックで選択します。
f:id:rikoubou:20180331021252p:plain
f:id:rikoubou:20180331021428p:plain

 すると1で作成した楕円に沿って2のパーツである「Plane」が配置されます。
f:id:rikoubou:20180331021521p:plain

 この状態で「Plane」を選択し、オブジェクトのLocationのX座標を左右にドラッグして値を変更させてください。Xの値によって回転します。
f:id:rikoubou:20180331024231g:plain

 これで見かけ上のベルトコンベアは完成です。単純に動かすだけであればすでに完成していますが、物理演算をさせるためには他にも設定が必要になります。


4:作成したベルトコンベアの剛体設定をする
 3までできたら「Plane」を選択した状態でスパナのような見た目のModifierボタンを左クリックし、すでに追加されているArrayにある「Apply」ボタンを左クリックして適用させます。これでArrayで配置させたもの全てがPlaneとして一つのオブジェクトになります。
f:id:rikoubou:20180331024830p:plain

 次に「Plane」を選択した状態でチェックマークのような見た目のPhysicsボタンを左クリックして「Rigid Body」ボタンを左クリックします。これでオブジェクトが「剛体」になります。
f:id:rikoubou:20180331025051p:plain

 Rigid bodyの項目にあるプルダウンを左クリックして「Passive」を選択し、Animatedにチェックを入れます。特にこのAnimatedのチェックは忘れないでください。
f:id:rikoubou:20180331025435p:plain

 Passiveは外部からの力を受けない限り動かないという剛体の設定、Animatedはアニメーションをさせる(任意に移動させるなどの)場合にチェックを入れるというものです。つまりこの設定で「静止した状態でX座標を任意に変化させてベルトコンベアを回す」という剛体ができたことになります。


5:ベルトコンベア上にCubeを落として動きを確かめる
 剛体のベルトコンベアが作成できたので、上からCubeを落として動きを見てみましょう。
 3D View画面の左側にある「Create」タブを左クリックし、Meshにある「Cube」を左クリックします。
f:id:rikoubou:20180331030445p:plain

 かなりでかいCubeが作成されるので、作成されたCubeを選択した状態で箱のような見た目をしているオブジェクトボタンを左クリックし、TransformのScaleを調節します。ここでは全て0.05にしてあります。
f:id:rikoubou:20180331030755p:plain

 大きさの調節ができたらCubeの剛体設定を行います。

 Cubeを選択した状態で、先ほどと同じようにPhysicsボタンを左クリックし、「Rigid Body」ボタンを左クリックします。
f:id:rikoubou:20180331031025p:plain

 Cubeの場合はRigid Bodyの設定は特になにもいじらないままにします。(ActiveかつDynamicにチェックが入っていることで「自由落下をする剛体」という設定になります)
f:id:rikoubou:20180331031223p:plain

 ここまでできたらCubeを選択した状態で箱のような見た目をしているオブジェクトボタンを左クリックし、TransformのLocationの各座標を調節してベルトコンベアの少し上に来るようにします。
f:id:rikoubou:20180331031918p:plain

 準備ができたら再生ボタンを左クリックしてください。
f:id:rikoubou:20180331031700p:plain

 するとCubeが落下してベルトコンベアに当たります。その後「Plane」を選択した状態でTransformのLocationのX座標を変化させると、その変化量に応じてベルトコンベアに乗っているCubeも動きます。ベルトコンベアの端に行ったり、Cubeのバランスが悪いと下へと落下します。
f:id:rikoubou:20180331032414g:plain

 これでベルトコンベアの物理演算ができました。


6:アニメーションとしてのベルトコンベア物理演算
 物理演算はできましたが、毎回手動で座標を変化させるなんてことはできないのでアニメーションでずっと回転させるようにします。

 タイムラインの一番左下にあるプルダウンを左クリックし、「DopeSheet」を左クリックで選択します。
f:id:rikoubou:20180331032903p:plain

 DopeSheet画面はこのようになっています。緑色の線にある現在のフレームが「1」であることを確認してください。「1」でない場合は数字の書かれている緑の部分を左クリックのドラッグで移動させてください。
f:id:rikoubou:20180331033033p:plain

 ベルトコンベアが表示されている3D View画面にマウスが乗っている状態で「Plane」を選択して、TransformのLocationのX座標を「0」に戻しておきます。
f:id:rikoubou:20180331033258p:plain

「Plane」を選択し、3D View画面にマウスが乗っている状態で「iキー」を押して「Location」を左クリックします。
f:id:rikoubou:20180331033504p:plain

 これで1フレーム目にX、Y、Zの座標が登録できました。登録された項目が黄色になっていることで確認できます。
f:id:rikoubou:20180331033843p:plain

 次に24フレーム目までドラッグします。
f:id:rikoubou:20180331034210p:plain

 再び「Plane」の「Location」を以下の値にします。
f:id:rikoubou:20180331034328p:plain

 この状態で再び「iキー」を押して24フレーム目に「Location」をキーフレームとして登録します。
f:id:rikoubou:20180331034447p:plain

 一度タイムラインに戻って1フレーム目から再生させましょう。
f:id:rikoubou:20180331034556p:plain

 すると24フレームまではベルトコンベアが回転していることがわかると思います。しかし24フレーム目から先は設定されてないので止まってしまい、その勢いでCubeが落ちてしまっています。
f:id:rikoubou:20180331034916g:plain

 これでは困るので、再びDope Sheetに戻りアニメーションのループ設定を行います。

 24フレーム目であることを確認し、Dope Sheetの「Channel」、「Extrapolation_Mode」、「Make Cyclic」を左クリックで選択します。
f:id:rikoubou:20180331035409p:plain
f:id:rikoubou:20180331035350p:plain

 これでアニメーションのループ設定が完了です。

 もう一度タイムラインに戻って再生してみるとこのようになります。
f:id:rikoubou:20180331035809g:plain

 ちょっとつっかえてたりはしましたが、ちゃんと一番端までCubeが自動的に送られました。


 長々となってしまいましたが、以上がBlenderにおけるベルトコンベアの作り方と物理演算です。
 アニメーションについてはループよりも一定量ずっと変化みたいなのが「Extrapolation_Mode」から選択できそうなのでもっと滑らかにできるかもしれません。方法を知っていたら教えていただきたいです。
 また「Rigid Body」の設定値として摩擦係数などの設定もできるようなので、その値を調節することでよりリアルなシミュレーションも行えるようです。

 ベルトコンベアを縦横に並べてダンボールなどの仕分け作業ごっこみたいなのをやるのも楽しいかもしれません。


・2018/06/30追記
 最後に書いた一定量の変化は以下の操作をすればできることがわかりました。
f:id:rikoubou:20180630020111p:plain

 これで一定量の変化となり、その後に「Make Cyclic」を行えばよいです。

 またベルトコンベアを2つ作成し、L字の直角になるように配置して物を動かすというシミュレーションをしたい場合があります。

 基本的には個別の微調整でどうにかするしかないのですが、ベルトコンベア自体のオブジェクト(Plane)のRigid body Collisionsの設定は以下のようにしておくと調節しやすいです(多分)。
f:id:rikoubou:20180630015312p:plain

 一応ちゃんと物理演算で動いたベルトコンベアL字の.blendファイルも公開しておきます。


おまけ:3D Cursorの原点合わせ
 3D Viewの右端にある「+」となっている部分を左クリックします。
f:id:rikoubou:20180331010007p:plain

 でてきたものをスクロールしていくと「3D Cursor」という項目あるので、これら全ての座標に0を入力すれば原点に合わせることができます。
f:id:rikoubou:20180331010346p:plain


・参考資料