2011-12-23 9 views
0

大丈夫、私はこれを理解しようとしている2週間を過ごしました。私はこれを数学だけで処理する方法を試してきましたが、成功しませんでした。私はまたどこでも見て、人々がViewport.Project()を推薦するのを見ました。XNA 2Dをワールドポジションからスクリーンポジションに変換する

これは単純ではありません。 MSDNの分野やすべてのフォーラムを含め、私が見たどこでも、それを使用できるように提案していますが、試して使用する際には、動作するために必要な行列と値については説明しません。私はこの方法を正しく使う方法についての有益な情報がないことを知っています。それは真剣に私を狂ってしまいます。この貧しい人々を助けてください。

最初に行うことは、私の現在のコードを投稿することです。私は5つまたはそれ以上の異なるバージョンを持っています。私が得た最も近いものは、理解できないNANを得ていた。私は、小惑星がどこにあるかに基づいて画面上にテキストを表示しようとしています。非常に遠い場合、テキストがガイドとして機能し、プレイヤーは小惑星に行くことができます。

Vector3 camLookAt = Vector3.Zero; 
Vector3 up = new Vector3(0.0f, 0.0f, 0.0f); 

float nearClip = 1000.0f; 
float farClip = 100000.0f; 
float viewAngle = MathHelper.ToRadians(90f); 
float aspectRatio = (float)viewPort.Width/(float)viewPort.Height; 

Matrix view = Matrix.CreateLookAt(new Vector3(0, 0, 0), camLookAt, up); 
Matrix projection = Matrix.CreatePerspectiveFieldOfView(viewAngle, aspectRatio, nearClip, farClip); 

Matrix world = Matrix.CreateTranslation(camPosition.X, camPosition.Y, 0); 

Vector3 projectedPosition = graphicsDevice.Viewport.Project(new Vector3(worldPosition.X, worldPosition.Y, 0), projection, view, Matrix.Identity); 

screenPosition.X = projectedPosition.X; 
screenPosition.Y = projectedPosition.Y; 


if (screenPosition.X > 400) screenPosition.X = 400; 
if (screenPosition.X < 100) screenPosition.X = 100; 
if (screenPosition.Y > 400) screenPosition.Y = 400; 
if (screenPosition.Y < 100) screenPosition.Y = 100; 
return screenPosition; 

私が知る限り、Projectはカメラの位置です。私のゲームは2Dなので、vector3は面倒です。ZはCameraZoom、投影は2D Screenに変換したいオブジェクト、ビューはカメラがどれだけ見ることができるか、そして私は最後のものになるかもしれないと思ったわからない。

コードや知識が改善されず、MDSNチュートリアルを見ているうちに混乱している情報を約2週間見つけた後、私は世界の位置を実装していない画面の位置に変換します。すべての助けがありがたいです:)

プラス私は2Dゲームを使用しています。2DゲームにZ軸がない場合、ほとんどの人がZ軸について話すと混乱を招きます。ズームまたは移動。おかげでもう一度:)

+0

2dゲームで世界の中にカメラを置くだけでしようとしていますか? – Ben

+0

私は既にカメラの設定をしています.2次元世界の2Dカメラの位置を見つけようとしています。次に、世界のオブジェクトの位置をスクリーン座標に変換して、オブジェクトや名前などのテキストを表示します。PS my cameraそれは回転することができますが、私は回転を使用しないズームもあります – user1109013

+0

あなたは、画面の位置を取得するオブジェクトの世界の位置からカメラの世界の位置を減算しないでしょうか?次に、ズームを考慮する必要があります。私がいつもしてきたのは、世界の位置を(鼻を除く)すべてに割り当ててから、レンダリング時に画面の位置に変換することです(画面の位置ではなくワールドの位置を使用するカスタム描画コマンドを書きました)。 – Ben

答えて

0

私はここで誤解されているかもしれませんが、私はあなたが2DゲームのためにXNAに付属の3Dカメラを使用する必要はないと思う。何らかの視差システムなどのために3Dを使用して2.5Dゲームを作成しようとしているのでなければ、それをまったく使用する必要はありません。これらを見てみましょう:

2D Camera Implemetation in XNA

Simpler 2D Camera

XNA 2D tutorials

XNAにおける2Dは異なり、3Dよりも動作します。 3Dビューポートや3Dカメラなど何も気にする必要はありません。ニアクリッピングやファークリッピングはありません。 2DはXNAでうまく処理されているので、XNAの動作を誤解していると思います。

PS:Vector3を使用する必要はありません。代わりに、Vector2sを使用してください。私はあなたが2Dゲームで作業する方がずっと簡単だと思います。 ^^

+0

ちょっとケビンWangさんSimpler 2Dカメラへのリンクは私のカメラです:Dしかし、私はマウスの世界の座標を取得するための0,0に画面の中央からカメラの位置を変えた他のチュートリアルを読んで、 – user1109013