ロボットアームのケーブルを動かす

  • ボーンとスキン

前回は、ロボットアームのケーブルをアームのモーションに合わせて動かす処理を見送っていました。
今回はこのケーブルについてボーンとスキンを使って表現していきます。
現状は、ケーブル部分はロボットアームのモーションについてきていません。

ボーンとスキン

ロボットアームのような機械的な動きの場合は、ブラウザのパートやジョイントの階層構造だけでモーションを付けることができていました。
一方、配線のケーブルの場合はしなやかに曲がる必要があります。

ケーブルは自由曲面で作成されています。
この形状の変形を伴うモーションは「スキン」を使用することで実現します。
Shade3Dではすべてのジョイントに対してスキンと併用できますが、スキンとともによく使用されるジョイントとして「ボールジョイント」と「ボーン」があります。

スキンの仕組み

線形状または自由曲面のコントロールポイント、ポリゴンメッシュの頂点に対してジョイントの動きについてくるようにするための情報を与えます。
この割り当てを行う動作のことを「バインド」と呼びます。
以下は単純な円柱のポリゴンメッシュに対してボーンを割り当て、ボーンを回転させて変形を行っています。

スキンは、形状の個々の頂点(コントロールポイント)に対して関連する複数のジョイントがどれくらいの割合で影響を与えるか、という「ウエイト値」で制御します。
内部データとしては、頂点数 x 関連ジョイント数 のテーブル形式で表現されます。

ボーンは、中心点から次のボーンの中心に伸びるジョイントです。
上記の場合は、赤い矢印がボーンになります。
地面に一番近い頂点ではboneAの影響が100%になります。
これをウエイト値で表すと1.0、boneBの影響はまったく受けないため0.0です。
1つの頂点に与えることができるウエイト値の合計は1.0になるように自動計算されます。
上記のboneBの中心位置(ポリゴンメッシュの円柱の中間)の頂点のウエイト値は、boneAが0.18と弱まり、
boneBのウエイト値が0.82となっています。
頂点の2つのボーンによるウエイト値の合計は、0.18+0.82=1.0になります。
この円柱の先端に行くにしたがって、boneAの影響が0.0、boneBの影響が1.0となっていきます。

このスキンのウエイト値を使うことで、ボーンが動いた場合にポリゴンメッシュの頂点が移動して変形することになります。

スキンを使用する際の注意事項

スキンを使用する場合、すべてのジョイントは「リセット」されている必要があります。
ここでの「リセット」は、回転ジョイントの場合は回転値が0の状態です。
モーションウィンドウで「シーケンス」チェックボックスをオフにし、
ブラウザで一番親となるジョイントを選択。
右クリックしてポップアップメニューで「全てのジョイントをリセット」を選択すると、
ジョイントの値はゼロにリセットされます。

以下のようになりました。

シーケンスモードがオフのときはすべてのジョイントをリセットしておく、
モーション指定時はシーケンスモードをオンにしてキーフレームを割り当てる、と理解しておくのがよさそうです。
なお、シーケンスモードがオフ時のジョイント値の変更は、シーケンスモードオン時のキーフレームの割り当てに影響を与えません。
シーケンスモードのオフ/オンは、静止状態のポーズとモーション時のポーズの連続(キーフレーム指定)、という2つの格納場所の違いになります。

このシーケンスモードがオフの状態で、改めて線形状と自由曲面を使用して配線のケーブルを作成し直しました。

このケーブルの作成方法については「ロボットアームのポージングとレンダリング」をご参照くださいませ。

ボーンの配置

ボーンを使用してケーブルのスキン変形を行います。
下側のケーブルは2本分を自由曲面で配置しています。

ケーブルは「ジョイント1」の回転ジョイントのアーム部の下側から、上の「ジョイント2」の回転ジョイントのアーム部に接続されています。

そのため、ケーブルの自由曲面とこれから作るボーンは「ジョイント1」内に「ケーブル」のパートを作成し、その中に入れるようにしました。
この状態でジョイントモードでアーム部を回転させるとケーブルの根本はアームについてきていますが、
上部は離れてしまいます。

この部分をボーン+スキンを使って調整します。

ボーンの配置は、ツールボックスの「パート」-「ジョイント」-「ボーン」を選択し、図形ウィンドウでドラッグすることで2点を結ぶボーンが配置されます。

この2つのボーンを「boneA」「boneB」と名前変更しました。
「boneB」を複製して「boneC」に名前変更。「boneB」内に「boneC」を入れました。
これを繰り返し、ケーブルに沿って「boneA」から「boneM」までを配置しました。

このボーンは、ブラウザ上でケーブルの自由曲面の下に配置しています。
また、反対側のケーブルにも同様にボーンを配置して以下のようにしました。
以下はジョイントモードでケーブルのボーンを選択しています。

ボーンのパラメータ

ブラウザでボーンを選択すると、形状情報ウィンドウに「ボーンジョイント属性」が表示されます。

モーションを与える場合にボーンが持つことができるキーフレーム情報は、「回転」と「オフセット」の2つです。
「回転」は、ボーンの中心から距離を保った状態で回転します。

「オフセット」は、ボーンの中心から特定の位置に移動します。

スキンの割り当て

スキンを使用するには、線形状または自由曲面またはポリゴンメッシュ、階層構造を持つジョイント、の2つの要素が必要になります。
今までの作業で、ケーブルの自由曲面とボーンの階層構造を2組作成しました。
これらを使ってスキンを割り当てていきます。
以下のように、自由曲面とボーンの階層構造があります。

モーションウィンドウで「シーケンス」チェックボックスがオフになっていることを確認します。
スキンの割り当ては、前述の「スキンを使用する際の注意事項」のとおりにジョイントがリセットされた状態でないと割り当てできません。

ブラウザでケーブルの自由曲面を選択します。
形状編集モードに移行し、自由曲面のすべてのコントロールポイントを選択します。

メインメニューの「表示」-「スキン」を選択します。
これでスキンウィンドウが表示されます。
左の「頂点ブレンド」ボタンをクリックします。

以下のような縦方向にポイント番号(#0~)、横方向に影響を与えることが可能なジョイントがテーブル表示されます。

初期状態では何の割り当てもないため「-」で埋められています。
対象となるのは選択されている頂点(コントロールポイント)です。
選択されていない頂点にはスキンが割り当てられないため、注意してください。

ジョイントは割り当て可能なものが列挙されるため、必要なジョイントだけに絞ります。
スキンウィンドウ上の「列表示」をクリックし、左のポップアップメニューで「階層」を選択します。
「boneA」とその子のジョイント名のみチェックを付けて、それ以外はチェックを外します。

これにより、テーブルとして表示される列方向は指定したジョイントだけになります。

スキンウィンドウ上の「スコープ」を選択し、バインド対象となるジョイントを選択します。
「boneA」とその子のジョイント名のみ選択状態にします。

この「スコープ」はバインドの対象となるジョイントの指定です。

「バインド」ボタンを押すと、指定のスコープ対象のジョイントに対して自動でスキンのウエイト値が割り当てられます。

このロボットアームのケーブルのように形状の中心にボーンが通る構造の場合は、
ほぼこの自動バインドでスキン割り当てが完了します。
キャラクタのスキンの場合は、この後ウエイト値の微調整が必要なことが多いです。

スキンの確認

では、ボーンを動かすとスキンとしてバインドした形状(自由曲面)が付いてくるか確認します。
コントロールバーでジョイントモードに移行します。

ケーブルのボーンを回転させると、ボーンに沿ってケーブルが付いてきました。
いったん元のボーンの回転に戻しておきます。

もう片側のケーブルとボーンも同じようにスキンを割り当てました。

キーフレームごとにケーブルを調整

モーションウィンドウの「シーケンス」チェックボックスをオンにします。
ロボットアームは前回ですでにキーフレームを割り当て済みです。
0フレーム目に移動します。

ケーブルの根元はジョイント1のアームとつながっていますが上部はアームから離れてしまっています。

ジョイントモードに移行し、ケーブルのボーンを回転させてケーブルの先端が「ジョイント2」側のアームに届くように変形していきます。

この状態をキーフレームに登録します。
この作業は、すでに割り当てられているキーフレームの0フレーム目を上書きします。
モーションウィンドウのタイムラインでフレーム位置を変更しないようにして、
ブラウザでルートのジョイントとなる「土台」の回転ジョイントを選択。
モーションウィンドウの「+」ボタンを押してキーフレーム登録します。

キーフレームを上書き登録するまでは、タイムラインでフレーム位置を変更しないようにしてください。
もし、ジョイントのポーズ変更を行った後にタイムラインでフレーム位置を変えると、タイムライン上のポーズが採用されて、ポーズの変更がクリアされてしまいます。

モーションウィンドウで30フレーム目に移動し、同様にケーブルの先端位置を調整します。

ケーブルの調整が完了したら、「+」ボタンを押してキーフレームを上書き登録します。

これを繰り返していくことで、ロボットアームの動きにケーブルが付いてくる動きに近づきます。
なお、もしボーンの回転だけで「ジョイント2」側のアームに届かない場合は、オフセット(移動)を使うようにします。

このオフセットはゴムが伸びたような表現になります。

モーションを再生すると以下のようになりました。

ジョイント2とジョイント3に渡すケーブル

この作業は、ジョイント1とジョイント2をつなぐケーブルと流れは同じです。
ジョイント2とジョイント3に渡すケーブルは、シーケンスがオフの時に以下のように配置しています。

ボーンを配置しました。

これらの自由曲面とボーンは、「ジョイント2」パート内に配置しました。

この2組の自由曲面とボーンに対して、同様にスキンを割り当てました。
なお、Shade3Dでボーン名(ジョイント名)は同じものを複数指定できますが、スキンウィンドウではどのジョイントにウエイト値が割り当てられているかの確認で、
同一ボーン名の場合は判断がつきづらいです。
ボーン名(ジョイント名)については別々の名前を与えておいた方が管理しやすかもしれません。

スキンの割り当てがうまくいかない場合

階層化された多数のジョイントを使用する場合、スキンウィンドウでバインド対象を選択するときに選択できなくなることがありました。
以下の場合、赤く囲った部分をクリックしても反応していません。

この対策として、いったんケーブルだけを別シーンに分離し別シーン上でスキンを割り当てます。

このshdファイルを保存し、元のシーンにインポートしてロボットアームの階層構造に再配置しました。

ジョイント2とジョイント3に渡すケーブルのキーフレーム登録

ジョイント1とジョイント2に渡すケーブルの場合はゴムのように一部伸ばす部分がありましたが、
ジョイント2とジョイント3に渡すケーブルでは長さが余る箇所が出てくるため、現実のように重力によってたゆんだような動きを与えました。

この動きを全キーフレームに対して割り当てて(キーフレームを上書きして)いきます。

モーションウィンドウの再生ボタンを押すと、以下のようにアニメーションしました。

慣性による揺れなどを加えていくとよりそれらしくなると思います。

最後にアニメーションレンダリングしました。

今回は、ボーンとスキンを使ったモーション付けの説明でした。
ボーンもしくはボールジョイントやスキンを使う工程は、もっとたくさんの知識が必要になる箇所です。
今回はまだ簡単な部類になります。
これらについては、チュートリアルで後々説明していく予定にしています。

次回は最終的なレンダリングでの品質向上(ちらつきを抑える)、
ロボットアームの動きで複数のカメラワークを使用し、プロモーションビデオのようなストーリーを与えた動画作成について解説予定です。

カテゴリー: ロボットアームを動かす