内部に立方体をレンダリングしていますがViewport3D
、すべての立方体がユーザーに表示されているかどうかを確認する方法を知る必要があります。
編集:明確にするために、..ここでは、近距離/遠距離の平面距離のため、クリッピングについて話しているわけではありません。カメラの視野に収まるには、立方体が高すぎたり広すぎたりするということです。
どんな助けでも大歓迎です!
前もって感謝します。
内部に立方体をレンダリングしていますがViewport3D
、すべての立方体がユーザーに表示されているかどうかを確認する方法を知る必要があります。
編集:明確にするために、..ここでは、近距離/遠距離の平面距離のため、クリッピングについて話しているわけではありません。カメラの視野に収まるには、立方体が高すぎたり広すぎたりするということです。
どんな助けでも大歓迎です!
前もって感謝します。
解決策を提供することはできませんが、おそらく正しい方向に向けることはできます。
把握する必要があるのは、ビュー プレーン上の立方体の 2D 投影の範囲です。次に、X と Y の最小値と最大値を簡単にチェックして、立方体全体が表示されているかどうかを確認できます。
範囲に許容係数を追加すると、丸め誤差が処理されます。
編集:「2D プロジェクション WPF」の Google 検索を行ったところ、このリンクが表示されました。ご希望の内容に対応しているようです。
さらに編集: 上記のリンクからコードの関連セクションをコピーしました。
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;
}
私はこれに似た何かをすることを考えることができます:
カメラに関連する立方体の最も近いポイントを確認し、近くのクリッピング平面からクリップされているかどうかを確認します。私が考えることができるカメラからの最も近い点は、立方体を構成するこの点の1つです。したがって、立方体の6つのポイントのそれぞれをチェックし、それらがクリップされているかどうかをチェックする必要があります。それらのどれもそうでない場合、あなたの立方体は完全に見える場合はああ、そして明らかにあなたは遠いクリッピング平面に対してもチェックする必要があります。
コードは単純です:
for each point of cube do
if !(point is in farClippingPlane and nearClippingPlane)
return false;
end if
end for
return true