Unity3Dとの楽苦な日々
Unity3Dで作成した小品を通じて、楽だった点と苦に感じた点を報告していきます。

スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

バネ質点系でモデル変形

rubber lantaern
https://dl.dropboxusercontent.com/u/108473486/rubberLantern/rubberLantern.html

モデルの頂点に、バネ質点系としての特性を与えると、プルプルと変形させることができます。
Unity3D の サンプルの
SIMULATING RUBBER IN UNITY http://rodrigopegorari.net/blog/?p=58
には、おもちゃのアヒルを変形するサンプルコードがあります。
このサンプルでは、頂点カラーを1フレームでの変形量を調節するパラメータに使って、黒なら全く動かず、白に近づくほど変形するようにしています。

今回紹介するものでは、モデルの端を固定して、反対の端にいくほど変形するようにしてみました。
固定される端は、左端、右端、下端、上端、前面、背面から選べます。

少し時期が過ぎてしまいましたが、モデルのハロウィンかぼちゃは、Unity のアッセトストアからダウンロードしたものです。
かぼちゃをドラッグすると、その方向にかぼちゃが伸びて、離すとプルプルと振るえながら元の形に戻ります。

元々のサンプルにバネ質点系の特性に Rubber Duck や Hard Rubber などの名称を付けたものがあったので、そのまま使用しています。
アヒルのおもちゃを変形させているので、デフォルトの特性が Rubber Duck という名称になっています。
カスタムにすると、質量や剛性などをキー入力することができます。

マウスによるドラッグは、すべての頂点に等しく引っ張る力として作用します。
頂点間には物理特性はなく、各頂点は勝手に動いていますが、各頂点の物理特性が全く同じなので、統一的に動くことになります。

このため、重力を有効にしても、左端を固定したときに右端にいくほど垂れ下がるということはなく、不自然なので、無効にしています。

また、変形の方向がすべての頂点で同じなので、2Dのように見えてしまいます。
面白いけど、ちょっと残念な気がします。

Unity3D としては、オブジェクトの MeshFilter の sharedMesh の vertices を変形したものに毎フレーム入れ替えています。
ただし、オブジェクトの座標は、TransformPoint()関数で一旦グローバル座標に変換した上で、力のベクトルによる作用による移動位置を計算し、InverseTransformPoint() でオブジェクトの座標に戻しています。

オブジェクトがない位置でマウスをドラッグすると、カメラを回転できます。
マウスホイールで前進・後退します。
ただし、MacOS のウェブブラウザ Safari だと、"Mouse ScrollWheel" が効きません。
Safari 固有の問題だそうです。
このため、Fキーで、前進, Bキーでも、後退するようにもしました。


[苦]
MacOS の Safari は、"Mouse ScrollWheel" が無効。
対処方法はなく、代替の方法を用意するしかなさそうです。


[注]
今回のサンプルでは、法線ベクトルは更新されない。
使用している方法では、頂点の移動しか計算していないので、陰影が付くシェーダを使うと不自然に見えます。
頂点を共有している面の面法線の平均を取るとか、頂点法線を作る方法はありますが、やっていないです...
スポンサーサイト

コメント

コメントの投稿













管理者にだけ表示を許可する

トラックバック

プロフィール

海栗亭楽苦

Author:海栗亭楽苦
FC2ブログへようこそ!

最新記事

最新コメント

最新トラックバック

月別アーカイブ

カテゴリ

検索フォーム

RSSリンクの表示

リンク

ブロとも申請フォーム

QRコード

QR

上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。