物理プロパティ ファイルはグローバル ファイルで(常に global.physics_properties と呼ばれる)、すべての物理的オブジェクトによって共有される設定を指定します。
global.physics_properties ファイル編集用のユーザ インタフェースはないため、通常のテキスト エディタを使用して編集します。このファイルは、次の 5 つのセクションから構成される SJSON ファイルです。
materials = {...} collision_types = {...} collision_filters = {...} shapes = {...} actors = {...}
Materials セクションでは、物理オブジェクトが構成されている物理マテリアルのプロパティを定義します。プロパティは、密度や摩擦などの項目を指します。
各マテリアルは名前によって識別され、多くのプロパティが指定されています。例:
materials = { brick = { density = 1922 dynamic_friction = 0.3 friction_combine_mode = "min" restitution = 0.5 restitution_combine_mode = "average" static_friction = 1 } clay = { density = 1089 dynamic_friction = 0.3 friction_combine_mode = "min" restitution = 0.5 restitution_combine_mode = "average" static_friction = 1 } copper = { density = 8920 dynamic_friction = 0.3 friction_combine_mode = "min" restitution = 0.5 restitution_combine_mode = "average" static_friction = 1 } }
マテリアルのプロパティは次のように定義されています。
density = 1000
SI 単位(kg / m^3)で表すオブジェクトの密度。(Stingray エンジンのすべてのプロパティは SI 単位で指定されています)。水の密度は 1000 です。浮動するオブジェクトは密度 < 1000 で、沈むオブジェクトは密度 > 1000 です。
dynamic_friction = 0.1
オブジェクトがサーフェスを滑っている場合に使用される摩擦係数(通常 0 〜 1 の範囲。1 より大きい値も設定可能)。
static_friction = 0.1
オブジェクトがサーフェス上で静止している場合に使用される摩擦係数。通常、静摩擦は動摩擦より高く、動き出したオブジェクトの移動を維持するよりも、オブジェクトの移動を開始させる方がより多くの力を要します。
friction_combine_mode = "average"
(オプション: 「average」、「min」、「multiply」、「max」)。
現実の世界では、2 つのオブジェクト間の摩擦は、両方のオブジェクトのマテリアルによって異なります。そのため、単一のマテリアルは実際には摩擦がありません。1 つのマテリアルと特定の摩擦を持つ別のマテリアルとの組み合わせです。(ベルクロ両面テープは他のベルクロに対しては高い摩擦があり、布地にはやや高い摩擦、その他のオブジェクトには低い摩擦があります)。
しかし、物理エンジンでは、あらゆる可能な組み合わせのマテリアルを処理することを避けるために、個別のマテリアルに摩擦係数を割り当てます。ここで、異なる係数(たとえば 0.1 と 0.3)を持つ 2 つのマテリアルが接触したときに、何が発生するのかという質問が起きます。これは、friction_combine_mode によって決定されます。
どの結合モードも、「正しい」または「間違っている」わけではありません。自分のプロジェクトでうまく機能するものを見つけるだけです。min は、「滑りやすい床」(床に低摩擦値を設定してその上をすべてのオブジェクトが滑る)を作成したり、「滑りやすいオブジェクト」(オブジェクトに低摩擦値を設定してそのオブジェクトがすべての上を滑る)を作成する場合などに適した選択となります。通常、これらには 2 つの最も興味深い摩擦効果があります。
2 つのオブジェクトに異なる friction_combine_modes がある場合はどうなるのでしょうか?この場合は、リストにある最新のモード、average、min、multiply、max が選択されます。そのため、min が average に接触すると、min が使用されます。
restitution = 0.2
Restitution(反発)は、オブジェクトの「弾力性」を指定します。具体的には、オブジェクトがバウンド後に現在の速度をどのくらい保持するかを指定します。v^2/2 = gh であるため、r の反発のあるオブジェクトが 1 m から落下すると、r^2 の高さにバウンドします。
値の範囲は 0 〜 1 である必要があります。
0.2 の値は、オブジェクトは速度の 20% を保持し、1 m から落下すると 4 cm バウンスすることを意味します。
restitution_combine_mode = "average"
(オプション: 「average」、「min」、「multiply」、「max」)。
摩擦と同様に、反発は実際にはバウンドに関わる両方のオブジェクトによって異なります。このパラメータは、オブジェクトに異なる反発がある場合に使用するべき反発の計算方法を指定します。
Collision types および collision filters は、互いに衝突するオブジェクトを決定します。
collision_types = [ "default" "character" "vehicle" "projectile" ] collision_filters = { default = {is = ["default"] collides_with_all_except = []} character = {is = ["character"]} character_trigger = {collides_with = ["character"]} }
collision_types は、異なるタイプの衝突の一意の名前を示す単なるリストです。
collision_filter は、どのように衝突するかを指定するために物理オブジェクトによって実際に使用されるものです。collision filter は 2 つのリストで構成されています。1 つのリストはオブジェクトが何であるかを示し、もう 1 つのリストはオブジェクトが何と衝突するかを示します。1 つのオブジェクトは、複数のものである場合があります。たとえば、1 つのオブジェクトが車両と投射の両方である場合があります。
次に示すプロパティを、collision filters に設定することができます。
is = []
このオブジェクトが何であるかを指定する衝突タイプのリストです。
collides_with = []
このオブジェクトが何と衝突するかを指定する衝突タイプのリストです。
collides_with_all_except = []
衝突するオブジェクトを指定する便利な方法は、ほとんどすべてを指定することです。オブジェクトは、リスト内の項目を除いてすべてと衝突します。
2 つのオブジェクト A と B は、A が B の衝突する対象である場合、または B が A の衝突する対象である場合に衝突します。
Shape プロパティは、物理アクターの個々のシェイプに適用されます。アクターは、複数のシェイプで構成することができます。たとえば、ダンベル アクターは、2 つの球状シェイプとそれらを結合するカプセル状シェイプから作成することができます。
シェイプ リストは、シェイプのテンプレートを指定します。物理オブジェクトを定義するときに、異なるシェイプが使用するべきテンプレートを指定します。
例:
shapes = { default = {} trigger = {trigger = true} sweeper = {sweep = true} character = {collision_filter = "character"} character_trigger = {trigger = true collision_filter = "character_trigger"} }
シェイプに設定できるプロパティ:
collision_filter = "default"
シェイプが使用する collision filter を指定します。
disable_collision = false
True の場合、このシェイプの衝突は完全に無効になります。これは、レイキャストおよびオーバーラップのクエリーのみに使用するシェイプで使用できます。
disable_raycasting = false
True の場合、このシェイプではレイキャスティングが無効になります。
disable_response = false
True の場合、このオブジェクトの衝突の反応(バウンス)が無効になりますが、接触は生成されます。
disable_scene_queries = false
True の場合、このシェイプはシーンのクエリー テスト(オーバーラップ テストなど)には使用されません。
sweep = false
True の場合、このシェイプにスイープ衝突が使用されます。
物理エンジンではオブジェクトを段階的に移動してシミュレーションするため、高い速度を持つ小さいオブジェクトは単一のステップでサーフェスを完全に通過する場合があります。この場合、衝突イベントは生成されず、オブジェクトは単にサーフェスを通過したことが示されます。これは、「bullet-through-paper」問題と呼ばれます。
「bullet-through-paper」問題は、オブジェクトが一度のシミュレーション ステップで移動する場合に発生する危険性があります。すなわち、vdt* (ここで v は速度、dt は時間ステップ)がその半径 r より大きい場合です。既定では、物理オブジェクトのステップは 60 Hz です。つまり、v > 60r である場合に問題が発生する可能性があります。
この問題を解決するには、高速で移動する小さいオブジェクトに対して、スイープ衝突を有効にします。スイープ衝突を有効にすると、そのオブジェクトはシミュレーション開始時の位置から終了時位置にスイープされ、その過程の衝突が検出されます。スイープ衝突ではパフォーマンスが低下するため、すべてのオブジェクトに有効にするのではなく、高速で移動する小さいオブジェクトのみに使用することをお勧めします。
trigger = false
True に設定した場合は、シェイプがトリガ シェイプになるように指定します。
トリガ シェイプは通常の物理シミュレーションでは使用されません。代わりに、それらに物理オブジェクトが入るとイベントが生成されるボリュームを指定します。フローを使用してイベントの処理を設定できます。
Actor templates は、アクターに適用されるプロパティを指定します。物理アクターを定義する場合、使用するアクター テンプレートを指定します。
例:
actors = { static = {dynamic = false} dynamic = {dynamic = true linear_damping = 0.1 angular_damping = 0.1} keyframed = {dynamic = true kinematic = true linear_damping = 0.1 angular_damping = 0.1} }
アクター テンプレートには、次のプロパティを使用します。
mass = 0
アクターの質量を指定します。質量を指定しない場合は、アクターのシェイプのボリュームとそのマテリアルの密度から自動的に計算されます。
inertia = [0,0,0]
主軸の周囲のアクターの回転慣性を指定します。慣性を指定しない場合は、シェイプと密度から自動的に計算されます。
minimum_inertia_fraction = 0.1
物理エンジンは、異なる軸の周囲の慣性に大きな違いがある場合に正常には動作しません。これらのパラメータは、どのくらい異なる慣性が許可されるかを指定します。0.1 の値は、軸が最大慣性の 10% より小さい慣性を持つことができないことを意味します。通常、この値を変更する理由はありません。
linear_damping = 0.01
アクターの線形移動に適用される、一般的なダンピング係数です。ダンピングは、アクターを停止するものが何もなくても、少し後でアクターの移動を停止します。ダンピング値を大きくするほど、アクターがより早く「停止」および「フリーズ」され、シミュレーションの安定性とパフォーマンスが向上します。その一方で、アクターがあまりにも早く停止すると不自然に見える場合があります。
angular_damping = 0.05
アクターの回転移動に適用される、一般的なダンピング係数です。多くの場合、linear_damping よりも高い angular_damping を使用できます。
dynamic = false
True の場合、そのアクターは動的(物理的またはキーフレーム設定された状態)です。False の場合、そのアクターは静的です。
kinematic = false
True の場合、そのアクターがキーフレーム設定されます。このプロパティは dynamic が true の場合にのみ有効です。
disable_collision = false disable_response = false
対応する shape フラグとして、アクター全体に適用されます。
disable_gravity = false
True の場合、そのアクターは重力の影響を受けません。