株式会社デジタル・フロンティア-Digital Frontier

Header

Main

破壊ツール(badCrack)

2011/1/24

Tag: ,,,

こんにちは。開発室のひらく[@horonig]です。

今回はDFのポリゴン破壊ツール【badCrack】を紹介します。

破壊、破戒、猪八戒…。ハカイというのは、なんとも淫靡(いんび)な響きですが、人はなぜこうも破壊を繰り返すのでしょうか。
それはそこに物体が・・・否(いな)、polygonがあるからですね!

これは3年ほど前(2007年夏)のお話です。
もともとDFでは『BlastCode』などの破壊ツールを使っていましたが、『BlastCode』はNurbsにしか適用できず、且つDFにはライセンスが一つしかなかったため、多人数で作業出来ませんでした。なので汎用的な破壊ツールの要望が現場からあがり、僕が開発を担当することになりました。「最低限こういう機能が欲しい」というアイディアはスーパーシニアのT氏から頂いていたのですが、出来れば『BlastCode』のような機能や、更なるアドバンス機能も欲しいという事で、ひとまず調査を開始しました。

まず最初に破壊系の論文などを読み漁ってみたのですが、僕の能力ではそれをコードに落とし込むのは簡単ではなく(と言うより理解できない部分があまりにも多く…orz)、本格的なものを作れる目処が全く立ちませんでした。さらに時間もあまり無かったので、フリー(ここ重要)ツールで似たようなものがないかをググッてみたりもして。でも、どれもパッとしないんですよねー。他人が作ったフリーツールに頼ろうと思ったヤツが偉そうなこと言って申し訳ないのですが(^ω^)

で、基本的にはどのフリーツールもmaya既存の『solidShatter』(おそらく1.0から搭載されてるもの)よりちょこっとだけ良いかも?という程度のものでした。要は、mayaのブーリアン機能を使って、割って割って更に割ってーというツールですね。でもそれだったらイチから作った方が早いし、もうちょい高機能なものを作れるなと思ったので、ブーリアンを基本としたツール開発という事に決めちゃいました。つまり、mayaの『solidShatter』よりも多少高機能なものを作って、なんとかお茶を濁そう切り抜けよう!という事ですね!!

それと、亀裂の入り方などのイメージ資料も必要だったので「crack」や「shatter」をキーワードにgoogleイメージ検索とかもしてたんですが、これちょっとヤバかったです。googleの「セーフサーチ」をオフってるというのもあるかもしれませんが、クスリやボッキボキに折れた骨など、正視に堪えない絵がけっこう出てきちゃったりして(興味のある方は自己責任でググってみてネ)。「なんじゃこりゃーw」とdkdkしながらも、地道に資料を集めていきました。しかしホントにgoogle大先生さまさまですよね。これなかった昔の人は、資料集めるのも大変だったんだろうなぁ(遠い目)。

ところで、mayaの『solidShatter』は
C:/Program Files/Autodesk/Maya2010/scripts/others/solidShatter.mel
にソースがありますが、これを解読するもの面倒なので、フルスクラッチで作ります。
てか、この『solidShatter』自体が重すぎるので、参考にするのもどうかという話です。
と思いつつも、怖いもの見たさで中をのぞいてみたりはしましたけどね!
結果、それなりに参考にもしてますけどね!!

今回、僕が使おうと考えていたブーリアンは、「閉じたオブジェクト」を「閉じてないplane」でぶった切る形のブーリアンです。
試してみると分かりますが、意外と簡単にスパッと切れます。

無駄にレイヤースタイルを使ってお送りしております

 
反対側の破片は、planeの法線を逆転(reverse)させてからブーリアンすれば作れます。
なんとなくですが、閉じたオブジェクト(立体)同士よりもこっちの方が軽いんじゃないかと思ったので、この方法で実装しています。
(コードを見ると分かりますが、『solidShatter』は閉じたオブジェクト同士でやってるみたいです)

というわけで、基本的なアルゴリズムはこうです。

  1. ぶった切る破片(オブジェクト)を選択
  2. 新規にplaneを作成して、ガクガクにランダマイズ
    (softbody化したparticleに対し、noiseを含んだdynExpressionを仕込む事で実現)
  3. 亀裂を入れたい方向と場所にplaneを配置
  4. planeとobjectをduplicateしておく([6]で使用)
  5. オブジェクトをplaneでぶった斬る!(ブーリアン)
  6. 片側だけの破片になっちゃうので、[4]でduplicateしておいたplane(法線reverse)とobjectを使って逆側の破片を作る
  7. [1]に戻る(破片数が満たされるまでループ)

簡単ですねー。考えただけでwkwkしますね。
まー、細かい部分ではもっと言及したいことが色々とあるんですが(特に[1]と[3]あたり)、全てを書くのも大変なのでこんなもんで。

既に出来上がったツールがあるので、一度映像でご覧下さい。

コントローラの赤い円弧は「亀裂の入る角度範囲」をあらわしています。つまり、≪亀裂の指向性(日本語間違ってるかも?)≫を持たせたツールになってるわけです。これは最初から要望されていた機能で、それを軸としたツール仕様となっています。

ただ、この≪亀裂の指向性≫というのが結構やっかいでして…。見てお分かりのとおり、方向を二次元的に指定することになるため、薄っぺらい破片が量産される副作用があります。なのでそれを解消する手段として【normalizeCrack】という機能を提供しています。これは、”薄っぺらい破片や細長い破片を極力球体に近づけるようなアルゴリズム”で分割する機能です。説明するのもなかなか難しいので、ムービーからそのイメージを感じ取って下さい!

更に、mayaユーザーには周知の事実ですが、mayaのブーリアンは不安定極まりないです。おそらくver1.0の頃から全く改善されてないですよね。なので、上のムービーのように簡単なオブジェクトであればほぼ問題は出ませんが、実際に破壊する複雑なオブジェクトだと、エラーを吐いて止まることも良くあります。その辺も、ある程度のエラーは無視してブーリアンが掛けれるものだけ分割する、という仕組みにはしていますが、これ以上分割出来ないオブジェクトに落ち込んでしまうことはちょくちょくあるみたいです。でも5割くらいの破壊には使えてるみたいなので、思ったよりは優秀でしたw

もはやAutodeskさんもmayaのブーリアンを修正するつもりはないようなので、ちょっと前に流行した【voronoiShatter】も付けてみました。

ボロノイダイアグラムを使った単純なshatterですが、これだとブーリアンを使った場合よりも圧倒的に安定性があります。ただ、ボロノイだけだと断面がスパッと平面的になっちゃったりするので、そこは改良したいですね。それと、現状のアルゴリズムだと結構処理が重いので、そこも改善したいところ。。なのですが、なかなかがっつり開発する時間が取れず、未だβ版という状態で放置しております…。
現場の皆、すまん (;´Д`)

という訳で、誰かおいらに時間を( ゚д゚)クレ

Pocket

コメント

コメントはありません

コメントフォーム

コメントは承認制ですので、即時に反映されません。ご了承ください。

*