布のシミュレーション-自由形状の物体との衝突-
春休みも残りわずかとなりました。実家でのびのびしております。maaaaakunです。
前回まで2回にわたって紹介してきた布のシミュレーションに関するお話ですが、今回が最終回です。
今からお話することを実装すると、布と自由形状の物体との衝突シミュレーションができます。
自由形状の物体というのは、任意の物体ということです。
つまり、どんな物体とも衝突シミュレーションが可能になります。
今回も記事の最後に実行したときの動画を用意していますので良ければご覧ください。
・布と自由形状の物体との衝突シミュレーション
前回は、布と球との衝突シミュレーションに関するお話でした。
衝突シミュレーションは、大きく分けると
①衝突判定・・・物体同士が衝突するかどうか判定する。
②衝突応答・・・衝突した物体同士の振る舞いを求める。
の2つに分けることができるのでしたね。ここで、①について考えてみます。
前回は布と球だったので、「布を構成する各頂点と、球の中心との距離」を用いて容易に衝突判定を行う事が出来ました。
ところが、今回は自由形状の物体との衝突シミュレーションです。例えば以下に示す物体と布との衝突シミュレーションを実現するには。。。?

一気に難易度が跳ね上がりましたね。
それでも大丈夫。前回の応用で実現することができます。
では、衝突判定と衝突応答をどのように実現するのか?
答えは、「物体を球の集合で近似する」です。
これにより、
「布と自由形状の物体との衝突判定」
は
「布を構成する各頂点と、物体を構成する各球との衝突判定」
という問題に置き換えることが出来ます。前回行った衝突判定を、物体を構成する球の数だけ繰り返せば良いので、非常に簡単です。(計算には球の集合を用い、表示には元データを用います。)
物体を球の集合で近似するためのプログラムは
http://isg.cs.tcd.ie/spheretree/
で入手できます。「Sphere-Tree」を構築するアルゴリズムを実装したものです。
Sphere-Treeについて軽く説明します。
Sphere-Treeとは、各ノードが球の中心座標と半径を持つツリー構造のことです。木の深さが増すにつれて、近似の精度も良くなりますが、球の数も増えるため、衝突判定の際に計算量が増大してしまいます。

↑こんな感じで、深さが増すごとに近似精度が良くなり、球の数が増大していきます。
ちなみに、このプログラムは、OBJ形式のデータを入力すると、SPH形式という独自拡張子のデータ(Sphre-Tree)を出力します。コンパイルしなくても、exeファイルも入っていたと思います。
ここまでのお話を実装したプログラムの実行例が↓でご覧になれます。
いかがでしたでしょうか。
同じ分野を勉強している方の参考になったり、この記事を読んで興味を持って頂いた方がいらっしゃれば幸いです。
4月からの卒業研究は、「布」と「CG」(と、できれば「人」)をキーワードに進めていく予定なので、また何か記事になるような事があれば書きたいと考えています。
最後まで読んでいただいてありがとうございました。
