物理エンティティ

Last-modified: 2010-03-06 (土) 18:35:31

http://tendon.s35.xrea.com/phpBB/kb.php?mode=article&k=83からの転載、修正したものです。

制約条件(Constraints)

現実世界において、オブジェクトは互いに様々な方法で制約されています。ドアはその枠にヒンジで接続され、スイングすることができます。あなたの腕はボールソケットジョイントで胴体に取り付けられています。重いオブジェクトをロープと滑車で動かすことができます。こうした概念がソースエンジンの物理の実装の中でまさに模倣されています。以下はエンティティを他のエンティティと接続するのに使える様々な制約システムのリストです。

phys_constraintsystem

多数のエンティティが全て互いに制約していたなら、それらの間のインタラクションの計算がシステムに多大な負荷をもたらすかもしれません。この負荷を軽減する一つのやりかたは一つのオブジェクトに作用する一連の制約条件を一つの制約システムにまとめることです。これによって物理システムはずっとタイミングよく制約条件を解決することができます。複数の制約条件が同一のオブジェクトに作用しているときはいつでも、最大のパフォーマンスを確保するために制約システムを指定すべきです。

phys_constraint

これは一番シンプルな制約条件で、釘か糊か何かで固定されたかのように一つのエンティティを他のものに接続します。このエンティティは制約するエンティティを指定する二つのフィールドを持ちます。片方のエンティティのフィールドを空白にした場合、指定されたエンティティはこの制約条件エンティティのオリジンに接続されます。これはオブジェクトを世界に制約するのによく使われます。他の制約条件同様に、制約条件が「壊れる」力やトルクのリミットを設定できます。十分な力かトルクがオブジェクトに作用したとき、制約条件は壊れ、自身を無効にし、他のイベントを起こすのにつかえるアウトプットを出します。

phys_ballsocket

ボールソケット制約条件は腕が胴体に肩で接続している方法と同一のものです。オブジェクトは他のオブジェクトにある点で接続していて、その点のまわりを球状に回転し動くことができます。これはロープとゲーム世界の建築物の接続を表現するのに使えます。ロープはその世界の中のポイントの周りを球状に回転することができます。

phys_hinge

ドアのヒンジのように、この制約条件によって制約されたオブジェクトは1軸を中心にした回転運動を行えます。ヒンジの軸はHammer内のヘルパーツールによって表現されます。ヒンジに摩擦(friction)要素を与えて古い錆びたヒンジのようにすぐ止まるようにすることもできます。"load scale"フィールドはphys_motorの実装と同じものです。

phys_lengthconstraint

二つのエンティティ間の距離を保つ制約条件です。"Keep Rigid"フラグをセットした場合、棒のように考えることができます。そうでない場合は(いくらかたわみがある)ロープのように振舞います。

phys_pulleyconstraint

本質的にはこの制約条件は長さ制約条件2つと空間のポイント2つから成り立っています。二つのオブジェクトをそれぞれの上に存在する滑車を介して接続している仮想のロープに似ています。この制約条件は滑車のポイントとオブジェクトの距離の和を一定にします。言い換えると、制約されたオブジェクトの一つを動かすと、もう一つのオブジェクトも「ロープ」の長さを一定にするために動くことになります。

phys_convert

ときにはあるイベントが起こるまでオブジェクトを完全にスタティックにしておく必要があります。例えば、岩をスクリプトに書かれた爆発でプレイヤーに崩れ落ちるようにするとき、それまで動かないようにしたいかもしれません。phys_constraintを使うこともできますが、phys_convert の使用はより直接的で間違えようがありません。phys_convertオブジェクトはスタティックエンティティを物理シミュレーションエンティティに変換することができます。prop_staticエンティティは変換のあとprop_physicsエンティティのように、func_brushエンティティはfunc_physboxエンティティのように振舞うようになります。変換がおこるまでエンティティの物理シミュレーションが行われないので、最初から物理オブジェクトで制約をしているよりエンジンの負荷がかなり低くなります。

phys_ragdollconstraint

通常のphys_constraintと似ていますが、ラグドールを制約するのに使います。この制約条件ではユーザがそれぞれの軸の運動可能範囲や摩擦などをコントロールすることができます。

phys_slideconstraint

この制約条件は一つの軸に沿った運動を可能にします。カーテンロッドに沿って動くシャワーカーテンリングのようなものです。ヒンジ制約条件同様に、運動可能方向を指定するヘルパーが表示されます。

phys_keepupright

直立した状態に保ちたいオブジェクトもあるでしょう。この制約条件は直立した状態を保つのに必要なトルクを与えます。一秒に与える回転トルクの量はエンティティの"Angular Limit"フィールドで指定します。その数字が大きいほど、直立状態をより強固に保つようになります。

phys_spring

物理的にシミュレーションされたバネです。"Length"フィールドがバネの自然長を指定します。何も接続していない、釣り下がっていない状態でのバネの長さです。バネに何かを接続すると、自然長から長く伸びます。伸びる量は"Spring Constant"(バネ定数)で決定します。バネ定数が大きいほど伸びは少なくなります。

その他

phys_magnet

マグネットのように働いて、触った金属オブジェクトを引きつけるエンティティです。

phys_motor

特定のスピードでターゲットエンティティを回そうとするエンティティです。軸に直接オブジェクトにを接続したモーターのようなものです。タイヤに接続すると、車のタイヤのように回転します。また"load scale"という馬力のような設定ができるフィールドがあります。モーターはオブジェクトを与えられた速度で回そうとして、もしオブジェクトが抵抗を持つ(衝突したときなどの)場合、モーターは正しいスピードを保つように"load scale"を使って出力を増やします。値が"2"にすると抵抗にあった場合に通常の2倍の力でオブジェクトを回そうとします。

phys_ragdollmagnet

ラグドールを引きつける単純なエンティティです。これは確実にドラマティックに死体を動かすのに役に立ちます。点として引きつけることも、「棒」のように空間の一ポイントにではなく、軸にそってエンティティを引きつけることもできます。これはラグドールを手すりの特定のポイントではなく、手すりの縁の全体に引っ張るのに役に立ちます。

phys_thruster

このエンティティはオブジェクトに特定の軸に沿った力を与えます。これは推進力を出すロケットエンジンのようなものです。このエンティティには内部に埋め込まれたタイマーがあって、デザイナーが一定時間だけ推進力を出して止まるように設定することもできます。

phys_torque

phys_motorエンティティ同様で、このエンティティはオブジェクトに回転速度を与えます。このエンティティには回転させるオブジェクトの質量を無視する能力、内部に埋め込まれたタイマーをつかって決まった時間だけオブジェクトにトルクを適用してから止まる能力などがあります。