2009-04-02 18 views
2

サイズがXMLからインポートされる立方体があるので、モデルのサイズにかかわらず、カメラは常にそのすべてを見ることができるようにする必要があります。これはプレビュー用です。わかりやすくするために、スケールを上に表示するキャプションをレンダリングします。WPF 3D - ModelVisual3Dをカメラの視野に合わせますか?

私は、ModelVisual3DがカメラのFieldOfViewの境界内に入るかどうか、あるいはViewPort3D自体の中に入るかどうかを教えてくれる機能が必要だと思います。

これまでのところ、次元プロパティが変更された場合、静的コールバック(次元プロパティはDependencyPropertyです)があります。現時点ではかなり原油ですが、私が見ているアイデアを得ることができます。コメントアウトセクションでは、誰もがコメントアウトセクションでは、私は永遠に感謝するだろうでどこに行くべきかを知っている場合、私は

private static void OnCubeDimensionsChanged(DependencyObject d, DependencyPropertyChangedEventArgs e) 
    { 
     if (!valueSemaphore) 
     { 
      //while(mainModel.WillClip(mainCamera)) 
      //{ 
      //  mainCamera.FieldOfView--; 
      //} 

      valueSemaphore = true; 
      double propertyValue = 0.0; 
      Product3D p = d as Product3D; 

      switch (e.Property.Name) 
      { 
       case "CubeHeight": 
        propertyValue = (double.Parse(e.NewValue.ToString())/100) * 8; 
        p.CubeHeight = propertyValue; 
        break; 
       case "CubeWidth": 
        propertyValue = (double.Parse(e.NewValue.ToString())/100) * 5.3; 
        p.CubeWidth = propertyValue; 
        break; 
       case "CubeDepth": 
        propertyValue = (double.Parse(e.NewValue.ToString())/100) * 2.6; 
        p.CubeDepth = propertyValue; 
        break; 
      } 
      valueSemaphore = false; 
     } 
    } 

探しているロジックの種類を大まかに示しています。
ありがとうございます。

+0

http://stackoverflow.com/questions/709368/wpf-3d-detirmine-whether-a-modelvisual3d-is-being-clipped-inside-its-viewport3はそれがないとこれは同じです? – ChrisF

答えて

3

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

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

私はhereのコードの関連セクションに見えるものをコピーしました。それに応じて、ビューポートのサイズを設定することができます。

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); 
       } 
      } 
     } 
    } 
関連する問題