中川さんのPosition-Based-Dynamics-Comboのスライドを読む(その2)
引き続き中川さんのスライドを見ていく、といっても素人の自分には後半は理解は難しいだろうが。
今回はStrain Based Dynamicsのあたりを読む。
Strain Based Dynamics
拘束条件として、四点の歪みテンソルの拘束などや、異方性などの話がある。
図では布っぽい物の絵が描いてあるので、その辺をイメージしておくと良いのだろうか。
式の(9)と(10)は具体的に書いていないので想像する必要がある。
その次は体積保存や面積保存などの拘束条件が載っている。 det(F)と書いてあるが、体積の保存といえばdivとかfluxとかじゃないのか?とかちょっと考えてしまう。
この辺は具体的にコードを書けるように理解する、というよりは、こんなのもありますよ、という具体例とそのキーワード位を知っておく、くらいを期待していると思われるので、あまり深く考えずに読み進める。
次のスライド30のマテリアル座標系の話はさっぱりわからない。 u, v平面とあるから、テクスチャ座標系の話をしているのだと思うが。
頂点の集まりとして物体を構成する時に、テクスチャも歪みに応じて伸ばしたりしたい、
という事は理解出来る。
「テクスチャ座標は伸びが考慮されていない」という言葉の意味は良く分からない。
頂点自身がずれれば三角形自体のサイズは変わるのではなかろうか?考慮されてないとはどういう事だろう? 補完のされ方とかシェーダーのあたりでも歪みを考慮して変える、という事かしら?
そしてメッシュが不均一でも問題無くなる、というあたりに関しては、3Dプログラミングレベルが低すぎて良く分からない。 これはこちらのリテラシーの低さかね。
実装
せっかくなので実装も軽く眺める。main.cppだけ見とけばいいのかな。
クラス名などの小文字のsのプレフィクスはなんなのだろう?ネームスペースのあるC++では珍しい気もするが。
sApplicationを見ると、d_constraints, t_constraings, b_constraintsの3つのvectorがある。 これは本文でも解説のあった棒の制約、三角形制約(スライド28)、折り曲げ制約の3つのようだな。
こうやってそれぞれの制約を登録しておいて、アプリから移動を指示した制約解消を依頼して自動で制約が解消されて真の位置が確定する、という作りなのだろうな。
まずはざっとinitを見る。20x20の点を初期化して、三角形上のローカル座標を初期化している。
次に折り曲げの制約を追加している。式としてはスライド15の式をそのまま実装しているだけかな。 あんまり真面目には読んでいないが、若かりし頃、ヤング率とかでこんなテンソルの式は計算した記憶があるので、そんな違和感は無い。
dihedralというのはなんだか知らんからググったら上反角とか言われて、これ辞書引いてもわからん奴や、とか思った。
個々の拘束条件は難しい事は無いが、これを組み合わせて布っぽくするのは多少のアートも必要そうだなぁ。
display()は見慣れたOpenGLの関数が並ぶ。 if(1)とかはうげぇ、とか思うが、NEW GAMEの二期を見ていない以上C++について語る資格は無かろう。
なんにせよ、ただ頂点から描画しているだけなのでここは飛ばす。
update_traiangle_constraint()とかupdate_bending_constraint()とかが拘束条件を元に位置を調整している所だろう。 計算自体は難しくなさそうだが、もうC++でこういうコードは追えないなぁ、自分は。 という事でゆとりらしく軽く読み流す。
idle()を見るとこれが各フレームに行う処理っぽいな。 integrate()とintegrate_explicit()ってなんだろう?
軽く見るとFから速度を更新し、速度から位置を更新している。ニュートン方程式を1フレーム分積分している、という意味か。
関係無いが、idleだけ引数が(void)で他は単なる()なのは、NEW GAMEの二期を見てない俺には(ry
ぱっと見た感じ、update_bending_constraint()とか、拘束条件の数しかループ回してないから、収束するか何回か回す、って処理が無い気がする。 まぁ一回でもそこそこ動いているならそれでいいのかもしれん。
やっぱり動いているデモがみたいなぁ。自分で動かせばいいのかもしれないが、ゆとりなのでyoutubeとかに上がってないと見れない。
コード的には割と簡単で、各点とその拘束条件をぺたぺた貼っていって、あとはニュートン方程式で普通に動かしたあとに拘束条件を見たすように各点を調整する、という事が素直に書いてあるだけで、ちゃんと動くらしい。
これなら突き抜けたりもしないし、シンプルにいろいろな形状や剛性の物体を安定的に表現出来るような気もする。
当然拘束条件の解消の所ではいわゆる変分原理みたいな物を想定していないので、たまにちょっとだけワープするというか少し早く動く点とかもあるはずだが、各フレームの移動程度の範囲なら各拘束条件による調整量はそんなに多くないので、厳密な変分解とも人間の目には区別はつかなかろう。