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 ) ) { // オブジェクトとレイが交差した }