私のゲームの世界では、x軸が左から右、y軸が上から下、z軸が画面の外に出ている2Dゲームを作成しています。
私のゲームの世界はトップダウンですが、ゲームは少し傾いてレンダリングされます。
私は、ワールドスペースからスクリーンスペースへ、またはその逆への投影に取り組んでいます。前者は次のように動作しています:
var viewport = new Viewport(0, 0, this.ScreenWidth, this.ScreenHeight);
var screenPoint = viewport.Project(worldPoint.NegateY(), this.ProjectionMatrix, this.ViewMatrix, this.WorldMatrix);
NegateY()
XNAのため、拡張メソッドは、それがのように聞こえるまさに行い、Y軸は、トップの代わりに、上から下へ下へと走ります。上のスクリーンショットは、これがすべて機能していることを示しています。基本的に、私は3D空間に多数のポイントを持ち、それを画面空間にレンダリングします。カメラのプロパティをリアルタイムで変更して、新しい位置にアニメーション表示することができます。明らかに、私の実際のゲームはポイントではなくスプライトを使用し、カメラの位置は固定されますが、それに到達する前に、すべての計算を適切に実行しようとしています。
今、私は逆に変換しようとしています。つまり、上の画面空間のxとyの点を指定して、ワールド空間の対応する点を決定します。たとえば、緑色の台形の左下にカーソルを合わせると、ワールドスペースの読み取り値は(0、480)になります。Z座標は無関係です。または、むしろ、ワールド空間にマッピングし直すとき、z座標は常にゼロになります。基本的に、私はこのメソッドシグネチャを実装したいと思います。
public Vector2 ScreenPointToWorld(Vector2 point)
私はこれを機能させるためにいくつかのことを試みましたが、運が悪いだけです。私の最新の考えでは、Viewport.Unproject
異なるz値とfar z値を使用して2回呼び出し、結果を計算Ray
し、それを正規化してから、基本的に私の世界の地上レベルを表すRay
との交差を計算する必要がありPlane
ます。しかし、私は最後のステップで立ち往生し、私が物事を過度に複雑にしているのかどうか確信が持てませんでした。
これを達成する方法について誰かが正しい方向に私を向けることができますか?