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に格納され、それは
| プロパティ | |
|---|---|
| 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 ) ) { // オブジェクトとレイが交差した }