2010-12-13 23 views
5

Viewport3D'de bulunan 3B nesnelerle ilgili bir uygulamam var ve kullanıcının ekranda bir dikdörtgeni sürükleyerek seçmesini istiyorum.wpf3d dikdörtgen hit testi

Sonuçları almak için ViewSport3D üzerinde GeometryHitTestParameters (dikdörtgen geometri ile) kullanmayı denedim, ancak Viewport3D ile bağlantısız olduğunu söyleyen bir istisna alıyorum. Sadece PointHitTestParameters desteklenmektedir.

Bunu kendim hesaplamak dışında herhangi bir zarif yöntem biliyor mu (örneğin, tüm 3D nesneleri 2B'ye yansıtmak ve bir dikdörtgenle el ile geometri kesişimleri yapmak)?

+0

bu bağlantıdan yaklaşımı denediniz görüyor musunuz? http://blogs.msdn.com/b/wpf3d/archive/2009/05/18/3d-hit-testing.aspx –

+0

Elbette. Bu nokta/ışın çarpma testi için bilinen bir yaklaşımdır. Dikdörtgen vuruş testi arıyorum. Çerçevenin bütünleşik bir parçası değil, belki birileri benim görevimi başarıyla gerçekleştirmek için çerçeveyi nasıl kullanabileceğimi bilir. Yine de, GeometryHitTestParameters, Viewport3D üzerinde çalışmaz. Bu yüzden dikdörtgeni isabet testim için kullanamıyorum. – Alex

cevap

0

seçtiğim dikdörtgen noktalarından yineleme daha iyi bir yol yoktur şüphe:

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

MSDN How to: Hit Test in a Viewport3D

+1

Tabii ki var. Örneğin, kamera parametrelerini kullanarak görüntüleme noktasını manuel olarak hesaplama ve daha sonra görsel ağacı elle geçme ve modele karşı-engelleme sınırlama testi gerçekleştirme. Sınırlayıcı kutular kullanılarak yüksek hız elde edilebilir. Ancak bu, tekerleği yeniden icat ediyor. Onlar zaten WPF içinde ray tabanlı hit testi ile yapıyorlar. Tek fark, kesişme testinin, ışın modelinin değil, ray modelinin olmasıdır. Web'de bu senaryo için bir çalışma kodu bulamadım ve burada birisinin iş yapan etkin kodu nerede bulabileceğimi bildiğini düşündüm. – Alex