2009-04-02 10 views
1

私はViewport3Dの中にキューブレンダリングをしていますので、すべてのキューブがユーザに見えるかどうかを知る方法を知る必要があります。WPF 3D - ModelVisual3DがViewport3D内でクリップされているかどうか確認してください

編集:ちょうど明確にするために、私はここに近い/遠い飛行機の距離のためにクリッピングについて話していません。私は、立方体がカメラの視野に収まるように背の高さや幅があることを意味します。

大変お手伝いをいたします。

ありがとうございます。

答えて

2

私は解決策を提供することはできませんが、私は、おそらく、正しい方向にあなたを指すことができます。

保持する必要があるのは、ビュープレーン上のキューブの2次元投影の範囲です。次に、最小値と最大値X &のY値を単純にチェックして、キューブ全体が表示されているかどうかを確認できます。

エクステントに余裕度を追加すると、丸め誤差が処理されます。

編集:「2D投影WPF」のGoogle検索を行ったばかりで、このlinkが表示されました。それはあなたが望むものを扱うように見えます。

さらに編集:上記のリンクから関連するコードセクションをここにコピーしました。

public static Rect Get2DBoundingBox(ModelVisual3D mv3d) 
{ 
    bool bOK; 

    Matrix3D m = MathUtils.TryWorldToViewportTransform(vpv, out bOK); 

    bool bFirst = true;  
    Rect r = new Rect(); 

    if (mv3d.Content is GeometryModel3D) 
    { 
     GeometryModel3D gm3d = (GeometryModel3D) mv3d.Content; 

     if (gm3d.Geometry is MeshGeometry3D) 
     { 
      MeshGeometry3D mg3d = (MeshGeometry3D)gm3d.Geometry; 

      foreach (Point3D p3d in mg3d.Positions) 
      { 
       Point3D pb = m.Transform(p3d); 
       Point p2d = new Point(pb.X, pb.Y); 
       if (bFirst) 
       { 
        r = new Rect(p2d, new Size(1, 1)); 
        bFirst = false; 
       } 
       else 
       { 
        r.Union(p2d); 
       } 
      } 
     } 
    } 

    return r; 
} 
0

私はこれに似た何かを考えることができます:

はカメラに関連したキューブの最も近い点をチェックして、ニアクリッピング面からクリッピングされていないか確認してください。 私が考えることができる最も近い点は、立方体を構成するこの点の1つです。だから、あなたはキューブの6つの点のそれぞれをチェックし、それらがクリッピングされているかどうかを確認する必要があります。それらのどれもがない場合は、完全に表示されている場合はあなたのキューブ ああ、明らかに遠いクリッピング面に対してもチェックする必要があります。

コードは単純です:

for each point of cube do 
    if !(point is in farClippingPlane and nearClippingPlane) 
     return false; 
    end if 
end for 
return true 
+0

申し訳ありませんが、私はおそらく、2Dのクリッピングが直方体のようにビューポートには大きすぎると付け加えました。ありがとう – Stimul8d

1

私はフリップコードの切頭円錐のチュートリアルを覚えています。

Flipcode - Frustum Culling

私はそれが役に立てば幸い。

関連する問題