다음을 통해 공유


방법: Viewport3D의 적중 테스트

이 예제에서는 Viewport3D에서 3D 시각적 개체에 대한 테스트를 적중하는 방법을 보여 줍니다.

HitTest는 2D 및 3D 정보를 반환하므로 테스트 결과를 반복하여 3D 결과만 읽을 수 있습니다.

public void HitTest(object sender, System.Windows.Input.MouseButtonEventArgs args)
{
    Point mouseposition = args.GetPosition(myViewport);
    Point3D testpoint3D = new Point3D(mouseposition.X, mouseposition.Y, 0);
    Vector3D testdirection = new Vector3D(mouseposition.X, mouseposition.Y, 10);
    PointHitTestParameters pointparams = new PointHitTestParameters(mouseposition);
    RayHitTestParameters rayparams = new RayHitTestParameters(testpoint3D, testdirection);

    //test for a result in the Viewport3D
    VisualTreeHelper.HitTest(myViewport, null, HTResult, pointparams);
Public Sub HitTest(ByVal sender As Object, ByVal args As MouseButtonEventArgs)
    Dim mouseposition As Point = args.GetPosition(myViewport)
    Dim testpoint3D As New Point3D(mouseposition.X, mouseposition.Y, 0)
    Dim testdirection As New Vector3D(mouseposition.X, mouseposition.Y, 10)
    Dim pointparams As New PointHitTestParameters(mouseposition)
    Dim rayparams As New RayHitTestParameters(testpoint3D, testdirection)

    'test for a result in the Viewport3D
    VisualTreeHelper.HitTest(myViewport, Nothing, AddressOf HTResult, pointparams)

다음 코드에서 HitTestResultBehavior는 적중 테스트 결과가 처리되는 방법을 결정합니다. UpdateResultInfoUpdateMaterial은 로컬로 정의된 메서드입니다.

public HitTestResultBehavior HTResult(System.Windows.Media.HitTestResult rawresult)
{
    //MessageBox.Show(rawresult.ToString());
    RayHitTestResult rayResult = rawresult as RayHitTestResult;

    if (rayResult != null)
    {
        RayMeshGeometry3DHitTestResult rayMeshResult = rayResult as RayMeshGeometry3DHitTestResult;

        if (rayMeshResult != null)
        {
            GeometryModel3D hitgeo = rayMeshResult.ModelHit as GeometryModel3D;

            UpdateResultInfo(rayMeshResult);
            UpdateMaterial(hitgeo, (side1GeometryModel3D.Material as MaterialGroup));
        }
    }

    return HitTestResultBehavior.Continue;
}
Public Function HTResult(ByVal rawresult As HitTestResult) As HitTestResultBehavior
    Dim rayResult As RayHitTestResult = TryCast(rawresult, RayHitTestResult)

    If rayResult IsNot Nothing Then
        Dim rayMeshResult As RayMeshGeometry3DHitTestResult = TryCast(rayResult, RayMeshGeometry3DHitTestResult)

        If rayMeshResult IsNot Nothing Then
            Dim hitgeo As GeometryModel3D = TryCast(rayMeshResult.ModelHit, GeometryModel3D)

            UpdateResultInfo(rayMeshResult)
            UpdateMaterial(hitgeo, (TryCast(side1GeometryModel3D.Material, MaterialGroup)))
        End If
    End If

    Return HitTestResultBehavior.Continue
End Function