JavaFXのMeshViewに衝突判定を付加
布(クロス)シミュレーションの際に、物や人の体に触れたら布がその物体に沿って変形するよう、衝突判定を考えました。
他に良い方法があるかもしれませんが、とりあえず下のような結果を得ることができました。
このページでは衝突の判定方法と、移動方法について書いています。
TriangleMesh同士の衝突を考える
布側、物体側、ともにMeshViewを構成する単位の三角形、TriangleMesh同士の衝突として考えることにしました。上の動画では物体側
も細かな三角形で構成されていますが、平らなテーブルなど、大きな三角形との衝突を考えると、この方法ではうまくできないと思います。
衝突判定
1、中心点同士の距離を測り、設定値以内である
2、物体側3角形と布側中心点の距離を測り、設定値以内である
の条件が揃えば衝突したと判定するようにしました。
1の条件としては、サンプルでは距離10以内にしています。布の格子がが10で切ってあるためですが、正確ではないし、物体側の三角形が大きいとこの方法は使えません。
正確に判定するには、物体側の三角形を負の方向に押し出した立体を作り、この中に布側三角形の中心点が含まれているかどうかを見るのが良いと思います。
三角形平面と点の距離は、中心点間のベクトルと物体側法線ベクトルの内積で求めることができます。
計算で得られる距離は絶対値なので、正負の判定は、中心点間のベクトルと物体側法線ベクトルの角度を測り、90度以上であれば負と判定します。
衝突判定は距離0~-10以内としました。負の距離は三角形の面の裏側、すなわちめり込んでいることを示します。
布の移動
衝突と判定したら、布側三角形を、物体側3角形と布側中心点の距離だけ移動します。
判定時に距離は測っているので、これを流用すればOk。
すべてのTriangleMeshの組み合わせで実施しますが、ダブって判定してしまうと移動しすぎになるので、1度移動した布側三角形は次回の計算からは外します。
最終更新日: 2017-08-10 16:12:52