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

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

【Blender】剛体シミュレーションと手づけのアニメーションをミックスさせる

 タイトル通り今までの知識を組み合わせて、剛体シミュレーション(物理演算)と手づけのアニメーションをミックスさせた動きを作成します。
 今回作成するのは以下のような動きです。

  1. ロボットアームが静止しているオブジェクトを掴む(手づけ)
  2. 掴んだオブジェクトをロボットアームがベルトコンベアに載せる(手づけ)
  3. 載せられたオブジェクトがベルトコンベアに合わせて移動する(物理演算)
  4. ベルトコンベアの終端に来たらオブジェクトが落下する(物理演算)


1:ロボットアームで物を掴む動作を作成する
 以下の記事で作成したデータを読み込んで流用します。
【Blender】オブジェクトを掴むアニメーションを作成する方法 - ソースに絡まるエスカルゴ

 オブジェクトを掴んで動かすというところまではできているので、あとはベルトコンベア部分を作成するだけです。
f:id:rikoubou:20180402192650g:plain


2:ベルトコンベア部分を作成する
 ベルトコンベアは以下の記事の内容に沿って作成します。
【Blender】ベルトコンベアの作り方と物理演算 - ソースに絡まるエスカルゴ

 以下のようにPathで軌道を作成して厚みをもたせたPlaneを並べて諸々設定を行い、剛体の設定まで終了させました。
f:id:rikoubou:20180402223022p:plain

「Torus」が親の影響を受けなくなる85フレーム目が「Torus」の最終位置なので、ベルトコンベアのPlaneとPathの座標を調節してその位置までベルトコンベアを移動させます。
f:id:rikoubou:20180402223606p:plain


3:移動させるオブジェクトの剛体設定をしてキーフレームを登録していく
「Torus」を選択した状態で「Torus」にRigid Bodyを追加します。
f:id:rikoubou:20180402223850p:plain

「Dope Sheet」を表示させて1フレーム目を選択し、現在のRigid Bodyの「Dynamic」と「Animated」を「iキー」を押してキーフレームを登録します。
f:id:rikoubou:20180402224159p:plain

 84フレーム目までは手づけのアニメーションなので、84フレーム目を選択してもう一度Rigid Bodyの「Dynamic」と「Animated」を「iキー」を押してキーフレームを登録します。
f:id:rikoubou:20180402224335p:plain

 これで1フレーム目から84フレーム目まで「Torus」は手づけのアニメーション通りに動きます。

 85フレーム目からは物理シミュレーションに任せたいので、85フレーム目を選択して「Dynamic」をチェック、「Animated」のチェックを外した状態で「iキー」を押してキーフレームを登録します。
f:id:rikoubou:20180402224717p:plain

 この状態で一度再生してみるとこのようになります。
f:id:rikoubou:20180402225019g:plain

 ちょっとわかりにくいですが、85フレーム目から「Torus」が落下してベルトコンベアの上に落ちています。あとはベルトコンベアの動きを作るだけです。


4:ベルトコンベアのアニメーションを作成する
 1フレーム目にX軸の値が0の状態のベルトコンベアのキーフレームを登録します。
f:id:rikoubou:20180402225832p:plain

 どこでもよいですが12フレーム目にX軸を「-0.3」だけ回転させたベルトコンベアのキーフレームを登録します。
f:id:rikoubou:20180402225914p:plain

 12フレーム目を選択した状態で「Channel」→「Extrapolation Mode」→「Make Cycle」を選択してベルトコンベアをループ再生するようにします。
f:id:rikoubou:20180402230041p:plain


5:完成
 1〜4の手順を踏んだ結果、以下のように最初は手づけ、後半は剛体シミュレーションというミックスさせたアニメーションが作成できました。
f:id:rikoubou:20180402230449g:plain


 以上が今までの知識を組み合わせたアニメーションです。これで工場のラインなどはBlenderである程度は再現できるのかなと思います。

【Blender】オブジェクトを掴むアニメーションを作成する方法

 今回はオブジェクトを掴むアニメーションをBlender上で再現する方法です。


1:掴む物がない状態でのアニメーションを作成する
 今回は以前の記事で作ったアニメーションをそのまま流用します。
【Blender】ボーンを使わないでアニメーションを作成する - ソースに絡まるエスカルゴ

 以下の記事のやり方に沿って新規ファイルに元のファイルを読み込ませます。
【Blender】別のBlenderファイルを読み込む方法 - ソースに絡まるエスカルゴ

 動きとしては以下のような形です。何かを掴んで移動させるという動作をさせています。
f:id:rikoubou:20180402152546g:plain


2:掴む対象物のオブジェクトを作成する
 掴む対象物専用のモデルを作成するのでもよいですが、面倒なのでここではTorusを掴むことにします。

 最初のフレームになっていることを確認してから、左側の「Create」タブから「Torus」を選択します。
f:id:rikoubou:20180402182826p:plain

 このままだと大きいので追加された「Torus」を右クリックで選択した状態で「Objectアイコン」の「Scale」を調節します。
f:id:rikoubou:20180402183040p:plain

 今回はScaleの値全てを「0.3」に設定しました。
f:id:rikoubou:20180402183212p:plain


3:掴む対象物の座標を合わせる
 今回のアニメーションでは60フレームのところでハンド部分を閉じて物を掴むようにしているので、60フレーム目を選択します。
f:id:rikoubou:20180402183516p:plain

 この時のハンド部分に合うように「Torus」を移動させて座標を合わせます。
f:id:rikoubou:20180402183709p:plain

 「Torus」を移動させたら、「Torus」を選択した状態で「iキー」を押して現在の位置などを登録します。
f:id:rikoubou:20180402183833p:plain

 これで選択した項目だけ(Torusだけ)がキーフレームとして登録されます。
f:id:rikoubou:20180402183953p:plain

 1フレーム目から「Torus」は今の位置にいて欲しいので、1フレーム目を選択して「iキー」を押して現在位置を登録します。
f:id:rikoubou:20180402184142p:plain

 これで「Torus」は1フレーム目から60フレーム目までは同じ位置になります。
f:id:rikoubou:20180402184236p:plain


4:掴む対象物に「Child Of」を追加する
「Torus」を選択した状態で「Constraintsアイコン(鎖のようなアイコン)」を選択し、「Add Object Constraint」から「Child Of」を選択します。
f:id:rikoubou:20180402184733p:plain

 追加したら親にしたいオブジェクトを「Target」から選びます。今回はグリッパ部分で掴んでいるので、グリッパの右側のオブジェクトを選択します。
f:id:rikoubou:20180402184831p:plain

 選択するとおかしな位置に「Torus」が移動しますが、「Influence」の値を0にすると元の位置に戻ります。
f:id:rikoubou:20180402185129p:plain
f:id:rikoubou:20180402185205p:plain


5:掴む対象物をキーフレーム登録していく
 1〜60フレームまではグリッパの影響を受けないので、1フレーム目にして「Influence」にマウスカーソルを乗せた状態で「iキー」を押して「Child Of」のキーフレームを登録します。
f:id:rikoubou:20180402185501p:plain

 キーフレームが登録されると項目が追加され、登録された部分が黄色くなります。
f:id:rikoubou:20180402185604p:plain

 同様にして60フレーム目も「Influence」の内容を登録します。
f:id:rikoubou:20180402185725p:plain

 これで1〜60フレーム目までは親の影響を受けないことになります。

 61フレーム目からは親の影響を受けるので、61フレーム目にして「Influence」の値を1にします。
f:id:rikoubou:20180402190040p:plain

 すると「Torus」がおかしな位置にいくので「Clear Inverse」ボタン→「Set Inverse」ボタンの順番で押します。
f:id:rikoubou:20180402190200p:plain

 これで「Torus」が元の位置に戻りました。
f:id:rikoubou:20180402190256p:plain

 この状態で「iキー」を押して61フレーム目に「Influence」を登録します。
f:id:rikoubou:20180402190609p:plain

 ここまでで動きを確認すると1〜60フレーム目は何も起きませんが、61フレーム目からはロボットアームのグリッパ部分に連動することがわかります。
f:id:rikoubou:20180402190510g:plain

 動きとして84フレームまではグリッパが閉じていて85フレーム目からグリッパが開き始めているので、今度は85フレームから親の影響を受けないようにします。
f:id:rikoubou:20180402190933p:plain

 そのために84フレーム目を選択した状態で、「Influence」の値が1であることを確認して「iキー」でキーフレームを登録します。
f:id:rikoubou:20180402191203p:plain

 また親の影響を受けて移動しているので3D View画面上で「iキー」を押して位置や回転などの情報もキーフレームとして登録します。
f:id:rikoubou:20180402191936p:plain

 これで61フレーム目から84フレーム目までは親の影響を受ける設定になりました。

 次に85フレーム目からは親の影響を受けないようにしないので、85フレーム目を選択した状態で「Influence」の値を0にして「iキー」でキーフレームを登録します。
f:id:rikoubou:20180402192139p:plain

 ただしこの状態だと親の影響を受ける前の位置になってしまうので、「Torus」の位置を調節してから「Torus」の位置情報などを「iキー」でキーフレームとして登録します。
f:id:rikoubou:20180402192323p:plain

 これで85フレーム目以降は親の影響を受けないで移動した先の座標に置かれることになります。

 この状態でアニメーションとして再生すると以下のように「Torusを掴んで移動させる」という動きになります。
f:id:rikoubou:20180402192650g:plain


 以上がオブジェクトを掴む動作を作成する方法です。同様に剛体シミュレーションにおいても「あるところまでは物理演算、あるところではオブジェクトの動きに従う」みたいな使い分けも設定できます。

 人型にすればアイテムを持つというようなものにも応用できると思います。


・参考資料
www.youtube.com

【Blender】別のBlenderファイルを読み込む方法

 一つのBlenderファイルに色々詰め込むのもよいですが、より汎用的にBlenderファイルを使い回したい場合があります。そういう場合は別のBlenderファイルを読み込んで利用することで、使い回すことができるようになります。
 今回はその方法についての備忘録です。


1:アペンドとリンク
 別のBlenderファイルの読み込みには「アペンド」と「リンク」の2種類があります。
 それぞれ以下のような違いがあります。

  • アペンド:読み込んだオブジェクトの変形や移動、マテリアルの変更などができる。多くはアペンドで読み込むことになる。
  • リンク:基本的に読み込んだオブジェクトの変形や移動、マテリアルなどの色の変更ができない。一切動かない、変わらないものの場合はリンクで読み込むのがよい。

 多くの場合はアペンドで読み込ませれば問題ないです。


2:別Blenderファイルをアペンドする
 Blenderファイルを立ち上げた後「File」→「Append」を選択します。
f:id:rikoubou:20180402161240p:plain

 そこで読み込ませたいBlenderファイルを選択するのですが、読み込ませたいBlenderファイルを選択すると以下のような状態になります。
f:id:rikoubou:20180402161856p:plain

「Object」をクリックするとファイルの中に入っているObjectの一覧が表示されます。この中からオブジェクトを選択して「Append from Library」ボタンを押すと選択したオブジェクトを読み込むことができます。
f:id:rikoubou:20180402162058p:plain

 しかしこの方法だと1つずつしか読み込めません。
f:id:rikoubou:20180402162604p:plain

 これに対して読み込ませたいBlenderファイルでGroupを作成していれば、「Group」をクリックして読み込ませたいGroupを選択して「Append from Library」をボタンを押すとGroup全てのオブジェクトを一度に読み込ませることができます。
f:id:rikoubou:20180402162441p:plain
f:id:rikoubou:20180402162449p:plain

 親子関係やアニメーションなども読み込んでいるため、元のBlenderファイルにある時と同じように扱うことができます。


3:別Blenderファイルをリンクする
 Blenderファイルを立ち上げた後「File」→「Link」を選択します。
f:id:rikoubou:20180402162813p:plain

 あとはAppendの時と同じようにオブジェクトやGroupを選択して読み込ませます。Linkの場合は読み込んでも基本的には各値を変更させることはできません。
f:id:rikoubou:20180402163021p:plain


 以上が別のBlenderファイルを読み込む方法です。モデルやアニメーションの使い回しなどは割と行う場合があると思うので、知っておくと便利だと思います。


・参考資料

【Blender】ボーンを使わないでアニメーションを作成する

rikoubou.hatenablog.com

 前回ロボットアームっぽいモデルをBlenderに取り込みました。このモデルを一体化してボーンを設定して…という風にすれば動かすことはできますが、伸び縮みしたり変形したりする部分が出てきます。

 今回は「形が変わらずに動かす」ためにボーンを使用しない方法でアニメーションを作成していきます。今回はロボットアームという性質上、とある部分を軸として回転する方法を固定させるという方法で設定していきます。
 基本的には親子関係+3D Cursorの位置固定+軸の回転方向固定を繰り返して設定するだけです。


1:親と子となるオブジェクトを決め、どう動かすかを決める
 取り込んだロボットアームのモデルの土台となる部分を親(赤枠部分)、そこから伸びているパーツを子(緑枠部分)とします。
f:id:rikoubou:20180402134838p:plain

 設計上親の土台部分に対して、子のパーツは土台の中心を軸として回転する動き以外は行えないので、以下のような動きで拘束されるように設定すればよいということになります。
f:id:rikoubou:20180402135339p:plain


2:子の回転軸の中心となる場所にカーソルを持ってくる
 1でどう動かすかを決めたので、その部分にカーソルを持ってきます。

 今回はちょうど原点が子の回転軸の中心になるので、3D Viewの3D Cursorの値を全て0にして原点に持ってきます。
f:id:rikoubou:20180402140047p:plain

 十字のカーソルが原点に移動させたら、左側にある「Tool」→「Set Origin」→「Origin to 3D Cursor」を選択して、座標のカーソルを十字のカーソルに合わせます。
f:id:rikoubou:20180402140756p:plain

 これで座標のカーソルを子の回転軸の中心に持ってくることができました。
f:id:rikoubou:20180402140841p:plain


3:親子関係を作成し、回転軸を固定させる
 子となるオブジェクトを右クリックした状態で「Shit+右クリック」で親のオブジェクトを選択します。必ず子となるオブジェクトを先に選択しておいてください。
f:id:rikoubou:20180402141249p:plain

 子と親が選択された状態で「Ctrl+Pキー」を押して「Object」を選択します。
f:id:rikoubou:20180402141606p:plain

 すると右側のところで子のオブジェクトが親のオブジェクトの下へと移動します。これで親子関係が設定できました。
f:id:rikoubou:20180402141721p:plain

 親子関係を設定したので次は子のオブジェクトの移動方向などを制限していきます。

 子オブジェクトを右クリックで選択した状態で「Objectアイコン」をクリックし「Transform Locks」の項目を開きます。
f:id:rikoubou:20180402142124p:plain

 この「Transform Locks」でオブジェクトの移動や回転などの制限を行うことができます。

 今回はZ軸に対する回転しか行わないので、以下のように設定します。
f:id:rikoubou:20180402142517p:plain

 ちゃんと拘束されているかを確認する場合は、オブジェクトを選択した状態で「Rキー」を押すと回転させることができます。
f:id:rikoubou:20180402142652g:plain


4:親オブジェクトを移動させて原点が次の回転軸の中心になる位置まで持ってくる
 親子関係が設定できているので、親のオブジェクトを移動させると子のオブジェクトも移動します。
f:id:rikoubou:20180402142952g:plain

 次の回転の中心となる部分が原点になるように調節します。
f:id:rikoubou:20180402143224p:plain
f:id:rikoubou:20180402143329p:plain


5:次の子となるオブジェクトを移動させて親子関係を作成する
 次の子となるパーツの回転軸の中心が原点と合う位置まで移動させます。
f:id:rikoubou:20180402143631p:plain

「Origin to 3D Cursor」を行って座標のカーソルも原点に合わせます。
f:id:rikoubou:20180402143757p:plain

 そして新たな親子関係を作成します。
f:id:rikoubou:20180402143845p:plain

 同じように「Transform Locks」でオブジェクトの移動や回転を拘束させます。
f:id:rikoubou:20180402144002p:plain


6:1〜5を繰り返す
 1〜5の手順を繰り返して各オブジェクトの親子関係を構築し、移動や回転の範囲を拘束させていきます。

 今回全てのオブジェクトについて行うとこのようになります。
f:id:rikoubou:20180402145350g:plain


7:グループ化を行う
 親子関係はできましたが、今のままだとオブジェクト同士は親子までの関係しか見れていません。
 ロボットアーム全体で一つという塊にしたいが、一つのオブジェクトにはしたくないという場合はグループ化を行います。

 ロボットアームの全てのオブジェクトを「Shift+右クリック」で選択します。
f:id:rikoubou:20180402150100p:plain

 この状態で「Ctrl+Gキー」でグループ化します。グループになるとオブジェクトが緑枠になります。グループ名が左側に表示されるので、任意の名前に変更します。
f:id:rikoubou:20180402150247p:plain

 これでロボットアーム全体を一つのグループとすることができました。


8:アニメーションを作成する
 基本的にはボーンでアニメーションを作成した時と同様です。違うのは「Object Mode」で各部位を任意の位置まで持ってきて「iキー」でキーフレーム登録をしていくだけです。

 「Dope Sheet」に切り替えたら、まず初期位置として現在の状態をキーフレームとして登録します。

「Shift+Gキー」→「Group」を選択してロボットアーム全体を選択した状態にします。
f:id:rikoubou:20180402150759p:plain
f:id:rikoubou:20180402150843p:plain

 この状態で「iキー」を押してキーフレームとして登録します。
f:id:rikoubou:20180402151011p:plain
f:id:rikoubou:20180402151101p:plain

 あとは同じようにして各パーツを移動させた後「Shift+G」→「Group」を選択して「iキー」でキーフレームを登録というのを繰り返します。
f:id:rikoubou:20180402152239p:plain

 そして今回作成したアニメーションは以下のようになります。
f:id:rikoubou:20180402152546g:plain


 以上がボーンを使わずに作成したアニメーション作成方法になります。
 生物ではなく、工業製品などをBlender上で再現するにはボーンではなくこっちの方法が合っていると思います。

 さらに物理演算などを組み合わせれば色々なことができるようになると思うので、楽しいですね。

おまけ:キーフレームの削除方法
 削除したいフレームまで移動させ、キーフレームに登録しているオブジェクトを選択した状態で「Alt+iキー」を押すとキーフレームを削除できます。

・参考資料

【Fusion360/Blender】Fusion360のモデルデータをBlenderに読み込ませて色をつける

 今回はタイトル通りFusion360で作成したモデルデータをBlenderに読み込ませる方法です。ただしFusion360におけるテクスチャなどの色情報まではBlenderに持ってこれない」ので注意してください。


1:Fusion360のモデルデータをSTL形式で出力する
 モデルの例として以下のような簡単なロボットアームのようなモデルをFusion360で作成しました。稼働部の分だけボディで分けています。
f:id:rikoubou:20180401233759p:plain

 Fusion360のそのままのファイル形式ではBlenderに読み込めないのでSTL形式で出力させます。

 モデル名の部分を選択して右クリックします。
f:id:rikoubou:20180401234901p:plain

 出てきた項目の中から「STL形式で保存」をクリックします。
f:id:rikoubou:20180401235107p:plain

 全ボディを一つの塊として出力することもできますが、今回はボディごとに読み込ませたいので「構造」のプルダウンから「ボディごとに1ファイル」を選択します。
f:id:rikoubou:20180401235148p:plain

「ボディごとに1ファイル」が選択されていることを確認してからOKボタンを押して保存します。
f:id:rikoubou:20180401235308p:plain

 これでボディごとのSTLファイルが出力されます。
(※STLファイルに色やテクスチャの情報は含まれないので注意してください)

・2018/05/09追記:
以下のリンクからSTLファイル一式とblendファイルをダウンロードできます。
robot_arm.zip - Google ドライブ


2:BlenderSTLファイルを読み込ませて組み合わせる
 Blenderを起動させて「File」→「Import」→「Stl」を選択して1で出力させたSTLファイルを読み込ませます。
f:id:rikoubou:20180402000106p:plain

 STLファイルを読み込むと何故か90度傾いているので、読み込んだ後「Rotation」の「X軸」の値を90度回転させてください。また普通に読み込ませるとモデルがかなり大きいようなで「Scale」の値も調節して見やすいようにしてください。
 Fusion360での位置関係は保存されているので、全ての読み込んだファイルについて同じ角度、スケールにしてやるとちゃんとした位置に表示されます。

 今回は取り込んだSTLファイルを全て「X軸を90度、Scaleを全て0.01」に設定しました。
f:id:rikoubou:20180402001122p:plain


3:各オブジェクトに色をつける
 元のFusion360のファイルでは色をつけていませんでしたが、テクスチャなどをつけていたとしてもSTLファイルにした時点で色が抜けてしまいます。なのでBlender上で色をつける必要があります。

 色をつけたいオブジェクトを選択した状態で「Materialアイコン」をクリックし「New」のボタンをクリックします。
f:id:rikoubou:20180402001811p:plain

 Materialが追加されるので「Diffuse」の白い部分をクリックします。
f:id:rikoubou:20180402002036p:plain

 すると色が選択できるので、各値を調節してボディにつけたい色を選択します。
f:id:rikoubou:20180402002142p:plain

 色を選択したらわかりやすいようにMaterial.001の名称を変更します。ここでは黒っぽい色を選択してマテリアルの名前をBlackにしました。
f:id:rikoubou:20180402002537p:plain

 これで該当部分に色がつきました。
f:id:rikoubou:20180402002641p:plain

 色がつかない場合は3D Viewの下あたりにあるアイコンを「Material」に変更すると適用されます。
f:id:rikoubou:20180402002858p:plain

 一度作成したMaterialは他のオブジェクトにも適用できますし、新たなMaterialを作成すれば違う色にすることもできます。

 今回読み込んだFusion360のデータはこのように色付けしました。
f:id:rikoubou:20180402003224p:plain


 以上がFusion360のモデルデータをBlenderに取り込む方法です。色情報まで読み込むことはできませんが、パーツごとにボディを分けてインポートすれば簡単に色分けすることができます。

 次はこのモデルデータを使ってボーンではなく、別の方法でのアニメーションの解説をしたいと思います。


・参考資料


・次の記事
rikoubou.hatenablog.com

【Blender】動画出力方法

 今回は題名通りBlenderで動画出力をやってみたのでその備忘録です。
(※すでにアニメーションの作成が完了していることが前提です)

1:環境
■開発環境


2:出力設定を行う
f:id:rikoubou:20180327193026p:plain

 基本的には上の図の順番に設定していけばOKです。

  1. はじめに①としてカメラのアイコンをクリックします。
  2. ②として「Output」のところにあるフォルダボタンをクリックして保存したいフォルダを選択します。
  3. 次に③の部分にあるところをクリックして「FFmpeg video」を選択します。
  4. そして④として「Encoding」のContaineから「MPEG-4」を選択します。

 これで出力する動画をmp4にする設定が完了です。


3:レンダリングして動画を出力する
 出力設定が完了したので動画として出力します。動画出力は簡単で「Render」のところにある「Animation」をクリックするだけです。
f:id:rikoubou:20180327193041p:plain

 モデルのポリゴン数や動画の長さによってレンダリング時間は異なりますが、PCのスペックによるところも大きいので気長に待ちましょう。


 以上がBlenderでの動画出力方法です。設定項目が色々わかりにくいですが、mp4で出力できることがわかったので色々と役立ちそうです。


・参考資料
blog.kentan.jp

【Blender】剛体シミュレーションが途中で止まってしまう場合の対処法

 Blenderで剛体(Rigid Body)を使ったシミュレーションをやっていたところ、途中で剛体の動きが止まってしまうことがありました。
 対処方法は簡単なのですが、知らないとハマる人が多いと思うので備忘録として残しておきます。


■対処方法
 最初に「Scene」のアイコンをクリックします。
f:id:rikoubou:20180330165921p:plain

 次に「Rigid Body Cache」のプルダウンをクリックして「End」の値を大きくします。(デフォルトだと250になっているはずです)
f:id:rikoubou:20180330170124p:plain

 この「Rigid Body CacheのStartとEndのフレーム内において剛体シミュレーションを行う」という意味らしく、この範囲を調整してやることで剛体シミュレーションの長さをコントロールできます。


 以上が対処法です。簡単ですが、知らないとずっとハマることになりそう(というか自分が随分ハマった)なので誰かの助けになれば幸いです。
 というか、Blenderは色々できるけど設定項目が多すぎてわけがわからなくなる……。


・参考資料
detail.chiebukuro.yahoo.co.jp