maya で接地をとりたい２

前回のshrinkWrapを使用してもう1ネタ
https://qiita.com/9boz/items/a18da4f498c7345542bf

これを転がしてみようかと思います。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1484234/4a908772-c1b8-7f20-a67a-888ef30248c1.png)

ざっくり設計
-

箱を回転させた際に、地面にめり込まないように勝手に上下に動いて欲しい

ので

転がしたい箱　と同じ形状（又はそれをリダクションしたもの）を用意し
それをその場で回転させて最下部の位置を取得

取得した最下部の位置を回転jointの位置へ適用

うん　文字だと伝わりづらいですね

まずは準備
-

箱の中心に回転用のjoint(rot_jnt)を設置し、
その親にrot_jntと同じ位置のjoint(rotSpace_jnt)を設置する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1484234/fba8ee49-c40c-8187-e6e3-5beeee103ea8.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1484234/cc2223c9-81e2-bee1-51af-e47e93b98476.png)


箱の接地ポイント取得用に

- cube_geoと同じサイズのメッシュ(cubeDummy_geo)を用意
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1484234/77a9649a-6ebc-4270-434f-f2566d19ce78.png)

- rot_jnt を複製したrotDummy_jntを用意
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1484234/a6ffc95d-c6f8-f968-f53b-ed59f761ada5.png)

- shrinkWrapを適用するためのmesh(botSampler_geo) を用意
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1484234/4a6ea6db-95a5-3c57-04f5-8456658746cb.png)

- 接地位置を取るためのlocatorを用意(botPointParent, botPoint)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1484234/5a55e2b1-2479-affd-a04f-82997362a77b.png)



組んでいく
-

- rot_jnt から rotDummy_jnt へ rotateをコネクト

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1484234/1c378ba7-a0a3-aa5d-cae2-0194ef36dd90.png)

- botPoint を botSampler_geo でpointOnPolyConstrain
※この際botPointがbotSampler_geoの最下部か最上部になるように UV値を調整

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1484234/0c41c4c1-1475-ba90-4dcb-fa4e45371687.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1484234/67753441-534d-3b46-dbb9-f7fb3bc04859.png)

- cubeDummy_geo で　botSampler_geo　をshrinkWrap
※オプション参考はこんな感じ　reverse をonにしないと天井に張り付くので注意
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1484234/c5152d92-115e-b582-2c85-4e533db8b48a.png)

- botPoint のtranslateY を　-1.0を掛けて　rot_jntのtranslateYへ接続
※今回は rot_jntがワールド向きなので translateYですが、rot_jntの向きにあわせて接続する軸を調整
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1484234/f10dc36c-e0a9-7047-bcfa-56fb17edd625.png)

最後に
- 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が上方向に移動する

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1484234/78efdaad-4cfb-3f6a-0c27-2d613ac5e5e3.png)

設計ミス
-
0 45 90 とかは問題ないですが、中途半端な角度の時にうーん・・・・

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1484234/e279cc59-f00f-16cb-0a08-58fd4617c442.png)

基本的に箱の辺以外では接地してほしくないなぁ
※面は辺4つで接地のイメージ

改修
-

- cubeDummy_geo をなるべくほっそーくしてしまう。
理想はエッジのみですが、エッジのみにしてしまうとshrinkできなくなってしまうのでほっそーく。
箱がベベルされてたりしたらその面残しとかでいけますね
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1484234/82f0080d-8a9f-dc6d-0d7f-7faeb99b82a4.png)

- shrinkWrap調整
botSampler_geoのshrinkWrapはそのままだと初期位置ではshrinkされないので
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1484234/6db53f5b-637f-5c12-ae0a-8aa6abc5bb3c.png)

shrink先が見つからないときはとりあえず最近接点へオプションにチェック
botPointが真下ではなく、奥のエッジに行ってしまいますが
結局上下方向しか取らないので問題ないです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1484234/b7023438-c6f0-e64f-9d38-35fefcf694f8.png)

再確認
-
cubeDummy_geoの幅の分だけ若干沈みますが、割と理想的な動きになりました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1484234/e883a1ad-4ecc-9f31-6f60-daf242fa582b.png)

あー・・・・・
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1484234/f552f09a-e0ec-c7d3-151b-938bc4d8af41.png)

もはやヤケクソ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1484234/00881c50-cb7a-f009-73e9-506a81d54b0d.png)

よし！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1484234/222e31fe-678f-98ad-a60f-d9c6e254acd8.png)


もっとスマートな方法は沢山あると思いますけどね！

https://vimeo.com/897597338?share=copy