0

私は c++ で box2d を使って多くのことを行ってきましたが、C# を試しています。Box2Dの代わりにFarseerが一般的に使われているようです(Box2DXNAは知っていますが、少し古いようです)。私が C++ と Box2D を使用していたとき、誰もが常に 1 ピクセル/メートルの比率を使用しないようにアドバイスし (理由はわかりません)、通常は 30 ピクセル/メートル程度を使用することを提案しました。Farseer について調べていると、矛盾する意見がたくさん見られました。1 ピクセル/メートルを使用すると言う人もいれば、スケールを使用すると言う人もいれば、ConvertUnits.ToSimUnits と ConvertUnits.ToDisplayUnits を使用すると言う人もいます。

それで、私は何を使うべきですか?現在、ConvertUnits を使用していますが、すべてが変な場所にレンダリングされます。事実上の標準または私が従うべきものはありますか? 前もって感謝します。

4

2 に答える 2

2

Farseer 3.x は Box2D に基づいています。Box2D FAQ には次のように書かれています。

Box2D は、メートル-キログラム-秒 (MKS) に合わせて調整されています。動くオブジェクトは 0.1 ~ 10 メートルの間である必要があります。ピクセルを単位として使用しないでください。ぎくしゃくしたシミュレーションが得られます。

つまり、「通常の」物理世界を想定すると、おそらく1 物理単位 = 1mになるはずです。ただし、移動オブジェクトの大部分が 0.1 から 10 単位の範囲になるようなスケールであれば問題ありません。

たとえば、車のモデルを作っているとしましょう。たまたま長方形である、非常に単純なモデルです次のようなものを使用して作成します。

float width = 4.1f; // average car length in meters
float height = 1.4f; // average car height in meters
// Note: this method takes half-sizes:
var carVertices = PolygonTools.CreateRectangle(width / 2f, height / 2f);
// Then pass carVertices into PolygonShape, etc...

別の問題は、世界を正しいサイズでレンダリングする方法です。

これが一般的に行われる方法は、レンダリング時にカメラまたはビューマトリックスを使用することです (標準のワールド/ビュー/プロジェクション システムで)。これを行うことができる 2 つの場所はBasicEffect.View( MSDN )、または変換行列パラメーターSpriteBatch.Begin( MSDNも参照) です。

IMO、FarseerConvertUnitsクラスは、変換を処理する非常に醜い方法です。

于 2011-10-12T07:31:07.187 に答える
1

私は int MetersPixel = 64; を使用します。私のすべての基本計算に対して。そのため、テクスチャの幅が 16px の敵はほとんどいません。そのため、Farseer でボディを作成する場合、幅は 0.25 です。

16 / 64 = 0.25

最も重要なことは、感触、サイズ/スケール、および重量が現在のゲームに適していることです。コードを 10 = 1 にするためだけにフープをジャンプする必要がある黄金律や理由があるとは思いません.

これまでのところ、私にとっては完璧に機能しています。10px を 1m に変換しようと思ったことは一度もありませんでしたが、現在のゲーム ビルドでは役に立たないと思います。

于 2011-10-14T09:27:01.447 に答える