FarseerPhysics エンジン / XNA で、 とはConvertUnits.ToDisplayUnits();
?
3 に答える
Farseer (または、派生元の Box2D) は、重量が 0.1 から 10 単位、サイズ (幅または高さ) が 0.1 から 10 単位の範囲のオブジェクトで最適に動作するように調整されています。この範囲外のオブジェクトを使用すると、シミュレーションが安定しない可能性があります。
ほとんどの場合、これは、メートルやキログラムで測定されるように、ゲームで見られる「通常の」サイズのオブジェクト (車、本など) に適しています。ただし、これは必須ではなく、実際には任意のスケールを選択できます。(例: ビー玉や飛行機を含むゲームでは、メートル/キログラム以外のスケールを使用する場合があります)。
ほとんどのゲームにはさまざまなスペースがあります。例:「モデル」空間、「プロジェクション」空間、「ビュー」空間、「ワールド」空間、「スクリーン」空間、「クライアント」空間。ピクセル単位で測定されるものもあれば、単純な単位で測定されるものもあります。また、一般的に、ゲームでは行列を使用して頂点をある空間から別の空間に変換します。最も明白なのは、単位で測定された世界を取得し、ピクセルで測定された画面に表示する場合です。
XNASpriteBatch
は、ワールド空間をクライアント空間と同じにすることで、デフォルトでこれをかなり簡素化します。1 ワールド単位 = 1 ピクセル。
通常、物理世界が存在する空間と同一になるように世界空間を定義する必要があります。しかし、これは、SpriteBatch
のデフォルト空間を使用する場合に問題になります。これは、外に出なければ 10 ピクセルを超える物理オブジェクトを持つことができないためです。 Farseer がチューニングされている範囲。
Farseer の[1]ソリューションは、ゲーム空間と物理空間という 2 つの異なるワールド空間を持つことです。そしてConvertUnits
、これら 2 つのシステム間で変換する必要があるあらゆる場所でこのクラスを使用します。
個人的には、このソリューションは非常にエラーが発生しやすいため、かなりひどいものだと思います(コード全体に広がる複数の場所で変換を正しく行う必要があるため)。
適度に真剣なゲーム開発作業については、Farseer が必要とするものに合わせて設計された、統一されたワールド スペースを使用することをお勧めします。そして、 へのグローバル トランスフォームを使用するかSpriteBatch.Begin
、または 以外の何かSpriteBatch
を使用して、その世界を画面にレンダリングします。
ただし、単純なデモの場合ConvertUnits
は、仕事をします。SpriteBatch
また、スケーリングされていないスプライトのテクスチャの 1 ピクセル = 画面上の 1 ピクセルという優れたプロパティを維持できます。
[1]: 前回確認したときConvertUnits
は、Farseer サンプルの一部であり、物理ライブラリ自体の一部ではありませんでした。
Farseer uses the MKS (metre, kilogram, second) units of measure. They provide methods to convert display units of measure to MKS units of measure and vice versa. ToSimUnits() and ToDisplayUnits().
私はそのコードの特定のチャンクを扱っていませんが、仮想空間 (ゲーム世界) を持つほとんどのゲームには「ToDisplayUnits」に似た機能があり、その機能はゲーム世界の物理単位を表示単位に変換することですXNA。
例としては、メートルからピクセル、メートルから x、y 画面座標などがあります。
これは良いことです。なぜなら、すべての数学を物理単位で行い、すべてを抽象化してから、ゲーム画面に個別に変換できるからです。