テレワークならECナビ Yahoo 楽天 LINEがデータ消費ゼロで月額500円〜!
無料ホームページ 無料のクレジットカード 海外格安航空券 海外旅行保険が無料! 海外ホテル


log

2012.12.10 LW:メルトモーション


今回はLWでスライムが溶けるメルトモーションを作ってみました。
これを作るきっかけとなったのはTrueMeltというプラグインを最近発見して、
「これだったら自前で実装できるな」と思ったためでした。

さてさて、具体的にどういう実装かというと
・頂点座標のY軸座標値が0以下の場合は0より下にめり込んだ範囲を取得。
・めり込んだ範囲だけ上にもどし、さらにY軸成分を0に除去して正規化したXZ平面だけ
 を考慮した法線を取得し、その法線方向にめりこんだ範囲だけ移動させる。

これだけです笑。今回はLightwaveのディスプレイスメントノードで設計しましたが、HLSLでも
すぐに実装できそうな手軽さです。ただ問題があって、潰した部分はポリゴンが密集するので
Zファイティングが起きてしまっています(目や口の辺り)。ためしに他のキャラクタでも
試してみましたが結構悲惨なことに…。これスライムのようなシンプルな形状専用ですね;

他にもモーフやボーンで同じように表現することも出来そうですが、複数のモーフやボーンが
必要で管理が難しくなりそうだし。やはりシェーダで処理した方が無難だろうなあ。

追記:
今までは「ソフトボディってどんなアルゴリズムでやるんだろ」って考えたりすることが
あっても、結局思いつかなかったなんてことがありましたが;この手法を改良すれば出来
ますね。具体的には以下の方法です。
・コリジョンとの衝突深度と衝突面の法線を取得
・めり込んだ範囲だけ衝突面法線方向にもどし、衝突面方向成分を除去して正規化した
 頂点法線を取得し、その法線方向にめりこんだ範囲だけ移動させる(ただし衝突面法線
 と頂点法線の向きが逆向きに同じ場合は処理させない)。
・あとは粘性パラメータ等を決めて衝突面の法線方向にオブジェクトを反射させたり、
 衝突しなくても動きに応じて形が変化するように速度に応じて衝突深度をとってみたり。

こんなところでしょうか。ソフトボディのアルゴリズムを解説している国内サイトはほとんど
無いみたいなので、今回の記事は珍しく割と有用なことを書いたのかも笑。
ちなみにソフトボディはシェーダでやるにも頂点単位で衝突深度情報がいるので少し
難しいというか、クロスと同様にバッファの動的作成のリスクを考える必要がありますが。
やろうと思えばすぐに出来る手法ですね。…そういえば、ソフトボディって調べるとだいたい
みんな似たようなものを揺らしてるなあ笑。