Share via


Gewusst wie: Treffertest in Viewport3D

In diesem Beispiel wird veranschaulicht, wie Sie einen Treffertest für visuelle 3D-Elemente in Viewport3D ausführen.

Da HitTest 2D- und 3D-Informationen zurückgibt, ist es möglich, die Ergebnisse des Tests nur nach den 3D-Ergebnissen zu durchsuchen.

        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)
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);

Das HitTestResultBehavior-Element bestimmt im folgenden Code, wie die Ergebnisse des Treffertests verarbeitet werden. UpdateResultInfo und UpdateMaterial sind lokal definierte Methoden.

        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
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;
}

Siehe auch

Weitere Ressourcen

Beispiel für eine 3D-Trefferüberprüfung