Unproject!

画面上のマウスポインタの位置が、3次元空間の中でどこに対応するのか?

というのは、3Dアプリケーションではよく使う重要な問題だろう。
これを解決するために、XNAには、Viewport.Unproject()というメソッドが用意されている。

 public Vector3 Unproject (
         Vector3 source,
         Matrix projection,
         Matrix view,
         Matrix world
)

引数は、順にマウス位置、プロジェクション行列、View行列、World行列。(説明になってないが、3DCG用語だしなあ。変換行列でもよいはずか)

マウスの位置が何で3次元なんだよ!とかおもっていたのだが、最終的に3D画像が描画されるViewportも3次元空間で定義されているのでした。通常は、一番手間が0.0f一番奥が1.0f。手間がニアクリップ面、奥がファークリップ面に対応するようだ。
なので第一引数に

new Vector3 (2.0f,3.0f,0,0f)

とかすると、画面上左上のほうのある点が、ニアクリップ面のどこに相当するか教えてくれる。
ニアクリップ面と、ファークリップ面の対応するてんを結ぶRayを用意して、3D空間じょうのオブジェクトと交差判定を取れば、マウスの当たり判定が取れるという理屈になるらしい。

http://msdn.microsoft.com/ja-jp/library/bb203905.aspx

この第一引数の3次元ベクトルのy要素がなんに対応するか調べるのにずいぶんかかってしまった。というか、
ニアクリップ面が0.0f、ファークリップ面が1.0fに対応するのに気づかなかったorz