ピッキング (pick)

オブジェクトとレイ (ray) との交差から調べる方法

Unproject()メソッドで、オブジェクトのローカル空間に座標変換します。

public static Vector3 Unproject(
    Vector3 v,          // 近平面/遠平面のベクトル
    object viewport,    //
    Matrix projection,  //
    Matrix view,        //
    Matrix world        // 対象とするオブジェクトの行列
    );

Mesh.Intersect()メソッドで、オブジェクト (メッシュ) と交差した情報を取得できます。

public bool Intersect(
    Vector3 rayPos,                  // レイの原点
    Vector3 rayDir,                  // レイの方向
    ref IntersectInformation allHits // 最も近くで交差したオブジェクトの情報
    );
Mesh.Intersectメソッド | MSDN

交差したオブジェクトの情報は引数のallHitsに格納され、それは

IntersectInformation 構造体
プロパティ  
Dist レイに沿った交点までの距離
FaceIndex レイと交差した三角形のインデックス
U レイと交差した三角形の重心座標
V レイと交差した三角形の重心座標

のような内容です。

サンプルコード

Matrix world = meshMatrix * currentMatrix;

Matrix projection = device.Transform.Projection;
Matrix view = device.Transform.View;

Vector3 near = new Vector3( point.X, point.Y, viewport.MinZ );
Vector3 far = new Vector3( point.X, point.Y, viewport.MaxZ );

// 近平面をオブジェクトのローカル空間に座標変換する
Vector3 vNear = Vector3.Unproject( near, viewport, projection, view, world );

// 遠平面をオブジェクトのローカル空間に座標変換する
Vector3 vFar = Vector3.Unproject( far, viewport, projection, view, world );

// ローカル空間でのレイの方向ベクトルを生成する
Vector3 rayDirection = Vector3.Normalize( vFar - vNear );

IntersectInformation closestHit;
if( mesh.Intersect( vNear, rayDirection, out closestHit ) )
{
    // オブジェクトとレイが交差した
}

行列を直接操作して調べる方法