2010-12-13 9 views
5

J'ai une application avec des objets 3D qui résident dans Viewport3D et je veux que l'utilisateur puisse les sélectionner en faisant glisser un rectangle sur l'écran.wpf3d rectangle hit test

J'ai essayé d'appliquer GeometryHitTestParameters (avec une géométrie de rectangle) sur le Viewport3D afin d'obtenir les résultats, mais une exception m'indique qu'il n'est pas associé à Viewport3D. Seuls les points PointHitTestParameters sont pris en charge.

Quelqu'un connaît-il une façon élégante de le faire, sauf de le calculer moi-même (par exemple - projeter tous les objets 3D en 2D et faire des intersections de géométrie manuelle avec un rectangle)?

+0

Avez-vous essayé l'approche de ce lien? http://blogs.msdn.com/b/wpf3d/archive/2009/05/18/3d-hit-testing.aspx –

+0

Bien sûr. C'est l'approche connue pour les tests d'atteinte de points/rayons. Je suis à la recherche d'un hit-test rectangle. Ce n'est pas une partie intégrante du cadre, mais peut-être quelqu'un sait comment je peux utiliser le cadre pour accomplir ma tâche avec élégance. De toute façon, GeometryHitTestParameters ne fonctionne pas sur Viewport3D. Par conséquent, je ne peux pas l'utiliser pour mes tests de rectangle. – Alex

Répondre

0

Je doute qu'il y ait de meilleur moyen que itérer points de rectangle sélectionné:

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 How to: Hit Test in a Viewport3D

+1

Bien sûr qu'il y a. Par exemple, calculer manuellement le tronc de visionnement à l'aide des paramètres de la caméra, puis parcourir manuellement l'arbre visuel et effectuer un test de confinement modèle contre tronc. La haute vitesse peut être réalisée en utilisant des boîtes de délimitation. Mais cela réinvente la roue. Ils le font déjà avec des tests d'impact basés sur des rayons dans WPF. La seule différence est que le test d'intersection est un modèle de rayon et non un modèle de tronc de cône. Je n'ai pas été capable de trouver un code de travail pour ce scénario sur le web et je pensais que quelqu'un ici sait où je peux trouver un code efficace qui fait le travail. – Alex