2015-11-14 7 views
12

私は過去数週間にわたってlibGDXライブラリを学んできました。私は、特にカメラ/ビューポートの関係のシステムを理解するために、ゲーム開発への私の最初の努力のために、それを見つけるのは難しいです。一つ私が使用することを言われてきたコードの行、およびAPI言及は、次のとおりです。libGDX投影行列の理解

batch.setProjectionMatrix(camera.combined); 

研究の良い4時間にもかかわらず、私はまだ、このコードの機能の完全な理解を欠いています。私が基本的に理解していることは、カメラが探しているバッチを「教えて」いるということです。私の理解の欠如は抑うつと怒りです、誰かが私を助けることができれば感謝します。コードスニペットのもう1つの問題は、レンダリングメソッド、メソッドの作成などで実装する必要があるかどうかがわかりません。

答えて

14

カメラで撮影することを検討してください。例えば。あなたのスマートフォンカメラを使って、公園のベンチの写真を撮ってください。そうすると、あなたのスマートフォンの画面に公園内のベンチが見えます。これは非常に明白に思えるかもしれませんが、これが何を含むかを見てみましょう。

写真上のベンチの位置は、写真を撮ったときの立っていた場所からの相対的なものです。言い換えれば、それはカメラに関連しています。典型的なゲームでは、オブジェクトをオブジェクトに相対的に配置しません。代わりに、ゲームの世界にそれらを配置します。ゲームの世界とカメラの間での変換は、マトリックスを使用して行われます(これは単に座標を変換するための数学的方法です)。例えば。カメラを右に動かすと、ベンチは写真の左側に移動します。これはビューマトリックスと呼ばれます。

写真上のベンチの正確な位置は、ベンチとカメラの間の距離によっても異なります。少なくとも、それは3Dで行います(2Dは非常に似ているので、読んでください)。それが遠くになると小さくなり、カメラに近づくと大きくなります。これを透視投影といいます。また、正射影を投影することもできます。この場合、オブジェクトのサイズはカメラまでの距離に応じて変わりません。いずれにしても、公園内のベンチの場所とサイズは、画面上の場所とサイズ(ピクセル単位)に変換されます。例えば。ベンチは公園内で2メートル、写真上では380ピクセルです。これを投影行列といいます。

camera.combinedは、ビューと投影の結合されたマトリックスを表します。言い換えれば、あなたのゲーム世界のものがスクリーン上にレンダリングされるべき場所を記述します。

batch.setProjectionMatrix(cam.combined);を呼び出すと、その結合されたマトリックスを使用するようにバッチに指示されます。値が変わるたびに呼び出す必要があります。これは通常、resizeが呼び出されたときに、またカメラを移動したり別の方法で変更したりするときに発生します。

あなたが不明な場合は、renderメソッドの開始時にそれを呼び出すことができます。

+0

大きな説明。 –

7

他の回答は優れていますが、私はそれがクリックするのに役立つかもしれないと言い方を変えています。

あなたは、実世界に似た座標系である「ワールドスペース」であなたのゲームを処理します。線形代数では、点の座標に2つの座標系の間の関係を表す行列を掛けることによって、ある座標系から別の座標系に空間の点を変換することができます。

視点行列にワールド空間からカメラ空間(カメラの視点)に変換する点が乗算されます。投影行列は、カメラ空間からスクリーン空間(デバイスの画面の平面2D矩形)に点を変換するために使用されます。 Libgdxのカメラでupdate()と電話すると、最新の変更が位置、向き、ビューポートサイズ、視野などに適用されます。そのビューと投影行列に変換し、シェーダで使用することができます。

2Dのカメラ空間にあるものを扱うことはめったにないため、SpriteBatchは別々のビューと投影行列を必要としません。これらは、ワールドスペースからスクリーンスペースにまっすぐに変換する単一のマトリックスに結合することができます。これは既にCameraで自動的に行われているため、camera.combinedマトリックスです。

SpriteBatchには、この投影行列にスプライトのすべての頂点を乗算するデフォルトのビルトインシェーダがあり、フラットスクリーンに正しくマッピングされます。

カメラを移動したとき、または画面のサイズを変更したときはいつでもsetProjectionMatrixに電話する必要があります。

3次元のものに使用されるモデル行列と呼ばれる第3の種類の行列があります。モデル行列は、ワールド空間におけるモデルの向き、位取り、および位置を記述します。したがって、モデル内の座標を乗じてローカル空間からワールド空間に移動します。

4

たとえば、基本的な横スクロールゲームを想定します。プレーヤーが横に動くと、カメラはパンに沿って移動します。これは、画面と世界が相対的に移動するため、オブジェクトが世界のどこにあるかは、画面上の場所に必ずしも一致しないことを意味します。

ここでは、画面が100px * 100pxの正方形であるとします(何らかの理由で)。オブジェクトを位置(50、0)に配置するので、画面の中央と下に表示されます。今度は、あなたのプレイヤーを右に動かすと、画面全体がパンをしてプレイヤーに従うと言います。これは、以前に配置したオブジェクトが画面上で左に移動したはずであることを意味します。だから、それは実際には風景の残りの部分に対して相対移動しなかったので、まだ世界では(50、0)ですが、スクリーン上で(10、0)で描かれるはずです。スクリーンが見ている世界の変化した。これは、「ワールドスペース」(オブジェクトが世界にある場合)と「スクリーンスペース」(オブジェクトが実際のディスプレイ上に描画される場合)の違いです。

SpriteBatchで描画しようとすると、デフォルトでワールドスペース座標がスクリーンスペース座標と同じであると仮定されます。「描画する場所は(50、0)」と書かれていると、 50、0)を画面に表示します。カメラが動いても、常に画面上に(50、0)で描画されるので、カメラがパンすると、オブジェクトは画面上の同じ場所に追いついていきます。あなたは、通常はしたくないので

は、あなたは座標をワールド空間の座標、およびその逆スクリーンスペースに変換する方法について説明します変換行列であるSpriteBatch射影行列を与えます。このように、バッチに "draw at(50、0)"と言うと、カメラから得られた行列を見ることができ、カメラが動いているので、実際には(50,0) 10、0)を画面に表示し、スプライトを適切な場所に描画します。