【Unity】Physic MaterialのFrictionを1より大きくしたらどうなるのか検証してみた
Physic MaterialのFrictionについて検証してみた
今回は、Physic MaterialのFrictionについて検証してみました。
公式の Dynamic Friction の説明には、
移動している物体に対する摩擦。通常は、0 から 1 の間の値を使用します。0 の場合、氷のような感じになります。1 の場合、多くの力や重力がオブジェクトを押さない限り、素早く停止します。
とあります。「通常は」0~1の値ということは、非常時には1以上にしてもいいのかね?
もし1以上にしたらどうなるのかね?爆発でもするのかね?
Unityのリファレンスってこういう曖昧な表現が多くて本当に困ります。
というわけで検証してみました。
※使用しているUnityのバージョンは5.5.2f1です。
[Unity_317×90]
検証
とても単純です。x = 0の位置にあるCubeを右に押すだけです。
摩擦の値を変えていろいろ検証してみたいと思います。
床は別のCubeを横に伸ばしただけです。特になにもいじりません。
床のColliderもありのままなので、摩擦などはデフォルト値が使用されるでしょう。
値の変更はすべて床に乗っかってるCubeにて行うこととします。
Friction ConbineはMaximunで固定して、物理マテリアルの設定が優先適用されるようにします。
質量は1で固定。
重力あり。(摩擦の確認なので当然)
回転が起きると計測しづらいのでRotationはフリーズ。
(※ 結果の再現性には問題なし)
Cubeを押すためのスクリプトはこんな感じです。
using UnityEngine; public class PhysicMaterialTest : MonoBehaviour { float power = 20.0f; void Update () { if (Input.GetKeyDown(KeyCode.Space)) { GetComponent<Rigidbody>().AddForce(Vector3.right * power, ForceMode.Impulse); } } }
RigidbodyのAddForceを使ってpowerで設定した力で右方向にプッシュ!
ForceModeインパルスで瞬間的に質量を考慮した力を加えます。
powerは20で固定して行いました。
こんな感じで準備完了。
検証1(Physic Material なし)
まずは物理マテリアルを適用しない状態でpushしてみましょう。
実は物理マテリアルを適用しなくても、コライダーには摩擦力が有ります。
結果
Cubeは x = 16.78964 の位置で止まりました。
摩擦が無ければ止まらないはずなので、確かに摩擦はあるようです。
検証2(Dynamic Friction = 0.6, Static Friction = 0.6)
これも一応検証しておきましょう。Physic Materialを作成したときのデフォルト値です。
結果
Cubeは x = 16.78964 の位置で止まりました。これは検証1と同じ結果です。
この結果から、物理マテリアルを適用していないコライダーのDynamic Friction と Static Friction は、それぞれ0.6であるということがわかりました。
検証3(Dynamic Friction = 1.0, Static Friction = 0.6)
Dynamic Friction を1にしてみます。これは公式が言うところの最大値です。
結果
Cubeは x = 9.993832 の位置で止まりました。
動いている状態時にかかる摩擦力が増えたので、より手前で停止するようになりました。
検証4(Dynamic Friction = 2.0, Static Friction = 0.6)
それでは、Dynamic Friction を2にしてみましょう。1より大きい値です。
結果
Cubeは x = 4.898798 の位置で止まりました。
Dynamic Friction を1より大きい値にすると、より強い摩擦となるようです。
1が上限でそれ以降は影響ないですよーなんて結果にはなりませんでした。
そもそも上限がある項目って、入力じゃなくてスライダーになってますよね、Unityって。
だからうん、まぁ…予想通りか。
検証5(Dynamic Friction = 0.6, Static Friction = 1.0)
Static Frictionも検証してみましょう。
まずはDynamic を基準値の0.6、Staticは1.0にします。
結果
Cubeは x = 16.78962 の位置で止まりました。
検証1と比べるとビミョーーーーに手前で止まっています。その差「0.00002」
Static Frictionは停止してる状態のオブジェクトにかかる摩擦力なので、動き出してしまったらもう関係ないですからね。
一応動き出すまでに力を使った分手前に泊まったようですが、大きな力を瞬間的に力を加えている今回の検証とはそもそも相性が悪い気がします。
検証6(Dynamic Friction = 0.6, Static Friction = 2.0)
Static Friction も1を超えた値を設定してみましょう。
結果
Cubeは x = 16.78516 の位置で止まりました。
検証5よりもこれまたビミョーに手前で止まりました。
どうやら、止まっている物体を動き出しにくくしたければ素直に質量を上げた方がよさそうです。
検証7(Dynamic Friction = 0.6, Static Friction = 50.0)
一気に50でいっちゃいましょう。
結果
Cubeは x = 10.57739 の位置で止まりました。
このあとStatic Frictionを75、100と増やしていきましたが、どうやら押す力とバランスが取れ始めたあたりから顕著に動きづらくなりました。
100ではほとんど動きませんでした。
まとめ
Physic Material の Frictionは1より大きい値にした場合でも物理演算に反映される。
ただし、値のインフレが起こる可能性がある。特にStatic Friction。
以上のことから、Frictionの値は素直に0~1の範囲で設定し、摩擦のかかり具合はMassを変更することで調整したほうがよさそう。
ついでに一言
物理学だと移動する物体にかかる摩擦には動摩擦係数、静止している物体にかかる摩擦には静止摩擦係数をいう値を掛けて摩擦力を算出します。
物体の質量にこの係数を掛けた値が、移動方向と逆のベクトルに作用するといった具合です。
UnityのPhysic Material を最初に見たとき、Dynamic FrictionとStatic Frictionがこの係数に該当するのかなと思いましたが、どうやら微妙に違うようですね。(確かに明記はされていない)
本来の静止摩擦係数であれば、静止摩擦係数1の物体に小さな力を加えたところで、その物体は微動だにしないはずです。
加えた力が静止摩擦力を超えて、初めて動き出します。
しかし、Unity(というかPhysX)では、Static Frictionが大きいオブジェクトに、小さくても力を加えたら必ず動いてしまうようです。ほんのわずかですが。
こういうところは物理エンジンの限界なんでしょうかねー。十分すごいですが笑。
以上です。
▶
【Unity】3Dアクションゲームを作ろう!#7 ステージの作成(Skybox・落下判定)
▶
【Unity】3Dアクションゲームを作ろう!#8 ステージの作成(スイッチ・扉)
▶
【Unity】3Dアクションゲームを作ろう!#9 プレイヤーのHP管理
▶
【初心者Unity】JsonUtilityクラスでJSONを扱う方法
▶
【初心者Unity】スクリプトからコンポーネントを追加する方法
ゲーム制作関連のオススメ連載リンク
とっても手軽なゲーム制作体験!
Unityゲーム開発基礎
実際のリリースゲームを題材にしたハンズオンゲーム制作連載
実践unityゲーム開発