2010-12-13 6 views
5

私は、Viewport3Dにある3Dオブジェクトを持つアプリケーションを持っており、ユーザーが画面上で長方形をドラッグして選択できるようにしたいと考えています。wpf3d長方形ヒットテスト

Viewport3DにGeometryHitTestParameters(矩形ジオメトリ)を適用して結果を取得しようとしましたが、Viewport3Dで補完されていないという例外が表示されます。 PointHitTestParametersのみがサポートされています。

私はそれを自分で計算することを除いて(例えば、すべての3Dオブジェクトを2Dに投影して、四角形と手動の幾何学的な交差を行うなど)、それを行うためのエレガントな方法は誰も知っていませんか?

+0

を参照してくださいあなたは、このリンクからのアプローチを試みたことがありますか? http://blogs.msdn.com/b/wpf3d/archive/2009/05/18/3d-hit-testing.aspx –

+0

もちろん。これは、ポイント/レイヒットテストのための既知のアプローチです。私は長方形ヒットテストを探しています。それはフレームワークの統合された部分ではありませんが、私の仕事をうまく実現するためにフレームワークをどのように使うことができるかを誰かが知っているかもしれません。 とにかく、GeometryHitTestParametersはViewport3Dでは機能しません。したがって、私は長方形ヒットテストには使用できません。 – Alex

答えて

0

私は、選択した矩形のポイントを反復処理するより良い方法がある疑う:

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

もちろんあります。例えば、カメラパラメータを使用して視錐台を手動で計算し、次に手動で視覚ツリーを横断し、モデル対視錐台封じ込め検査を実行する。バウンディングボックスを使用して高速を達成できます。 しかし、これはホイールを再発明しています。彼らはすでにWPFの中でレイベースのヒットテストを行っています。唯一の違いは、交差テストは、光線モデルであり、錐台モデルではないことです。 ウェブ上でこのシナリオの作業コードが見つかりませんでした。ここで誰かが効率的なコードを見つけることができます。 – Alex