Shade Bullet V1.1.0

Masa: http://masatoshisoh.sitemix.jp/ 2019/03/20

Shade Bullet は、物理演算エンジンBullet3-2.87 のプラグインによる実装です。基本形状(箱、球、カプセル、円筒、円錐)の剛体と、Shade のボーンジョイントとボールジョイントに対して Bulletの拘束ジョイントを連携させる機能と、ソフトボディのクロスを実装しています。
現時点では、マルチ形状の剛体や、メッシュ形状の剛体は未実装です。また、ロープも未実装です。
Bullet による物理演算は、Shadeのシーケンスモードでのシーケンスの変化に連動して実行します。ですので、シーケンスモードでの特定の時刻でのレンダリングおよび、アニメーションレンダリングが可能です。
V1.1.0 では、主にクロスのパラメーターとクロスの写像メッシュという機能の追加と、動作の安定性の向上を図っています。

インストール方法


動作環境

使用方法

対象の登録

Bullet の物理演算機能を実現するには、予め静止画モードでシーンへの対象物の登録および編集をしておきます。実際の実行は、シーケンスモードでモーションポイントを動かすか、アニメーションレンダリングで行います。以下に列記します。
  • Bullet Worldの作成
    ツールボックス->作成->プラグイン->Bullet->ワールドを実行します。

    すると上記のようなダイアログが現れます。左の例は、通常のダイアログで、右の例は、Windows版で、コントロールキーを押した状態で実行した場合です。各パラメータを設定してOKを推すと、Bullet World パートが作られます。このパートの中に各種の物理演算対象の形状を配置します。 1つのシーンに複数の Bullet World を作れます。それぞれは、互いに無関係で物理演算を行います。パートの名前は、後から自由に変更出来ます。
    以下に各パラメータの説明をします。
    • 有効
      チェックがあれば、シーケンスモードになったときに、このBullet World 下の物理演算を実行します。チェックがなければ、何もしません。モーションの登録をするためにシーケンスモードにするときはチェックを外しておきます。
    • スケールファクター
      Shadeの座標系のスケール->Bullet内のスケールへの変換値です。Bulletの標準スケールでは、人体の服レベルの物理演算は、まともに機能しません。その場合、10~20位に設定すると安定します。
    • 重力、水平面高、大気密度
      Bullet World 内の各種のパラメーターです。これらは、標準値のままでいいでしょう。勿論これらを調整して、動きの変化を確認するのは、個人の自由です。
    • シミュレーションサイクル
      標準は、60サイクルです。この値と、Shadeのフレームレートの値との間の制限事項は、Shadeのフレームレイトより上にすること以外はありません。上げるとより正確な計算になりますが、その分計算負荷が増えます。
      ただ、小さいスケールの場合は、このサイクルを上げた方が精度が上がります。
    • View Debug
      Windows版でコントールキーを押したままダイアログを開くとこのアイテムが現れます。これにチェックを入れると、シーケンスモードでBulletが有効になるとBulletからみた世界のフレームワークのウインドウが開きます。表示は、透視図での視線と同じになります。これを使えば物理演算の挙動をBullet側から観察することが可能になります。

  • 剛体の作成
    こツールボックス->作成->プラグイン->Bullet->プリミティブ/剛体を実行します。

    すると上記のようなダイアログが現れます。各パラメータを設定してOKを推すと、Bullet 剛体パートが作られます。このパートの直下に基本形状(プリミティブ)が作られます。ブラウザ上でのそれらの名前の後ろに判別用の文字がつきます。また剛体の方には、そのグループ番号もつきます。剛体をパートにして、基本形状と分けた形式にした理由は、Bulletの構造に添った事と実装が楽になる事と、 剛体パートの中に任意の形状を放り込んで剛体と一緒に動かすことが出来るメリットが出せることです。ダイアログの上半分は、剛体属性、下半分は、基本形状属性です。
    出来た剛体は、全て原点位置に作られます。もし、出来た剛体が、Bullet World の中に入ってない場合は、後からブラウザ上でドラッグして、任意の Bullet World の中に入れてください。そして、剛体パートを選択して移動させたり、姿勢を変えたりして希望の初期設定をしてください。 剛体パートや基本形状の名前は、自由に変更出来ます。以下に各パラメータの説明をします。
    • 種類
      Bulletの剛体は、3種類あります。動型、駆動型、静型です。動型は、物理演算によって動く剛体です。駆動型は、基本Bulletでは動かしません。ユーザ側でジョイント等を使って動かす剛体です。静型は、完全に動かない剛体です。
    • 質量
      剛体の質量です。動型以外の剛体の場合は、0にする必要があります(自動で設定されます。)。動型の場合は、任意の質量を設定出来ます。普通は1でそれらしく動くと思います。実際の動きを見ながら調整してください。
    • 初速度
      物理演算開始時点の初速度です。弾で標的を撃つような場合に使います。
    • 摩擦係数、反発係数、移動減衰係数、回転減衰係数
      剛体の運動での各種パラメータです。動きや衝突時の挙動の調整に使ってください。
    • グループ番号、非衝突グループ
      これらの設定は、剛体同士やソフトボディとの衝突時に予め衝突評価をスキップすることで、計算負荷を低減するための設定です。グループ番号は、その剛体のグループで、0~Fまでの16グループの中から選びます。非衝突グループは、ビットが立っているグループの剛体や、ソフトボディとは、この剛体は、衝突しないよという意味になります。チェックを入れなければ、どのグループとも衝突するという意味になります。但し、相手と自分両方で衝突検出する設定でないと衝突しません。この使い方の特殊な例として、MMDの髪は、髪のグループ番号を設定しておいて、非衝突グループに自分自身のグループにチェックをいれる設定になってます。これは、髪の連続した衝突検出用の剛体が初めから互いに衝突しているため衝突無視にしないと、剛体同士で弾きあい妙な挙動になるからだと思われます。
    • プリミティブ/種類
      基本形状の種類を設定します。種類は、箱、球、カプセル、円筒、円錐の5種類です。箱や、球は最も基本の形状ですが、カプセルは、動型と衝突させる駆動型の剛体として便利な形状です。
    • 伸長方向
      種類が、カプセル、円筒、円錐の場合の伸びる方向を指定します。他の種類の場合は意味を持ちません。
    • 描画
      チェックを入れると、その基本形状は、Shadeでレンダリングされます。その場合は、自由に表面材質を設定出来ます。チェックを外すと基本形状はレンダリングされません。衝突の挙動結果だけを利用する目的の場合で使います。
    • マージン
      確実に衝突検出出来る為のマージンです。あまりに小さいと高速に衝突した剛体同士が筒抜けるので、適切な値が推薦されてます。大きくすれば、確実に衝突しますが、衝突時の挙動が不自然になります。
    • X/半径、Y/高さ、Z
      箱の場合は、X,Y,Z、球の場合は、半径のみ、カプセル、円筒、円錐の場合は、半径が円の部分の半径、高さが伸長方向の長さになります。

  • Bullet Worldの編集
    Bullet World パートを選択して、ブラウザ->コンテキストメニュー->Bullet編集を実行します。

    内容は、Bullet World 作成時とほぼ同一ダイアログが現れます。各パラメータの意味も同じです。ここで、以前設定されていたパラメータを修正出来ます。それ以外に、有効/保留の切り替えする為にも利用します。また、最下段のチェックが追加されてます。この内容の説明をします。
    • 本ワールドの要素のマトリックスを補正する
      このチェックを入れると、このワールドの中の全ての形状の変換マトリックスの整合性を補正します。Bullet の世界でのシミュレーションでは、Shadeの変換マトリックスにあたる座標変換は、移動と回転のみ許容します。ただ、Shadeでは、その他の拡大縮小や、せん断等いくらでも変形出来てしまいます。意図せずにユーザが拡大縮小や反転コピー等を実行した場合、シーン内での実際の見栄えとBulletからみた位置関係に矛盾が起こります。その可能性があるシーンの場合このチェックを入れると矛盾を解消します。ただし、矛盾を解消することでシーン内の形状の形が変わる場合があることを承知してください。
    • 内部要素を現バージョンに更新
      本バージョンでは、V1.0に対して拡張した部分があります。そのためそのままでは、V1.1.0 ではうまく動作しません。その場合、このチェックを入れるとその内部をV1.1.0用に変換します。

  • ボーンジョイント、ボールジョイント(代替えボーンジョイント含む)を選択してのBullet編集
    ジョイントを選択して、ブラウザ->コンテキストメニュー->Bullet編集を実行します。

    上記のようなダイアログが現れます。対象を拘束ジョイントにして各パラメータを設定してOKを押すと、選択されたジョイントから、実行階層の数分のジョイントにBullet の拘束ジョイント属性が適用されます。同時に対応する動型の剛体がジョイントツリーに内に配置されます。この状態で、シミュレーションを行うと、拘束ジョイント属性のジョイントが、剛体の動きに合わせて揺れるようになります。挙動としては、Shadeのモーションエフェクトのような動きですが、本ジョイントは、剛体同士の衝突の効果も含めて動きます。
    • 実行階層
      選択されたジョイントの子に繋がる同種のジョイント分の数値が表れます。この値分、子の階層まで処理を実行します。
    • タイプ
      拘束ジョイントの種類を6Dof、6Dofスプリング、コーンから選びます。6Dofスプリングはジョイントをバネ付きのジョイントに、コーンは可動範囲で動きの堅さが微妙に変わるジョイントになります。
    • 回転最大、最小係数
      ジョイントの可動範囲を指定します。順番は、x、y、zの順です。最小<最大の場合は、その範囲でジョインが動き、最小と最大が等しい場合はロックされ、最大<最小の場合は、制限無しになります。
      但し、タイプが、コーンの場合は、回転最大係数だけが意味があり、最小値は、-最大値になります。
    • ばね回転係数、ばね移動係数、回転、移動ダンピング係数
      タイプが6Dofスプリングの場合のパラメータです。移動系は、0のままにして置いてください。ばね係数は、バネの強度を指定します。ダンピング係数は、バネの揺れの減衰係数です。1の場合無限に揺れ、0の場合殆ど揺れません。これらの属性は、剛体の生成時のパラメータと同じです。ただ、基本形状の属性は、種類も含め自動計算しますので、メニューには現れません。
    • コーンソフトネス、バイアス係数、コーン緩和係数
      タイプがコーンの場合のパラメータです。コーンの可動範囲内でのジョイントの堅さを調整する係数です。
    また、対象を駆動型剛体にしてOKを押すとジョイントに添って駆動型のカプセル剛体が生成されます。この場合、ジョイントはただのジョイントですが、そのジョイントによって動かされる駆動型剛体一式を作るのに利用出来ます。出来た剛体およびその子の基本形状を選択して、後からBullet編集を実行して、剛体の属性(大きさ等)の微調整で仕上げることが出来ます。この場合は、拘束ジョイントのパラメータは意味を持ちません。勿論、この方法を使わなくても、ジョイントの中に自由に駆動型剛体を作っても同じ事です。

    剛体属性
    • 種類
      箱、球、カプセル、円筒から、生成する基本形状を選択します。基本形状のサイズや方向は自動計算されます。
    • 質量
      拘束ジョイントの場合のみ意味があります。
    • その他のパラメーター
      剛体生成時の属性と変わりません。
    • 剛体グループ番号、非衝突グループ
      ここで生成される剛体は、同じグループ番号同士は非衝突になります。つまり、自動的に設定したグループ番号の非衝突グループの部分にはチェックが入ります。

  • ポリゴン形状を選択してのBullet編集
    ポリゴン形状にソフトボディの属性を付加します。但し、本プラグインでは、ポリゴン形状の部分をソフトボディ化できます。さらに、1つのポリゴン形状に複数のソフトボディを付加することが出来ます。また、頂点の一部をアンカーとして、他の剛体に貼り付けることが出来ます。 その為にこのダイアログを開く前に編集モードかつ面選択モードにし、ソフトボディ化したい部分の面を選択しておきます。また、アンカーにしたい頂点があれば、私提供の要素マークで、予めアンカーにしたい頂点をマークしておく必要があります。もし、編集モードかつ面選択モードでない場合は、選択された形状全体をソフトボディ化します。その状態でBullet編集を実行します。

    すると上記のようなダイアログがあられます。下部の各種のパラメーターは、Bulletのソフトボディに設定出来るパラメータです。これらに値を設定したときの挙動は、各自試してみてください。
    以下に各パラメーターの説明をします。
    • アンカー形状
      固定用のアンカー剛体の候補を選ぶメニューです。そのポリゴン形状と同じ階層のアンカーに出来る可能性のある剛体があれば、メニューに現れます。なければメニューに現れますせん。
    • ソフトボディ名
      ポリゴン形状に登録された複数のソフトボディの識別用の名前です。自動で連番がつきますが、名前は自由に付けて構いません。登録後、修正したりするときの選別に使います。
    • 質量
      このソフトボディの質量です。基本は1から始めて挙動に添って変更してください。
    • 風速
      このソフトボディが受ける風の力を指定します。風に吹かれる旗の効果等に利用します。
    • グループ番号、非衝突グループ、マージン
      これらは、剛体の登録時のファクターと同じです。ただ、メッシュの面の長さはマージンより大きくないとまともなシミュレーションが出来ない様です。
    • リンク交雑
      頂点毎の力の掛かり方をランダムに変化させて布の挙動に変化を与えるもののようです。
    • 布 堅牢製 距離、平行剛性係数、曲げ剛性係数、体積剛性係数
      これらの4の属性は、一組でクロスの属性(堅さ)を設定するものです。最初の距離は、各メッシュ頂点からどこまで堅牢性の影響を持つかの値のようです。1の場合は堅牢性は意味を持ちません。2の場合は、隣の頂点まで堅さの影響が続き、3、4となるに連れ、各面の堅さが続くと考えられます。平行剛性係数は、布の伸び縮み、魔が剛性係数は、布の曲がり具合、体積剛性係数は、布の体積の保持力と考えられます。
    • その他のパラメータ
      これらの属性は、Bulletのパラメータをそのままメニューに出してます。この中で接触硬度は、各相手との接触感度を与えます。これが1ならば、より中に食い込みにくくなります。剛体は、通常の剛体、動体は、駆動型剛体です。アンカー硬度は、アンカーに繋がった頂点がどの位しっかり繋がっているかのパラメータですが、1が最大ですが、それでも場合によってはずれます。
    • クラスタ化、分割数
      これらの属性は、布をより正確にシミュレーション出来るようにする手法のようです。チェックが入るとクラスタ化が有効になります。そうなるとその下のクラスターファクターが有効に成ります。これらの上3は、接触硬度、下3つは、衝撃で布が裂けるかのパラメータの様です。ただ、クラスタ化すると同じパラメータ値で、布が駆動剛体をすり抜けてしまいやすくなる傾向になります。
    • ソルバー
      この3つの値は、各ソルバーの実行の繰り返し回数です。これら増やすと、より正確なシミュレーションになりますが、処理時間がその分増えます。
  • 既にBullet属性が付加された形状を選択してのBullet編集
    既に、Bulletの属性が付加された、形状を選択してBullet編集を実行すると、その属性毎に異なるダイアログが、現れます。基本は、登録内容の補正用です。多分殆どのダイアログでは、細かく説明の必要はないと思いますので、各ダイアログを表示するに留めます。
    • 基本形状の場合

      Ver1.1.0 から形状の種類も変更できるようになりました。削除は、形状の削除で行います。
    • 剛体の場合

      種類の設定間違いの修正および、全パラメータの修正が可能です。削除は、パートの削除で行います。
    • 拘束ジョイントの場合

      最上部にジョイントに対する拘束ジョイント属性の削除のチェックがあります。これをチェックすると、ただのジョイントになります。それ以外には、ジョイントの両端の剛体の指定し直しが出来ます。剛体1は、このジョイントと同一階層、剛体2はこのジョイントの子に限られます。
      注意点としては、剛体1の位置とジョイントの位置は、同じにしないようにしないと、動きの柔軟性が無くなるようです。
    • ソフトボディの場合

      最初のダイアログは、ソフトボディの新規追加、指定編集対象ソフトボディの再編集、指定編集対象ソフトボディの削除を選びます。すでに、全体をソフトボディ化したポリゴンの場合は、新規の選択と変数対象名は現れません。再編集を選ぶと以下のダイアログが現れます。

      新規追加と同様なダイアログですが、最期の「頂点情報も更新」がチェックされていると、ソフトボディの範囲の修正や、アンカー頂点の変更もその時点の情報で更新します。チェックが無いと旧情報をそのまま利用します。もしソフトボディ登録後、このポリゴン形状の頂点を編集した場合は、これにチェックをいれてください。
  • 写像メッシュ
    Bullet でそれなりに安定した布のシミュレーションが可能がメッシュは、なるべく大きさが揃って、マージンより広い面で作る必要があります。しかし、実際にモデリングしたポリゴン形状の場合、筋を付けたり、アクセサリを付けたり、また一部に詳細に作り込む面があったりとそのままシミュレーションするには向かない場合が多々あります。そのため本プラグインでは、シミュレーションさせたい部分だけ別のポリゴン形状として取り出し、面を調整し。それを予め全てをソフトボディ化して置き、そのシミュレーション結果をそのまま元の形状に反映出来る機能を付加しました。方法は、まずソフトボディ化したポリゴン形状を記憶し、元のポリゴン形状を選択し、そのソフトボディを反映させたい頂点だけを選択して、Bullet編集を実行します。すると以下のようなメッセージで、写像メッシュが出来ます。同じ対象に何度でも、別設定で写像メッシュを設定出来ます。頂点を選択しないで、Bullet編集すると、写像メッシュは、解除されます。

物理演算の実行

静止画モードで、Bullet World 内の剛体や、ジョイント、ソフトボディの配置を再確認します。Bullet World を保留化して、モーションウインドウ内で、駆動型剛体を動かすジョイントのモーション付けをします。動作確認後、Bullet World を有効化します。これで準備完了です。
  • シーケンスモードの切り替え
    予めモーションウインドウを開いて置くと便利です。その時点で、シーケンス値が0でない場合は、シーケンスを進めたときに意図しない挙動になる場合があります。まずシーケンス値を0に戻して、再度シーケンスモードに入り直してください。 このプラグインでは、シーケンスモードに入った時点で、BulletのWorldを新規構築します。また、静止画モードに戻ると、安全の為このプラグインでは、Worldを破棄します。 同様にシーケンス値を0に戻すと、Worldの破棄と再構築を自動的に実行します。

  • フレームの移動
    モーションウインドウでステップ実行すると、その都度Bulletは、1単位シミュレーションを実行します。剛体やソフトボディの挙動を確認してください。また、
    また、シーケンスを逆にさかのぼると、一応逆方向への動きになりますが、これは、時間をさかのぼっているのではなく、方向を逆にした状態でそのまま実行を続けています。 ですので、何度か行き来していると、単純に実行している場合とは、合わなくなります。最終的には、頭から再実行してください。

  • 再生ボタンでのプレビュー
    再生ボタン押すことでBulletの実動作を確認出来ます。このときは、スナップをオンにして、その左のメニューのフレームスキップをオフにしておかないと経過が見れません。また余裕があれば簡易表示もオフにして置くことを薦めます。

  • アニメーションレンダリング
    Bulletの効果付きでアニメーションするには、アニメーションレンダリング前にフレームを初期位置にもどし、シーケンスモードに切り替えてから、アニメーションレンダリングする必要があります。シーケンスモードにしないと、Bulletは動きません。これは、Shadeの制限のようです。

現時点での制限事項

  • 最初のフレーム
    最初のフレームのポーズは、静止画モードで、Bulletワールドを構築したときと同じにしてください。また、シーケンスモードに入るときのシーケンス値は、初期値0にして下さい。でないと、正しく動作しません。

  • ジョイントの可動範囲設定
    ちゃんとジョイントの可動範囲を設定していても、制限が効かない場合があります。

  • 拘束ジョイント内の剛体
    自動で生成した場合は考慮されてますが、マニュアルで配置した場合の注意事項として、ブラウザ上での剛体の配置は、階層が高いものを前に配置するように願います。でないと、正しい挙動をしません。

サンプルシーン

  • 0rigid_falling2.shd
    幾つかの剛体が落ちてきて、斜めの坂にぶつかり、そのまま滑っていきます。その下に左右に振れる板で、それらの剛体を掃きます。自由剛体と駆動剛体同士の衝突を確認しています。

  • 1soft_with_rigid.shd
    1つのポリゴンの板の両端をそれぞれソフトボディ化し、境界をアンカーで固定してその部分がそのまま下に垂れるシミュレーションです。右のソフトボディの下に剛体を置き、それとの衝突を確認しています。

  • 2bone_tst_start.shd
    拘束ジョイントを作る前のシーンです。ボーン1選択して、Bullet編集を実行して、そのままOKで、剛体を生成し、1~4までのボーンを拘束ジョイントにします。
  • 3bone_tst_start.shd
    拘束ジョイントのシミュレーション確認用シーンです。上記のシーンから出来ます。シミュレーションを実行すると剛体がゆらゆら振り回される動きを確認出来ます。
  • 4hata.shd
    旗状の布を片方をアンカーに固定して、そのアンカーを水平に振り、その下を駆動型剛体を振ることで、墜ちてくる旗をはね除けるモーションです。ソフトボディの設定を色々変えて、挙動の変化を確認してください。