2010-12-13 10 views
5

Tengo una aplicación con objetos 3D que residen en Viewport3D y quiero que el usuario pueda seleccionarlos arrastrando un rectángulo en la pantalla.prueba de impacto del rectángulo wpf3d

Intenté aplicar GeometryHitTestParameters (con geometría de rectángulo) en Viewport3D para obtener los resultados, pero recibo una excepción diciéndome que no se ha extraído con Viewport3D. Solo PointHitTestParameters son compatibles.

¿Alguien sabe alguna forma elegante de hacerlo, excepto calcularlo yo mismo (por ejemplo, ¿proyectando todos los objetos 3D a 2D y haciendo intersecciones de geometría manual con un rectángulo)?

+0

¿Ha probado el enfoque de este enlace? http://blogs.msdn.com/b/wpf3d/archive/2009/05/18/3d-hit-testing.aspx –

+0

Por supuesto. Este es el enfoque conocido para la prueba de golpe de punto/rayo. Estoy buscando pruebas de golpes rectangulares. No es una parte integrada del marco, pero tal vez alguien sepa cómo puedo usar el marco para lograr mi tarea elegantemente. De todos modos, GeometryHitTestParameters no funciona en Viewport3D. Por lo tanto, no puedo usarlo para mi prueba de impacto rectangular. – Alex

Respuesta

0

Dudo que haya mejor manera que iteración a través de puntos rectángulo seleccionado:

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

Ver MSDN How to: Hit Test in a Viewport3D

+1

Por supuesto que hay. Por ejemplo, calcular manualmente el tronco truncado utilizando los parámetros de la cámara, y luego atravesar manualmente el árbol visual y realizar una prueba de contención modelo contra frustum. Se puede lograr alta velocidad usando cuadros delimitadores. Pero esto es reinventar la rueda. Ya lo están haciendo con pruebas de impacto basadas en rayos dentro de WPF. La única diferencia es que la prueba de intersección es modelo de rayo y no modelo trunco. No pude encontrar un código de trabajo para este escenario en la web y pensé que alguien aquí sabe dónde puedo encontrar un código eficiente que haga el trabajo. – Alex

Cuestiones relacionadas