5 Stimmen

wpf3d-Rechteck-Hit-Test

Ich habe eine Anwendung mit 3D-Objekten, die sich in Viewport3D befinden, und ich möchte, dass der Benutzer sie durch Ziehen eines Rechtecks auf dem Bildschirm auswählen kann.

Ich habe versucht, GeometryHitTestParameters (mit Rechteckgeometrie) auf das Viewport3D anzuwenden, um die Ergebnisse zu erhalten, aber ich erhalte eine Ausnahme, die mir sagt, dass es mit Viewport3D nicht unterstützt wird. Nur PointHitTestParameters werden unterstützt.

Kennt jemand einen eleganten Weg, außer es selbst zu berechnen (z. B. alle 3D-Objekte auf 2D zu projizieren und manuelle Geometrieverschneidungen mit einem Rechteck durchzuführen)?

0 Stimmen

Haben Sie den Ansatz aus diesem Link ausprobiert? blogs.msdn.com/b/wpf3d/archive/2009/05/18/3d-hit-testing.aspx

0 Stimmen

Ja, natürlich. Dies ist der bekannte Ansatz für Punkt/Strahlen-Treffertests. Ich bin auf der Suche nach einem Rechteck-Hit-Test. Es ist kein integrierter Teil des Frameworks, aber vielleicht weiß jemand, wie ich das Framework nutzen kann, um meine Aufgabe elegant zu erfüllen. Wie auch immer, GeometryHitTestParameters funktioniert nicht auf Viewport3D. Daher kann ich es nicht für meine Rechteck-Hit-Testing verwenden.

0voto

Mykola Bogdiuk Punkte 1297

Ich bezweifle, dass es einen besseren Weg gibt, als durch die ausgewählten Rechteckpunkte zu iterieren:

    private void view_PreviewMouseDown(object sender, MouseButtonEventArgs e) {
        const double offset = 3.0; // I will test in a square 7x7
        var mouse = e.GetPosition(this);
        var items = new HashSet<Model3D>();
        for (double x = mouse.X - offset; x <= mouse.X + offset; x++)
            for (double y = mouse.Y - offset; y <= mouse.Y + offset; y++) {
                PointHitTestParameters pointparams = new PointHitTestParameters(new Point(x, y));
                Model3D result = null;
                VisualTreeHelper.HitTest(view, null, rawresult => {
                    var rayResult = rawresult as RayMeshGeometry3DHitTestResult;
                    if (rayResult != null)
                        items.Add(rayResult.ModelHit);
                    return HitTestResultBehavior.Continue;
                }, pointparams);
            }
        // temporary ListBox to show items
        list.ItemsSource = items.Select(item => item as GeometryModel3D == null ? null : (item as GeometryModel3D).Material as object);
    }

Voir MSDN Gewusst wie: Hit-Test in einem Viewport3D

1 Stimmen

Natürlich gibt es das. Zum Beispiel die manuelle Berechnung des Sichtkegelstumpfes anhand von Kameraparametern und das anschließende manuelle Durchlaufen des visuellen Baums und die Durchführung eines Modell-gegen-Frustum-Einhaltungstests. Mit Hilfe von Bounding Boxes kann eine hohe Geschwindigkeit erreicht werden. Aber damit würde man das Rad neu erfinden. Sie tun es bereits mit ray-based hit testing in WPF. Der einzige Unterschied besteht darin, dass der Schnittpunkttest nach dem Strahlenmodell und nicht nach dem Frustum-Modell erfolgt. Ich war nicht in der Lage, einen funktionierenden Code für dieses Szenario im Internet zu finden, und ich dachte, jemand hier weiß, wo ich effizienten Code finden kann, der diese Aufgabe erfüllt.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X