3

XNA でグラフィックスを描画する方法を理解しようとしていますが、他の誰かがこれを提案しました。しかし、これを使用する前に...

このカメラを作成して使用し、LEFT,TOP を 0 に設定し、WIDTH=256 および HEIGHT=240 に設定すると、画面にレンダリングするものはすべてこれらの座標を使用しますか? では、幅と高さが 1 のボックスを 0,0 に設定すると、0,0 から 1,1 までのスペースを占有するのでしょうか?

4

1 に答える 1

15

あなたが参照している機能は次のとおりMatrix.CreateOrthographicOffCenter(left, right, bottom, top, zNearPlane, zFarPlane)です。

これは、ワールド空間のポイントを投影空間のポイントに変換するために使用できる投影行列を返します。

投影空間は、ビューポートの左下隅の (-1,-1) から右上隅の (1,1) までです。これは、ラスタライズ時に GPU が実際に動作する座標空間です。

ワールド空間はあなたが望むものです。

で行列を作成し、Matrix.CreateOrthographicOffCenter(0, 256, 240, 0, -10, 10)その行列を BasicEffect で射影行列として使用して立方体のモデルを描画したとします。立方体のモデルの中心が原点にあり、サイズが 1 (長さ、幅、高さ) であるとします。

と同様に、 (追加のカメラ変換が必要ないため) をbasicEffect.Projection設定し、ワールド空間で (0,0) から (1,1) に存在するようにモデルを変換します。次に、その BasicEffect を使用してモデルを描画します。basicEffect.View = Matrix.IdentitybasicEffect.World = Matrix.CreateTranslation(0.5f, 0.5f, 0)

立方体の上面 (正投影とは遠近法がないことを意味します) は、ビューポートの左上隅に描画されます。ビューポートの幅の 1/256 と高さの 1/240 を占めます (「 」も参照GraphicsDevice.Viewport)。

(PS: バックフェース カリングがこの種のプロジェクションによってどのように影響を受けるか思い出せません。何も表示されない場合は、オフにするか、ワインディング オーダーを切り替えてみてください。)


さて、これは言われています-あなたの他の質問(および正射行列を作成したいという事実)から、2Dスプライト作業をしたいという感覚が得られます。BasicEffect は、主に 3D 作業を行うために設計されています (ただし、スプライトには推奨されない独自の頂点シェーダーを作成する場合は、射影行列が必要になります)。

XNA の SpriteBatch を使用することをお勧めします。これは、スプライトの描画用に大幅に最適化されているためです。引数としてSpriteBatch.Begina を取ります。これは、射影行列ではなくMatrix transformMatrix、上記の World and View 行列と同等です。

SpriteBatch は、ワールド空間がクライアント空間と同じであると想定し (左上は (0,0)、幅と高さはビューポートのサイズです)、投影を処理します。(実際にはこれよりも高度です。スプライト ピクセルがスクリーン ピクセルと整列するようにオフセットが適用されます。)

ビューポートで世界が幅 256 単位、高さ 240 単位で表示されるようにスプライトを描画する場合は、次のような行列を に渡すことができますSpriteBatch.Begin

Matrix.CreateScale(viewport.Width / 256f, viewport.Height / 240f, 1f)

新しい XNA 4.0 では、SpriteBatch を使用してカスタム頂点シェーダーで描画できるため、任意のワールド ビュー プロジェクト マトリックスを使用できることに注意してください。

于 2010-06-11T04:26:06.383 に答える