【Unity】物理特性マテリアルを用いた摩擦表現の方法


冒頭画像_摩擦

以前の記事で物理マテリアルの「弾性」についてご紹介しました。ご覧になっていない方はまず以下の記事をご覧いただけけると幸いです。

【Unity】物理特性マテリアル(弾性)を用いた跳ね返り表現の方法

今回は物理特性マテリアルのもう1つの特徴である「摩擦」についてご紹介していきます。

本記事では以下の流れで内容をご説明していきます。

  • 摩擦のプロパティ
  • 「Dynamic」と「Static」の違い
  • オブジェクトが動いている時の動き方
  • オブジェクトが停止している時の動き方
  • まとめ

*「物理特性マテリアル」に関する公式マニュアルはこちら

摩擦のプロパティ

物理特性マテリアルで摩擦を表現する際に調節する部分は「Dynamic Friction」「Static Friction」「Friction Combine」です。

各プロパティの機能は以下の通りです。

プロパティ 機能
Dynamic Friction 移動しているオブジェクトに発生する摩擦。0~1の間で調節。0の場合、摩擦はなくつるつる滑ります。1の場合は強い摩擦力が発生しオブジェクトはすぐに停止します。
Static Friction 静止しているオブジェクトに発生する摩擦。0~1の間で調節。0の場合、摩擦はなくつるつる滑ります。1の場合は強い力が作用しない限りオブジェクトは静止したまま。
Friction Combine 衝突するオブジェクト間の摩擦度合いの処理方法。種類は以下の通り(Bounce Combineと同様)。
-Average 2つの摩擦力を平均化して反映。
-Minimum 2つの摩擦力の小さい方を優先して反映。
-Maximum 2つの摩擦力の大きい方を優先して反映。
-Multiply 2つの摩擦力を乗算した値を反映。

上記のプロパティを調節することによって、様々な摩擦表現が実現可能になります。

「Dynamic Friction」と「Static Friction」の違い

物理特性マテリアルのプロパティには「Dynamic Friction」「Static Friction」といった2つの摩擦係数が存在します。前者が動いているオブジェクトが停止するまでに作用する摩擦力のことを言います。後者は停止しているオブジェクトに別の動いているオブジェクトが衝突した際に作用する摩擦力、もしくはその場にとどまろうとする力のことを言います。

画像のようにオブジェクトが動いている時と停止している時では作用する摩擦係数の種類が変わります。

「Friction Combine」の優先度も相まって、物理特性マテリアルの摩擦設定は少し細かい注意が必要になってきます。(Friction Combineの優先度に関しては冒頭でご紹介した記事をご参照ください。)

オブジェクトが動いている時の動き方

動いているオブジェクトに発生する摩擦を反映する際に調節するのが「Dynamic Friction」です。ここでは「Dynamic Friction」調節した際にオブジェクトはどのような動きをするのかご説明していきます。

下準備

オブジェクトが重力によって坂道を転がる環境をつくります。

まずHierarchyウィンドウにて[Create]->[3D Object]->[Cube]の手順で「Cube」を4つ、同様の手順で「Sphere」を3つ準備します。

ここでは「Cube」の名前をそれぞれ「StartArea」「Lane1」「Lane2」「Lane3」、「Sphere」の名前を「Sphere1」「Sphere2」「Sphere3」とします。

以下の図の様にそれぞれ配置します。

オブジェクト配置

上記の画像のTransformはそれぞれ以下の通りです。

「Lane1」Position( X:0, Y:0, Z:-3 )  Scale( X:20, Y:1, Z:3 )

「Lane2」Position( X:0, Y:0, Z:0 )   Scale( X:20, Y:1, Z:3 )

「Lane3」Position( X:0, Y:0, Z:3 )   Scale( X:20, Y:1, Z:3 )

「Sphere1」Position( X:-18, Y:9, Z:-3 )

「Sphere2」Position( X:-18, Y:9, Z:0 )

「Sphere3」Position( X:-18, Y:9, Z:3 )

「StartArea」Position( X:-16, Y:3.7, Z:0 ) Rotation( X:0, Y:0, Z:-30 )

Scale( X:15, Y:1, Z:9 )

* 坂道と平面の道がつながるように配置できればTransformはどのような値でも構いません。

最後に各SphereにRigidbodyコンポーネントをつけ重力で坂道を転がるようにします。

手順はSphereを選択した後、[Add Component]->[Physics]->[Rigidbody]の通りです。

Rigidbody_Sphere

また、今回はSphereがX軸方向に無駄なく運動していくようにZ軸方向の回転を制限します。Rigidbodyコンポーネント内の「Constraints」を開き「FreezeRotation」のZを選択してください。

Rigidbody_FreezeRotation

*Sphereの進行方向に合わせて選択してください。

ゲームを実行したときにSphereが落下し坂道をまっすぐ転がったら下準備完了です。

下準備_マテリアルなし

Dynamic Frictionの動作確認

物理特性マテリアルをオブジェクトにアタッチしていきます。

Projectウィンドウから[Create]->[Physic Material]の手順で物理特性マテリアルを5つ用意します。

それぞれ名前を「StartArea」「Sphere」「Lane1」「Lane2」「Lane3」に変更してください。

今回はLaneで発生する摩擦について確認していくため、「StartArea」と「Sphere」の「Dynamic Friction」の値を0にします。

StartArea_Dynamic Friction_設定

Sphere_Dynamic Friction_設定

「Sphere」の「Friction Combine」のみMaximumに設定しておいてください。

これは「Sphere」オブジェクトが「Lane」オブジェクトを転がる際に、プロパティで設定した摩擦の値をそのまま反映するためです。これは「Friction Combine」の優先度にのっとって設定をしています。

Laneの「Dynamic Friction」の値はそれぞれ「Lane1」が1、「Lane2」は0.5、「Lane3」はにします。

動的摩擦_テスト_全体像

これでマテリアルの設定は完了です。それぞれのオブジェクトにマテリアルをアタッチしてゲームを実行してみましょう。

DynamicFriction比較

上記の画像の通り、各Laneで摩擦力が違うためそれぞれ異なる動作をしていることが確認できます。

「Lane1」は摩擦力が1であるため、すぐにオブジェクトが停止します。

「Lane2」は摩擦力が0.5であるため、「Lane1」程急ではありませんがLane内で動作が停止していることが確認できます。

「Lane3」は摩擦力が0であるため動作が止まることはありません。つるつる滑るLaneの上を止まることなく進んでいきます。そのため最終的にはLane外に落下していきます。

各オブジェクトにはマテリアルをアタッチする前からデフォルトで一定の摩擦力がついています。それを考慮した上で、実現したい動きに合わせいろいろな組み合わせを試してみましょう。

オブジェクトが停止している時の動き方

次は停止しているオブジェクトに発生する摩擦についてです。プロパティの設定する箇所は「Static Friction」です。

下準備

Hierarchyウィンドウにて[Create]->[3D Object]->[Cube]の手順で「Cube」を2つ用意します。名前を「Cube1」「Cube2」とします。

それぞれのオブジェクトを以下のように配置します。

Satic_オブジェクト配置

Transformはそれぞれ以下の通りです。

「Cube1」Position( X:0, Y:1.5, Z:-4 )  Scale( X:1, Y:1, Z:1 )

「Cube2」Position( X:0, Y:0.5, Z:0 )  Scale( X:1, Y:1, Z:10 )

「Cube1」にはRigidbodyをコンポーネントしておきます。

ここから角度をつけていきます。

まずHierarchyウィンドウにて[Create]->[Create Empty]の手順で空のオブジェクトをつくります。名前を「CubeSet」とします。

空フォルダ_Position整理

*空のオブジェクトをつくった際はTransformの値を整えておくと便利です。

空のオブジェクトに「Cube1」「Cube2」をドラッグ&ドロップし親子関係をつくります。

空フォルダ_親子関係

これで2つのオブジェクトに一括で角度をつけられるようになりました。

「CubeSet」の角度を変えてみましょう。

CubeSet_角度

*任意の角度で構いません。

これで下準備は完了です。

Static Frictionの動作確認

下準備の段階でゲームを実行すると「Cube1」が滑落することはありません。

下準備_Staticテスト

これはデフォルトで設定されている一定の摩擦力が作用しているためです。

*デフォルトの設定値は物特性マテリアルを作成した際の初期値です。

物理特性マテリアル_初期値

まずは「Cube1」が滑り出すようにしていきます。

Projectウィンドウから[Create]->[Physic Material]の手順で物理特性マテリアルを作成します。名前は「Cube2」とします。

Static_設定_物理特性マテリアル

「Dynamic Friction」「Static Friction」をともに、「Friction Combine」をMinimumにすることで設定した値をそのまま反映されるようにします。

設定が完了したら「Cube2」オブジェクトにマテリアルをアタッチします。

ゲームを実行してみましょう。

Static_摩擦なし

摩擦が0であるため「Cube1」が滑り落ちていくことが確認できます。

この滑り落ちていくオブジェクトを、その場にとどまらせることを可能にするのがStatic Frictionです。

「Cube1」を「Static Friction」の力を用いて静止させます。

先ほどの手順でもう1つ物理特性マテリアルを用意し名前を「Cube1」とします。

「Cube1」の「Static Friction」を1、「Friction Combine」をMaximumに設定します。設定が完了したら「Cube1」オブジェクトにアタッチします。

ゲームを実行してみましょう。

Static_摩擦1

オブジェクトが滑落せずに静止していることが確認できます。

「Static Friction」を調節することで、角度がきつい場所でもオブジェクトをその場で静止させることが可能になります。

角度、摩擦の値を調節して限界を探してみると、また発見があるかもしれません。

まとめ

いかがでしたでしょうか。今回は物理特性マテリアルの摩擦についてご紹介してきました。

「Dynamic Friction」と「Static Friction」は別々の機能として用意されていますが、使用用途が多いのは前者かもしれません。「Static Friction」で表現したいことも、実は「Dynamic Friction」を調整することで補える場合が多くあります。困ったら「Dynamic Friction」を調整してみることをお勧めします。

もう1つの機能である跳ね返り表現については以下の記事をご覧ください。

参考記事)物理特性マテリアル(弾性)を用いた跳ね返り表現の方法

また、物理演算の停止方法や精度についてなど物理演算のあれこれを説明している記事もあるので、ご興味ある方はご一読ください。

参考記事)物理演算を徹底解説!物理演算の停止・精度変更・水や髪の物理演算まで


オブジェクト配置

この記事はいかがでしたか?よければシェアをお願いします。

Massuuuu