2014年3月27日木曜日

3D落書き : クロースシミュレーションで人体浮遊マジック風の絵

手品を見ていて「コレCGか?」って思ってしまうことってありますよね? そんな事を考えてたら1つ落書きのネタを思いつきました。 こんな絵です。

bokete.jpにもお題として投稿してみました。 興味がある方はどうぞ。

-------------------------------------

マジシャンの絵は前に用意した青人間です。 浮いている人を覆う布はBlenderのクロースシミュレーションで作りました。 どうでもいい話ですが、「関本」っていうのはたまに聞くけど知り合いには居ない苗字ってのを選びました。 なんかの配慮のつもり。

簡単に絵の作り方を説明しましょう。 手順は、

  1. DAZ Studioで浮いてる人の形状データを作る。
  2. Blenderのクロースシミュレーションで浮いてる人に布をかける。
  3. 布のデータをDAZ Studioに渡して絵を完成させる。

浮いてる人の形状データはDAZ Studioで適当なフィギュアを出して、ポーズをつけてからexportします。 静止画を作るので可動させる必要は無いため、グループ無しのobjファイルで出力しました。 これにBlenderで布をかけます。

クロースシミュレーションのやり方はこちらを参考にしました。

17分もある動画なので、何度も見返してやり方を確認するのは面倒ですよね? 一応このネタ用の説明に置き換えて、簡単に書いておきましょう。 使用したBlenderのバージョンは2.69。 ウィンドウズ版です。 説明の画像は後から適当にキャプチャしました。 微妙に絵があってなかったらゴメンナサイ。

Blenderを起動したらレンダリングエンジンのCyclesレンダーを選択します。

DAZ Studioで用意したフィギュアをimportし、それにかける布のデータを用意します。

布のデータは最初は平面でやったんですが、その場合シミュレーションのときに無駄に動いて多くのフレームの計算が必要になりました。 フレーム数を減らすためには最初からある程度体を覆うような形の方がいいようです。 そんなわけで円柱を半分に切ったものを布の元にしました。 作成手順は、

  1. 円柱を原点付近に追加。頂点数は100。横たえる。
  2. エディットモード、真横ビューに変更。
  3. Aキーで全ての選択を解除。
  4. Bキーを押し、矩形選択で下半分の頂点を選択。削除。
  5. Ctrl-R で輪切りに。マウスホイールでカット数を70にして実行。
  6. オブジェクトモードに変更。左パネルのオブジェクトツールでシェーディングセクションのスムーズボタンを押す。

これで半円の周の頂点数は50、柱方向の分割数70のメッシュになります。 上の絵だと布の元と人体モデルは少し離れてますが、シミュレーション前にもうちょっと近づけました。

布の性質を設定していきます。 右パネルでオブジェクトモディファイアーを選択。

「追加」メニューを押して次の3つを追加。

  • シミュレート : クロス ... 後で別パネルで設定。
  • 生成 : 厚み付け ... デフォルト値を使用。
  • 生成 : 再分割曲面 ... 放置。DAZ Studioに戻したときに効いているかは未確認。

右パネルで物理演算を選択。

各セクションで値を設定します。 クロスセクションではプリセットCottonを指定。 参考動画では品質も指定してますが、このネタでは触りませんでした。

クロスコリジョンのセクションでは冒頭のチェックボックスにチェックが入っていることを確認します。 セルフコリジョンもチェック ... したんですがこのネタではシミュレーション品質が低いせいか思いっきり布同士が突き破りあってました。 DAZ Studioで作ったオブジェクトをimportすると小さくなってしまうせいか、セルフコリジョンの品質や距離を設定しても突き破ってしまいました。 まぁネタに影響ないので放置。

参考動画の説明にはないですが、距離と摩擦も増やしています。 距離は衝突対象との判定が始まる距離です。 やはりオブジェクトの小ささのせいか、デフォルト値でシミュレートすると布と人体モデルの隙間が大きくなってしまいました。 形状データの方を拡大してもいいんですが、今回は距離の方を適当に小さな値に書き換え。

摩擦は最大値の80で試しました。 デフォルト値でシミュレートしたら布がツルッと落ちたためそうしました。

コリジョンセクションを追加してそちらも設定します。

参考動画ではコリジョンセクションの中身は変更していませんでしたが、このネタでは衝突の外側/内側の距離を調整します。 理由はクロスコリジョンセクションでの距離と同じです。

「ソフトボディとクロス」と書かれてますが、ソフトボディじゃなくても影響するようです。 これで布のパラメータは設定終了。

衝突対象の人体モデルの方の設定です。 人体モデルのオブジェクトを選択してから、右パネルの物理演算を選択。 布と同様にコリジョンセクションの追加と距離の調整をします。 そして、布の摩擦だけでは足りないようなので人体モデルの方にも摩擦を設定します。

布以外のオブジェクトに摩擦を設定するにはソフトボディや剛体にする必要があるようです。 今回は剛体を試しました。 右パネルの物理演算で剛体ボタンをクリックしてセクションを追加します。

剛体セクションの「アクティブ」を「パッシブ」に変更します。 アクティブのままだと自由落下してしまうためです。 剛体コリジョンのシェイプをメッシュに、表面の設定 : 摩擦は10000にしました。 摩擦の値は大きすぎかとは思いましたが、不具合がなかったのでこんな感じに。

これで布と人体モデル両方の設定が完了です。

ウィンドウ下部のパネルでシミュレーションを実行しましょう。

このパネルは普通のアニメーションに使うものですが、シミュレーション機能とも連携しています。 シミュレーションで使う場合、まずは区間の設定を行います。 そしてフレーム選択で0または1にカーソルを合わせます。 カーソルを合わせるには、

  • カーソルは緑の縦棒。それをドラッグ。
  • 上の画像のフレーム選択で指したテキストボックスに数値を直接入れる。数値の左右にある三角をクリックすれば1フレームずつ前後に動かすことが可能。
  • オーディオ機器の操作ボタンのようなやつでを押す。(フレーム1にカーソルが移動。)

カーソルを0または1にしたら再生ボタンを押せばシミュレーションが始まります。 シミュレーションが実行されるのは初回時、またはパラメータが変更されたあとです。 それ以外のときは、前回のシミュレーションの結果が再生されます。

パラメータを変更したのにシミュレーションが始まらない場合はオブジェクトモードで布を選択し、右パネルの物理演算 : クロスのキャッシュセクションでシミュレーションのキャッシュを削除する必要があります。 マイナスボタンをクリックすればキャッシュが消えます。

シミュレーションは最後までやってもいいですし、途中でいい形状ができたなら停止ボタンで止めてもかまいません。 停止ボタンは再生中、再生ボタンのあったところに表示されます。

シミュレーションが終わったらカーソルを動かして、いい形状になっているフレームを探しましょう。 そのフレームの布の形状データをobjファイルでexportし、DAZ Studioで使えるようにします。

ただ布を選択してexportするだけではシミュレーション前の形状が出力されてしまいます。 exportするには目当ての形状を布に適用しなければなりません。 そのためには、対象のフレームを表示している状態で右パネルのオブジェクトモディファイアーを選択。 クロスセクションの適用ボタンを押します。

これでシミュレーションの結果が破棄されて全フレームの布の形状が適用したフレームと同じになりました。 オブジェクトモードで布を選択し、ファイルメニューから布データをexportしましょう。 左のパネルで「選択物のみ」をチェックするのを忘れずに。

あとはDAZ Studioでimportして適当にやるだけです。 ちなみに、レンダリングを少し軽くするため、浮いてる人のフィギュアは使わずに布だけ使ってレンダリングしました。 それで完成したのがこの投稿の最初に載せた画像です。

思えばクロースシミュレーションってけっこう高度な機能なんですよね。 少し前までは高価な業務用ソフトでしか実現できませんでした。 それをフリーソフトでこんなくだらない絵を作るために使えるなんて、いい時代になりましたね。

--------------------------------------