2010-12-13 25 views
5

Tôi có một ứng dụng với các đối tượng 3D nằm trong Viewport3D và tôi muốn người dùng có thể chọn chúng bằng cách kéo một hình chữ nhật trên màn hình.wpf3d rectangle hit test

Tôi đã thử áp dụng GeometryHitTestParameters (với hình chữ nhật hình học) trên Viewport3D để có được kết quả, nhưng tôi nhận được một ngoại lệ nói với tôi rằng nó unsuppoted với Viewport3D. Chỉ PointHitTestParameters được hỗ trợ.

Không ai biết cách nào để làm điều đó, ngoại trừ việc tính toán chính nó (ví dụ - chiếu tất cả các đối tượng 3D sang 2D và thực hiện các giao điểm hình học thủ công với hình chữ nhật)?

+0

Bạn đã thử các cách tiếp cận từ liên kết này? http://blogs.msdn.com/b/wpf3d/archive/2009/05/18/3d-hit-testing.aspx –

+0

Tất nhiên. Đây là cách tiếp cận được biết đến để kiểm tra điểm/tia. Tôi đang tìm kiếm thử nghiệm hit hình chữ nhật. Nó không phải là một phần tích hợp của khuôn khổ, nhưng có lẽ ai đó biết cách tôi có thể sử dụng khung làm việc để đạt được mục tiêu của mình một cách tao nhã. Dù sao, GeometryHitTestParameters không hoạt động trên Viewport3D. Vì vậy tôi không thể sử dụng nó để thử nghiệm hit hình chữ nhật của tôi. – Alex

Trả lời

0

tôi nghi ngờ có cách tốt hơn so với iterating qua điểm hình chữ nhật được chọn:

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

Xem MSDN How to: Hit Test in a Viewport3D

+1

Tất nhiên là có. Ví dụ, tính toán mức độ xem theo cách thủ công bằng cách sử dụng thông số máy ảnh và sau đó di chuyển ngang qua cây thị giác theo cách thủ công và thực hiện kiểm tra ngăn chặn mô hình chống lại sự thất vọng. Tốc độ cao có thể đạt được bằng cách sử dụng các hộp giới hạn. Nhưng đây là sáng tạo lại bánh xe. Họ đã làm nó với thử nghiệm hit dựa trên tia bên trong WPF. Sự khác biệt duy nhất là kiểm tra giao lộ là mô hình tia và không phải là mô hình thất vọng. Tôi không thể tìm thấy mã hoạt động cho kịch bản này trên web và tôi nghĩ ai đó ở đây biết nơi tôi có thể tìm thấy mã hiệu quả thực hiện công việc. – Alex