前回のshrinkWrapを使用してもう1ネタ
https://qiita.com/9boz/items/a18da4f498c7345542bf
これを転がしてみようかと思います。
ざっくり設計
箱を回転させた際に、地面にめり込まないように勝手に上下に動いて欲しい
ので
転がしたい箱 と同じ形状(又はそれをリダクションしたもの)を用意し
それをその場で回転させて最下部の位置を取得
取得した最下部の位置を回転jointの位置へ適用
うん 文字だと伝わりづらいですね
まずは準備
箱の中心に回転用のjoint(rot_jnt)を設置し、
その親にrot_jntと同じ位置のjoint(rotSpace_jnt)を設置する
箱の接地ポイント取得用に
組んでいく
- rot_jnt から rotDummy_jnt へ rotateをコネクト
- botPoint を botSampler_geo でpointOnPolyConstrain
※この際botPointがbotSampler_geoの最下部か最上部になるように UV値を調整
-
cubeDummy_geo で botSampler_geo をshrinkWrap
※オプション参考はこんな感じ reverse をonにしないと天井に張り付くので注意
-
botPoint のtranslateY を -1.0を掛けて rot_jntのtranslateYへ接続
※今回は rot_jntがワールド向きなので translateYですが、rot_jntの向きにあわせて接続する軸を調整
最後に
- cube_geo を rot_jntでバインド
- cubeDummy_geo を rotDummy_jntでバインド
挙動確認
こんな調子ですね
※root_jntを移動させてます
- rot_jntを回転させる
- rotDummy_jntが回転する
- cubeDummy_geoが回転する
- botSampler_geoがcubeDummy_geoの最下部にひっつく
- botPointがbotSampler_geoに追従してcubeDummy_geoの最下部に移動する
- botPointが移動した分、rot_jntが上方向に移動する
設計ミス
0 45 90 とかは問題ないですが、中途半端な角度の時にうーん・・・・
基本的に箱の辺以外では接地してほしくないなぁ
※面は辺4つで接地のイメージ
改修
-
cubeDummy_geo をなるべくほっそーくしてしまう。
理想はエッジのみですが、エッジのみにしてしまうとshrinkできなくなってしまうのでほっそーく。
箱がベベルされてたりしたらその面残しとかでいけますね
-
shrinkWrap調整
botSampler_geoのshrinkWrapはそのままだと初期位置ではshrinkされないので
shrink先が見つからないときはとりあえず最近接点へオプションにチェック
botPointが真下ではなく、奥のエッジに行ってしまいますが
結局上下方向しか取らないので問題ないです。
再確認
cubeDummy_geoの幅の分だけ若干沈みますが、割と理想的な動きになりました。
もっとスマートな方法は沢山あると思いますけどね!