Farseer Physics Engine 2.0 Manual

※Farseer Physics Engine 2.0 ( http://www.codeplex.com/FarseerPhysics )のマニュアルの一部を任意で和訳したものです。
translated by XELF 2008

導入 / Introduction

Farseer Physics Engineは2D物理エンジンを簡単に使うことができます。MicrosoftのXNA、Silverlight、WPF、Vanilla .NETのような幅広いプラットフォームをサポートしています。Farseer Physics Engineは、簡単さ、役立つ機能、面白いものを作れること、力学的なゲームに焦点を合わせています。

The Farseer Physics Engine is an easy to use 2D physics engine. It supports a wide range of platforms such as Microsoft's XNA, Silverlight, WPF, and Vanilla .NET. The Farseer Physics Engine focuses on simplicity, useful features, and enabling the creation of fun, dynamic games.


既知の問題 / Known issues

Farseer Physicsに関係したいくつかの既知の問題があります。これらの問題のいくつかはFarseer Physicsで見つかるのみならず、多くのほかの物理エンジンでも同じです。満足できるパフォーマンスや使い勝手を損なわないで解決することは容易ではありません。

There are some known issues that are related to Farseer Physics. Some of these issues are not only found in Farseer Physics, but also in many other physics engines. They are not easy to fix without sacrificing performance or usability.

 

1.      トンネリング / Tunneling

高速に移動している物体が壁に当たるときにこの現象は起き、その内部に立ち往生したり、衝突すらしないで壁を通り抜けたりすることさえあります。

This phenomenon occurs when you have a fast moving object that hits a wall and gets stuck inside it or even passes through the wall without even colliding.


Farseer Physics 2.0は現在、これについて何ら良い解決をしていませんが、これを防ぐためにCCD(Continuous Collision Detection:連続衝突検出)を実装する計画があります。そのときまで、次の選択肢があります。

Farseer Physics 2.0 does not currently have any good solution to this, but we have plans of implementing CCD (Continuous Collision Detection) that would prevent this from happening. Until then, these are your options:

 

1)      物体をよりゆっくり移動させる / Make your objects move slower

2)      物体をより大きくする / Make your objects larger

3)      時間ステップを下げる / Decrease your time step

4)      レイ・キャスティングを用いる / Use ray casting

5)      Swept collision detection (情報はこちら) / Swept collision detection (info here)

6)      マルチサンプリング / Multisampling

 

2.     幾何形状がお互いに進入してしまう

2.      Geometries going into each other

これは2つのことによって起きえます。幾何形状がとがった点、または直線の辺上であっても少なすぎる点をもつときです。

This can be caused by 2 things: Your geometries have sharp points or too few points, even on straight edges. 


とがった点があるならば、既定値より小さいグリッドセルサイズを使う必要があります。

If you have sharp points, you may need to use smaller grid cell size values, than the default.

既定値ではCreatePolygonBodyメソッドへcollisionGridCellSizeに0を渡すならば、メソッドはAABBのサイズに基づいたcollisionGridCellSizeを計算します。

By default, if you pass 0 for the collisionGridCellSize to the CreatePolygonBody method, the method will calculate a collisionGridCellSize for you based on the size of the AABB.


 

とがった点をもつ幾何形状であれば、おそらく既定値より小さな値を望むでしょう。0でない値を渡すようにするか、GeomFactory.GridCellSizeAABBFactorプロパティを設定して既定値を調整することができます。

If you have a geometry with sharp points you will probably want a smaller value than the default. You can either pass in your own non-zero value or you can adjust the default calculation by setting the GeomFactory.GridCellSizeAABBFactor property.

 

このプロパティは、既定のcollisionGridCellSizeを計算するために使われます。現在はcollisionGridSizeが幾何形状のAABBの1/10の最小の寸法になることを意味する0.1が設定されています。

This property is used to calculate the default collisionGridCellSize. Currently it is set to .1 which means the collisionGridCellSize will be 1/10th the smallest dimension of you geometry's AABB.

 

もうひとつは、幾何形状にさらなる点を挿入してみることです。Farseer Physicsには、これを補助するメソッドがあります。それはVerticesクラス内にあるSubDivideEdges()です。

The other thing you could try is inserting more points into the geometry. Farseer Physics has a method to help you do this. It's called SubDivideEdges() and lives inside the Vertices class.


以下に例を示します。

Here is an example:

 

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

Vertices vertices = new Vertices();

vertices.Add(new Vector2(-64, -64));

vertices.Add(new Vector2(64, -64));

vertices.Add(new Vector2(64, 64));

vertices.Add(new Vector2(-64, 64));

 

vertices.SubDivideEdges(10);

 

Geom rectGeom = new Geom(rectBody, vertices, 11);

 

: ボディと幾何形状を物理シミュレータへ忘れずに追加してください。

Note: Remember to add the body and geometry to the physics simulator.

 

SubDivideEdges()前

Before SubDivideEdges()

BeforeSubDivide

SubDivideEdges()後

After SubDivideEdges()

AfterSubDivide

 

 

3.      描画が中心をはずしている / Drawing is off center

Farseer Physics Engine 1.0.0.4以降、GeomFactoryのCreatePolygonGemメソッドへ与えた頂点群は、頂点群の重心へセンタリングされます。

Since Farseer Physics Engine 1.0.0.4, the vertices supplied to the GeomFactory's CreatePolygonGeom method gets centered on the centroid of the vertices.


このスレッドで述べられた手順に従うか、CreatePolygonGeomメソッドのVector2 offsetパラメータを使うことで対処できます。

You can work around it by following the steps described in this thread

or use the Vector2 offset parameter in the CreatePolygonGeom method.