2010-12-13 12 views
5

Ich habe eine Anwendung mit 3D-Objekten, die in Viewport3D befinden und ich möchte, dass der Benutzer sie durch Ziehen eines Rechtecks ​​auf dem Bildschirm auswählen können.wpf3d rechteck hit test

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

Kennt irgendjemand eine elegante Möglichkeit, es zu tun, außer es selbst zu berechnen (zum Beispiel - alle 3D-Objekte auf 2D projizieren und manuelle Geometrieverschneidungen mit einem Rechteck durchführen)?

+0

Haben Sie den Ansatz von diesem Link versucht? http://blogs.msdn.com/b/wpf3d/archive/2009/05/18/3d-hit-testing.aspx –

+0

Natürlich. Dies ist der bekannte Ansatz für Point/Ray Hit-Tests. Ich suche nach einem Rechteck-Hit-Test. Es ist kein integrierter Teil des Frameworks, aber vielleicht weiß jemand, wie ich das Framework verwenden kann, um meine Aufgabe elegant zu erfüllen. Wie auch immer, funktioniert GeometryHitTestParameters nicht auf Viewport3D. Daher kann ich es nicht für meine Rechteck-Treffertests verwenden. – Alex

Antwort

0

ich bezweifle, dass es besser ist Weg durch ausgewählte Rechteck Punkte als 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); 
    } 

Siehe MSDN How to: Hit Test in a Viewport3D

+1

Natürlich gibt es. Zum Beispiel das manuelle Berechnen des Betrachtungsstumpfs unter Verwendung von Kameraparametern und dann das manuelle Durchfahren des visuellen Baums und das Durchführen eines Modell-gegen-Frustum-Eindämmungstests. Hohe Geschwindigkeit kann mit Begrenzungsrahmen erreicht werden. Aber das erfindet das Rad neu. Sie tun dies bereits mit Ray-basierten Hit-Tests in WPF. Der einzige Unterschied besteht darin, dass der Schnitttest ein Strahlmodell und kein Stumpfmodell ist. Ich konnte keinen funktionierenden Code für dieses Szenario im Internet finden und ich dachte jemand hier weiß, wo ich effizienten Code finden kann, der den Job erledigt. – Alex