執筆バージョン: Unreal Engine 4.27
|
布等の揺れるモノの表現に使用されるClothとWorldに配置されたオブジェクトを干渉させる方法について紹介します。
基本的な設定は以下のページ等を参考に行うことができます。
https://docs.unrealengine.com/4.27/ja/InteractiveExperiences/Physics/Cloth/Overview/
エディタ上でメッシュが垂れ下がるような動作を確認できると思います。
そうしてできたものをSkeletalMeshActorとしてWorldに配置しPlayボタンを押せば同じように動作をしますが、これは地形等のオブジェクトとの衝突を検出せず貫通します(↓)。
![](https://historia.co.jp/wp/wp-content/uploads/2021/09/Cloth02-300x233.png)
(後に球体は動かすのでMobility=”Movable”, CollisionPresets=”BlockAll”に設定してあります。)
Clothに他のオブジェクトとの衝突を検出させるにはSkeletalMeshComponentの”CollideWithEnvironment”をチェックします。
![](https://historia.co.jp/wp/wp-content/uploads/2021/09/Cloth01-300x105.png)
これによりWorldに配置したオブジェクトに沿うような動きをするようになる・・・かと思いきや、やはり貫通します。
少しでもSkeletalMeshActorを動かすことで衝突判定がアクティブになり、オブジェクトを避けるようになります。
![](https://historia.co.jp/wp/wp-content/uploads/2021/09/Cloth_M01.gif)
しかし、球体の移動には反応しません(↓)。
(もう一度布を動かすことで新しい位置を反映した動作をします)
![](https://historia.co.jp/wp/wp-content/uploads/2021/09/Cloth_M02.gif)
どうやらSkeletalMeshが静止している(ただしClothSimulationによる動作を含まない)状態ではClothの衝突対象の情報は更新されないようです。
アニメーション等によって常に動作している場合は気にする必要がありませんが、
旗や暖簾のようなものの場合に困ります。
最も簡単にこれを何とかする方法は「見えない程度に動かし続ける」ことです(ちょっと気持ち悪いですが)。
![](https://historia.co.jp/wp/wp-content/uploads/2021/09/Cloth04.png)
(”PlanerReflectionPlane”とかいう名前になっていますがこれが布です)
↓
![](https://historia.co.jp/wp/wp-content/uploads/2021/09/Cloth_M03.gif)
C++コードを使用するなら毎フレーム実行される位置で
|
SkeletalMeshComponent->UpdateClothTransform(ETeleportType::None); |
等とすることで余計な見えない動きを伴わずに同様の効果を得られます。
(おしまい)