[紹介]
Farseer Physics Engine は簡単に使える2D物理エンジンです。XNA、Silverlight、WPF、Vanilla .NET といった幅広いプラットフォームをサポートしています。Farseer Physics Engine は簡単さ、便利さ、そして楽しくてダイナミックなゲームを作ることにフォーカスしています。


[概要]
簡単に説明しますと、Farseer Physics Engine はゲーム中の物体の経過時間によって位置と回転をコントロールするように設計されています。

現実世界では、物体はフォースとトルクによって移動と回転が起こります。Farseer でも同じです。現実世界の物体を「ボディ (剛体)」と呼ばれるオブジェクトで表します。フォースとトルクが適用されると、ボディは2D物理の法則によって作用します。ボディの位置と回転は、ゲーム中の物体を更新するために使用されます。

最もシンプルな手順は以下のようになります:

1. ボディを作成します。
2. シミュレーターにボディを追加します。
3. ゲームループを開始します。
   1. ボディにフォースとトルクを適用します。
   2. シミュレーターを更新します。
4. ゲームループを終了します。

ボディは設計上、2Dワールド上でジオメトリを持っていません。したがって衝突の概念がありません。

Farseer には、衝突を行うために「Geometry (ジオメトリ)」が用意されています。Geometry は頂点の集合で定義されます。ボディの形状を認識させるために、一つ以上の Geometry がアタッチされます。これでボディが他のボディと衝突することができます。(actually other Geometries attached to other Bodies, but you get the picture.)


[ボディ]
ボディは Farseer の中心的な物理オブジェクトです。フォース、トルク、衝撃力はボディに適用され、その動きに従ってボディに作用します。ボディは単独では衝突判定のための型を含みません。ボディを作成するには、通常 BodyFactory を使用します。しかし、最初ですので、下記にボディの作成手順を示します:

  1. int mass = 1;
  2.  
  3. float width = 128;
  4.  
  5. float height = 128;
  6.  
  7. Body rectBody = new Body();
  8.  
  9. rectBody.Mass = mass;
  10.  
  11. rectBody.MomentOfInertia = mass * (width * width + height * height) / 12;
  12.  
  13. rectBody.Position = new Vector2(100, 200);
  14.  

長方形の MOI (慣性モーメント) は下記のように計算されます:


各形状の MOI を覚えておけば、Farseer Physics があなたの代わりに MOI を計算してくれます。あなたがしなければならないことは「ボディファクトリー」の章に記載されている BodyFactory クラスを使用することだけです。ボディについて一つだけ注意してほしいことがあります。それはボディの位置はセンターからの相対位置に置かれるということです。

ノーマルポジション センターポジション

これは位置決めと描画のコードに関係しています。ボディの位置を決めるとき、位置をセンターからの相対位置に置く必要があります。また、ボディを画面上に描画したいときも、センターからの相対位置に描画されることを確認して下さい。


[ボディファクトリー]
ファクトリーからボディを作成するには下記のように記述します:

  1. Body rectBody = BodyFactory.Instance.CreateRectangleBody(PhysicsSimulator, 128, 128, 1);
  2.  

このボディは幅 128、高さ 128 のサイズ、質量 1 です。MOI (慣性モーメント) が計算されます。引数に物理シミュレーターを渡すことで、ボディが直ちに追加されることに注意して下さい。

下記の型のボディがファクトリーから作成できます:
○ Rectangle
○ Circle
○ Polygon
○ Body

最後の項目 (Body) は、Farseer に MOI を計算させずにボディを作成したいときのためにあります。また、ボディのクローンを作成し、それを使用することもできます。

BodyFactory には、いくつかオーバーロードされたメソッドがあります。物理シミュレーターを引数に取るものとそうでないものがあります。物理シミュレーターを渡すと、作成したボディがシミュレーターに追加されます。


[ジオメトリ]
ジオメトリ (Farseer では「Geom」と呼ばれます) は衝突検出の核です。ジオメトリは、形状のエッジを定義するボディと頂点の集合(反時計回りに配置されます)を必要とします。

ボディはフォース、トルク、衝撃力をコントロールする間、ジオメトリは衝突検出をコントロールし、他のジオメトリとの衝突に関連する衝撃力を計算します。

ジオメトリを作成するには、通常 GeomFactory を使用します。しかし、最初ですので、下記に ジオメトリ の作成手順を示します:

  1. Body rectBody = BodyFactory.Instance.CreateRectangleBody(128, 128, 1);
  2.  
  3. Vertices vertices = new Vertices();
  4. vertices.Add(new Vector2(-64, -64));
  5. vertices.Add(new Vector2(64, -64));
  6. vertices.Add(new Vector2(64, 64));
  7. vertices.Add(new Vector2(-64, 64));
  8.  
  9. Geom rectGeom = new Geom(rectBody, vertices, 11);
  10.  

ここでは長方形のボディを作成し、長方形 (0, 0 座標からの相対位置) のアウトラインを頂点の集合で表し、新しいジオメトリを頂点で定義します。Geom のコンストラクタの引数に渡された 11 はグリッドのセルサイズです。「グリッド」の章にグリッドのセルサイズについての詳細を記載しています。



もう一つ GeomFactory を使ったもっと簡単なジオメトリの作成方法があります。GeomFactory は長方形や円などの単純な形状の頂点コレクションを作成できます。必要なものは長方形の幅と高さ、または円の半径だけです。

下記に GeomFactory を使用した Geom の作成例を示します:

  1. Body rectBody = BodyFactory.Instance.CreateRectangleBody(128, 64, 1);
  2.  
  3. Geom rectGeom = GeomFactory.Instance.CreateRectangleGeom(PhysicsSimulator, rectBody, 128, 64);
  4.  

頂点やグリッドのセルサイズは指定しなくて良いことに注目して下さい。GeomFactory は頂点を作成し、グリッドのセルサイズを自動計算します。しかし、グリッドのセルサイズをコントロールしたいこともあります。

これもまた、GeomFactory ではとても簡単に行えます。グリッドのセルサイズを引数に取るオーバーロードされたメソッドを使用するだけです:

  1. Geom rectGeom = GeomFactory.Instance.CreateRectangleGeom(PhysicsSimulator, rectBody, 128, 64, 6.4f);
  2.  

ここではグリッドのセルサイズを 6.4 としました。(C# では、数値の後ろについている「f」は float型であることを示します)

グリッドのセルサイズに 0 を渡すと自動計算されます。ジオメトリの最も短い側面 (今回の例でいうと 64) を検索し、デフォルトのグリッドのセルサイズに 0.1 を掛けます。今回の例では 6.4 になります。

デフォルトのグリッドのセルサイズは、GeomFactory の GridCellSizeAABBFactor プロパティを設定することで調整できます。


[物理シュミレータービューア]
物理シミュレータービューアは、ジョイントのアンカー、ボディの位置、ジオメトリの整列、衝突をデバッグするために使用されます。ビューアがアクティブなとき、Farseer の物理が関係した問題をデバッグするのに不可欠なアンカー、衝突、接触点、中点、AABB、その他多くの情報を確認することができます。

物理シミュレータービューアは XNA のみで動作します。将来的には他のプラットフォームにも対応させる予定です。

デバッグビュー無し

デバッグビュー有り

説明:
デバッグビューには多くのコンフィギュレーションがあります。ここに可能性のリストがあります:

パフォーマンスパネル
○ エンジンの更新タイミングやボディ、ジオメトリ、ジョイント、スプリング、コントローラー、アービターの現在の数などの情報を表示します。
○ Clean up: 最終更新でジオメトリ、ボディ、ジョイント、接触点、スプリングの追加、削除にかかった時間です。
○ Broad Phase Collision: 広域な衝突検出にかかった時間です。
○ Narrow Phase Collision: 厳密な衝突検出にかかった時間です。
○ Apply Forces: 全てのスプリング、コントローラー、ボディにフォースを適用するにかかった時間です。
○ Apply Impulses: ジョイントとアービターに衝撃力を適用するのにかかった時間です。
○ Update Positions: 全てのボディの位置を更新するのにかかった時間です。

頂点
○ ジオメトリを形成する頂点を表示します。 ジオメトリの周りに小さな黒い点として表示されます。

AABB
○ Axis Aligned Bounding Box を表示します。「AABB」の章に詳細を記載しています)

接触点
○ 接触点を表示します。小さな赤い点として表示されます。

座標軸
○ ボディの中点を表示します。黒い+印で表示されます。

グリッド
○ 厳密な衝突検出に使用されるジオメトリのグリッドを表示します。グリッド内に多くの点が存在することがあるため、このオプションによって描画速度が低下するかもしれません。黒い点として表示されます。(上のデバッグ表示のスクリーンショットでは無効になっています)

エッジ
○ ジオメトリのエッジのアウトラインを表示します。黒いエッジとして表示されます。

ジョイント
○ レボリュートジョイント、ピンジョイント、シリンダージョイントを視覚化します。

スプリング
○ リニアスプリング (固定バージョンと通常バージョンの両方) は2つの終点を結ぶ黒いラインで表示されます。直線上に配置される3つの点はラインの収縮と膨張を表すために表示されます。


[ジョイント]
Farseer Physics Engine はいくつか基本的なジョイントを提供します。これらのジョイントを組み合わせることでほとんどのダイナミックな振る舞いを作成することができます:

○ レボリュートジョイント (1軸回転ジョイント)
○ アングルジョイント (回転ジョイント)
○ アングルリミットジョイント (制限付き回転ジョイント)
○ ピンジョイント
○ スライダージョイント
○ ギアジョイント ※実験中のジョイントです。

※固定バージョンについて
固定バージョンとはジョイントがワールド上に固定され、他の非固定バージョンのジョイントとしてのボディには固定されないことを意味します。

全てのジョイントについての重要事項
○ いくつかのジョイントはボディから相対位置のアンカーとワールド座標上のアンカーが必要になります。そして、使用時にはジョイントのタイプに注意して下さい。
○ ジョイントはボディにアタッチされます。
○ 全てのジョイントはいくつか共通の変数とメソッドがあります。
○ アンカーはアタッチされたボディのジオメトリの内部にある必要はありません。
○ ジョイントは壊れたとき、動作しなくなります。

ジョイントがうまく動作しないときは・・・
1. アンカーが正しいかどうか確認して下さい。物理シミュレータービューアを使用し、それを確認して下さい。
2. プロパティを大きく変更しないで下さい。ゆっくり調整し、シミュレーションを再確認して下さい。
3. アンカーはアタッチされたボディのジオメトリの内部にある必要はありません。 ジオメトリの問題を解決する能力を制限しないで下さい。ゲームの50%はフェイクであることを覚えておいて下さい。最終結果が正しく"見える"ようにして下さい。

開発者情報:
全てのジョイントは基底クラス Joint から派生しています。もしあなたが独自の制約を追加できるノウハウがあれば、必ず Joint から派生して下さい。
(また、それをコミュニティーと共有して下さい)

共通の変数 - (これらは全てのジョイントに適用されます)
○ Enabled - 単純に制約を行うかどうかをエンジンに知らせます。
○ IsDisposed - ジョイントが破棄されたかどうかをあなたと物理シミュレーターに知らせます。
○ JointError - ジョイントのエラーを取得します。全てのジョイントにエラーが生じる訳ではないので注意して下さい。
○ Breakpoint - JointError がジョイントが壊れる前に達することのできる最大値を定義します。デフォルトでは壊れません。(浮動小数点数の最大値になっています)
○ Softness - この係数はジョイントの柔軟さを指定するのに使用されます。0.0 ~ 1.0 の間の値であるべきですが、それ以外は何も定義されていません。これはシミュレーターをあなたの好みに調整するためだけに使用されます。全てのジョイントは Softness に 0.0f を設定しても、いくらかの柔軟性を持っていることに注意して下さい。
○ BiasFactor - この係数はどのくらいの強さでエラーを修正するかを決定します。0.0 ~ 1.0 の間の値であるべきですが、それ以外は何も定義されていません。デフォルト値は 0.2f です。高すぎる値、または低すぎる値を設定すると、動的に不安定な状態になることがありますので、小さな増減で変更するように注意して下さい。
○ Broke - このイベントハンドラはジョイントが壊れたときに呼び出されます。ここにメソッドを提供するかどうかはあなた次第です。もし提供しなければ何も起こりません。○ Tag - あなたの好きなデータを設定できる共通オブジェクトです。

共通のメソッド - (これらは全てのジョイントに適用されます)
○ Validate - 関係している全てボディが破棄されていないかどうかを決定します。もしいずれかのボディが破棄されていたならば、ジョイントを破棄します。
○ PreStep - ジョイントの更新に必要な数学計算を実行します。自身のジョイントが使用するものだけを記述して下さい。
○ Update - ジョイントを更新します
○ Dispose - ジョイントを破棄します。


[レボリュートジョイント]
このタイプのジョイントは、車輪を加えたり、複数のオブジェクトを結び付けるのに最適です。このジョイントは、ワールドベクトルで扱いますが、内部的にはジョイントの位置を2つのローカルベクトルとして保存しています。ジョイントのエラーは、2つのローカルベクトルの間の距離を見ることによって決定します。このジョイントはボディ本体と固定タイプのボディから成ります。ボディ本体を使うときは直線的に動くことができます。そして、固定タイプのボディを使うときは回転だけができることに注意して下さい。

プロパティ
○ Body1 - 最初のジョイントのボディを取得/設定します。このプロパティは固定レボリュートジョイントでは Body と名付けられています。
○ Body2 - 2つ目のジョイントのボディを取得/設定します。このプロパティは固定レボリュートジョイントでは存在しません。
○ Anchor - ジョイントのアンカーを取得/設定します。これはワールド座標上にあります。
○ CurrentAnchor - シミュレーション開始後のジョイントのワールド座標上の位置を取得します。 ジョイントを描画するときに役立ちます。
○ SetInitialAnchor - シミュレーション開始前のアンカーを設定します。


デモの説明:
黄色の長方形はレボリュートジョイントでその場所に止められています。移動することはできず、回転しかできません。マウスを使って長方形を回転させてみて下さい。固定レボリュートジョイントはこれを実現するために使用されます。

次の長方形を見て下さい。緑色の長方形が赤色の長方形に止められているのが分かると思います。それらはワールド上を動き回ることはできますが、お互いに相対位置にあり回転しかできません。通常、レボリュートジョイントはこれを実現するために使用されます。


[アングルジョイント]
このジョイントは2つの繋がったボディの角度を同じにする、または目的の角度にするのに最適な動作をします。固定バージョンは単純にボディが目的の角度に保たれます。スナップの角度を元にすることなく、プログラム的にボディの角度を変更するのに最適な動作をします。角度を変更するとボディが素早く反応し、その角度に達します。

プロパティ
○ TargetAngle - ボディが目指す角度 (ラジアン) を取得/設定します。
○ MaxImpulse - ボディが TargetAngle を目指すときに使用する最大トルクを取得/設○ デフォルトでは浮動小数点数の最大値になっています。
○ Body1 - 最初のジョイントのボディを取得/設定します。このプロパティは固定アングルジョイントで Body と名付けられています。
○ Body2 - 2つ目のジョイントのボディを取得/設定します。このプロパティは固定アングルジョイントでは存在しません。


デモの説明:
左側に常に同じ角度に保たれている緑色の長方形があります。回転はできず、移動できるだけです。固定アングルジョイントはこれを実現するために使用されます。

右側に同じ角度/回転を共有している2つの黄色の長方形があります。一方を回転させると、もう片方も同じだけ回転します。通常、アングルジョイントはこれを実現するために使用されます。


[アングルリミットジョイント]
アングルジョイントと同じですが、制限機能があり、また目的の角度、トルク、衝撃力がありません。

プロパティ
○ LowerLimit - ボディの最小角度 (ラジアン) を取得/設定します。
○ UpperLimit - ボディの最大角度 (ラジアン) を取得/設定します。
○ Slop - 制限の最小/最大に許す誤差を取得/設定します。
○ Body1 - 最初のジョイントのボディを取得/設定します。このプロパティは固定アングルリミットジョイントでは Body と名付けられています。
○ Body2 - 2つ目のジョイントのボディを取得/設定します。このプロパティは固定アングルリミットジョイントでは存在しません。


デモの説明:
左側の緑色の長方形は、常に定義された制限内で回転します。最小 15 度、最大 50 度です。固定アングルリミットジョイントはこれを実現するために使用されます。

2つの黄色の長方形は、常にお互いに指定された角度が制限されています。それらの両方を地面に置いてみて下さい。そうすれば、両方を地面にしっかり置くことが不可能であることが分かるでしょう。最小 15 度、最大 50 度です。通常、アングルリミットジョイントはこれを実現するために使用されます。


[ピンジョイント]
このジョイントは恐らくロッドジョイントと呼ばれているでしょう。2つのボディが回転している間、その間の距離を保ちます。

プロパティ
○ TargetDistance - 2つのアンカー間の望ましい距離を取得/設定します。 距離を指定しない場合、ボディ間のオフセットは目標距離になります。
○ Body1 - 最初のジョイントのボディを取得/設定します。再計算をせずに TargetDistance を変更すると動作が不安定になるかもしません。
○ Body2 - 2つ目のジョイントのボディを取得/設定します。再計算をせずに TargetDistance を変更すると動作が不安定になるかもしません。
○ Anchor1 - Body1 のローカル座標上のアンカーを取得/設定します。
○ Anchor2 - Body2 のローカル座標上のアンカーを取得/設定します。
○ WorldAnchor1 - Body1 のワールド座標上のアンカーを取得します。ジョイントを描画するときに役立ちます。
○ WorldAnchor2 - Body2 のワールド座標上のアンカーを取得します。ジョイントを描画するときに役立ちます。


デモの説明:
2つの赤色の長方形は、互いの間の目標距離を保つために、ピンジョイントを使用しています。それらは互いにそれ以上、離れたり近づいたりできません。両方のボディは回転することはできます。

2つの黄色の長方形は、互いが最小から最大の間の距離を保つために、スライダージョイント (後述) を使用しています。そららはピンジョイントと比較し、お互いに離れたり近づいたりできます。


[シリンダージョイント]
このジョイントはピンジョイントと似ていますが、距離の制限に最小/最大があります。2つのボディが回転している間、最小から最大の間の距離を保ちます。

プロパティ
○ TargetDistance - 2つのアンカー間の望ましい距離を取得/設定します。
○ Body1 - 最初のジョイントのボディを取得/設定します。再計算をせずに TargetDistance を変更すると動作が不安定になるかもしません。
○ Body2 - 2つ目のジョイントのボディを取得/設定します。再計算をせずに TargetDistance を変更すると動作が不安定になるかもしません。
○ Anchor1 - Body1 のローカル座標上のアンカーを取得/設定します。
○ Anchor2 - Body2 のローカル座標上のアンカーを取得/設定します。
○ WorldAnchor1 - Body1 のワールド座標上のアンカーを取得します。ジョイントを描画するときに役立ちます。
○ Min - アンカーが近づけられる最小の距離を取得/設定します。
○ Max - アンカーが離れられる最大の距離を取得/設定します。
○ Slop - 制限の最小/最大に許す誤差を取得/設定します。


[ジョイントファクトリー]
ジョイントファクトリーはボディファクトリーとほとんど同じ方法でジョイントを作成できます。
全てのパラメータはそれぞれのジョイントで説明してありますので、単純に使用されるそれぞれのメソッドのリストを記載します。ファクトリーはいつもジョイントの全てのパラメータが必要な訳ではないことに気を付けて下さい。

Revolute Joint Factory
1. CreateRevoluteJoint(PhysicsSimulator physicsSimulator, Body body1, Body body2, Vector2 initialAnchorPosition)
2. CreateRevoluteJoint(Body body1, Body body2, Vector2 initialAnchorPosition)

Fixed Revolute Joint Factory


1. CreateFixedRevoluteJoint(PhysicsSimulator physicsSimulator, Body body, Vector2 anchor)
2. CreateFixedRevoluteJoint(Body body, Vector2 anchor)

Pin Joint Factory
1. CreatePinJoint(PhysicsSimulator physicsSimulator, Body body1, Vector2 anchor1, Body body2, Vector2 anchor2)
2. CreatePinJoint(Body body1, Vector2 anchor1, Body body2, Vector2 anchor2)

Slider Joint Factory
1. CreateSliderJoint(PhysicsSimulator physicsSimulator, Body body1, Vector2 anchor1, Body body2, Vector2 anchor2, float min, float max)
2. CreateSliderJoint(Body body1, Vector2 anchor1, Body body2, Vector2 anchor2, float min, float max)

Angle Joint Factory
1. CreateAngleJoint(PhysicsSimulator physicsSimulator, Body body1, Body body2)
2. CreateAngleJoint(Body body1, Body body2)
3. CreateAngleJoint(PhysicsSimulator physicsSimulator, Body body1, Body body2, float softness, float biasFactor)
4. CreateAngleJoint(Body body1, Body body2, float softness, float biasFactor)

Fixed Angle Joint Factory
1. CreateFixedAngleJoint(PhysicsSimulator physicsSimulator, Body body)
2. CreateFixedAngleJoint(Body body)

Angle Limit Joint Factory
1. CreateAngleLimitJoint (PhysicsSimulator physicsSimulator, Body body1, Body body2, float min, float max)
2. CreateAngleLimitJoint (Body body1, Body body2, float min, float max)

Fixed Angle Limit Joint Factory
1. CreateFixedAngleLimitJoint (PhysicsSimulator physicsSimulator, Body body, float min, float max)
2. CreateFixedAngleLimitJoint (Body body, float min, float max)


[スプリング]
Farseer Physics Engine はいくつか基本的なスプリングを提供します。これらのスプリングを組み合わせることでほとんどのダイナミックな振る舞いを作成することができます。

○ リニアスプリング (線形スプリング)
○ アングルスプリング (回転スプリング)

※固定バージョンについて
固定バージョンとはスプリングがワールド上に固定され、他の非固定バージョンのスプリングとしてのボディには固定されないということを意味します。

全てのスプリングについての重要事項
○ いくつかのスプリングはボディから相対位置のアンカーとワールド座標上のアンカーが必要になります。そして、使用時にはスプリングのタイプに注意して下さい。
○ スプリングはボディにアタッチされます。
○ 全てのスプリングはいくつか共通の変数とメソッドがあります。アンカーはアタッチされたボディのジオメトリの内部にある必要はありません。
○ スプリングは壊れたとき、動作しなくなります。

スプリングがうまく動作しないときは・・・
1. アンカーが正しいかどうか確認して下さい。物理シミュレータービューアを使用し、それを確認して下さい。
2. プロパティを大幅に変更しないで下さい。ゆっくり調整し、シミュレーションを再確認して下さい。
3. アンカーはアタッチされたボディのジオメトリの内部にある必要はありません。ジオメトリの問題を解決する能力を制限しないで下さい。ゲームの50%はフェイクであることを覚えておいて下さい。最終結果が正しく"見える"ようにして下さい。

開発者情報:
全てのスプリングは基底クラス Spring から派生しています。もしあなたが独自の制約を追加できるノウハウがあれば、必ず Spring から派生して下さい。(また、それをコミュニティーと共有して下さい)

共通の変数 - (これらは全てのスプリングに適用されます)
○ Enabled - 単純に制約を行うかどうかをエンジンに知らせます。
○ IsDisposed - スプリングが破棄されたかどうかをあなたと物理シミュレーターに知らせます。
○ DampningConstant - スプリングのダンプニング定数を取得/設定します。これは衝撃吸収装置のような働きをします。
○ SpringConstant - スプリングの押し引き定数を取得/設定します。バネの強さと考えることができます。
○ SpringError - スプリングのエラーを取得します。全てのスプリングにエラーが生じる訳ではないので注意して下さい。
○ Breakpoint - JointError がジョイントが壊れる前に達することのできる最大値を定義します。
○ Broke - このイベントハンドラはジョイントが壊れたときに呼び出されます。ここにメソッドを提供するかどうかはあなた次第です。もし提供しなければ何も起こりません。
○ Tag - あなたの好きなデータを設定できる共通オブジェクトです。

共通のメソッド - (これらは全てのスプリングに適用されます)
○ Validate - 関係している全てボディが破棄されていないかどうかを決定します。もしいずれかのボディが破棄されていたならば、スプリングを破棄します。
○ Update - スプリングを更新します。※原文の誤り?
○ Dispose - スプリングを破棄します。


[リニアスプリング]
このスプリングはボディの押し引きを提供します。押したり引いたりすることができ、またあらゆる方向に働かせることができます。正しいジョイントと結合されれば、何でもシミュレートできます。

プロパティ
○ Body1 - 最初のスプリングのボディを取得/設定します。このプロパティは固定リニアスプリングでは Body と名付けられています。※原文の誤り?
○ Body2 - 2つ目のスプリングのボディを取得/設定します。このプロパティは固定リニアスプリングでは存在しません。※原文の誤り?
○ Anchor1 - Body1 のローカル座標上のアンカーを取得/設定します。
○ Anchor2 - Body2 のローカル座標上のアンカーを取得/設定します
○ RestLength - これはバネが全く押し引きしていないときの長さです。ファクトリーを使用するとき、RestLength はアンカーとの間の距離として計算されることに注意して下さい。スプリングの作成してすぐに押し引きを開始したいのであれば、このプロパティを測っておくべきです。大きすぎる値だとボディが離れてしまい、小さすぎる値だとボディがくっついてしまいます。


デモの説明:
2つの黄色のボディがリニアスプリングでくっついています。ボディは大きなフォースで離すことができます。そららはゴムバンドのように繋がっています。
通常、リニアスプリングはこのデモのように使用されます。

このマニュアルの全てのデモは、ボディを動かしたりフォースを適用するために、固定リニアスプリングを使用しています。これは黒いのラインで表されています。


[アングルスプリング]
このスプリングはねじり棒のように働きます。

プロパティ
○ Body1 - 最初のスプリングのボディを取得/設定します。このプロパティは固定リニアスプリングでは Body と名付けられています。
○ Body2 - 2つ目のスプリングのボディを取得/設定します。このプロパティは固定リニアスプリングでは存在しません。
○ TargetAngle - 目指す角度 (ラジアン) はスプリングの中心に置かれ、フォースは提供しません。
○ MaxTorque - これは TargetAngle を目指すときに適用される最大トルクです。
○ TorqueMultiplier - トルクにこの値が掛けられます。1.0f が通常のトルクです。デフォルト値は 1.0f です。


デモの説明:
中央の白いエレメントはまさしく飛込み板のように機能します。このアングルスプリングは固定タイプです。これはワールドにアタッチされていることを意味します。レボリュートジョイントは、スプリング板をワールド上に止めるのに使われています。そのため、同じ位置に留まっていますが、中心点の周りを回転することができます。


[スプリングファクトリー]
スプリングファクトリーはボディファクトリーとほとんど同じ方法でスプリングを作成できます。全てのパラメータはそれぞれのスプリングで説明してありますので、単純に使用されるそれぞれのメソッドのリストを記載します。ファクトリーはいつもスプリングの全てのパラメータが必要な訳ではないことに気を付けて下さい。

Linear Spring Factory
○ CreateLinearSpring(PhysicsSimulator physicsSimulator, Body body1, Vector2 anchor1, Body body2, Vector2 anchor2, float springConstant, float dampningConstant)
○ CreateLinearSpring(Body body1, Vector2 anchor1, Body body2, Vector2 anchor2, float springConstant, float dampningConstant)

Fixed Linear Spring Factory
○ CreateFixedLinearSpring(PhysicsSimulator physicsSimulator, Body body, Vector2 anchor1, Vector2 anchor2, float springConstant, float dampningConstant)
○ CreateFixedLinearSpring(Body body, Vector2 anchor1, Vector2 anchor2, float springConstant, float dampningConstant)

Angle Spring Factory
○ CreateAngleSpring(PhysicsSimulator physicsSimulator, Body body1, Body body2, float springConstant, float dampningConstant)
○ CreateAngleSpring(Body body1, Body body2, float springConstant, float dampningConstant)

Fixed Angle Spring Factory
○ CreateFixedAngleSpring(PhysicsSimulator physicsSimulator, Body body, float springConstant, float dampningConstant)
○ CreateFixedAngleSpring(Body body, float springConstant, float dampningConstant)




最終更新:2008年12月02日 20:55