WPF 3D - それはViewport3Dだ内ModelVisual3DがクリップされているかどうかDetirmine
-
22-08-2019 - |
質問
私はViewport3D
内部キューブのレンダリングを持っていると私は、キューブのすべてがユーザーに表示されるかどうかを調べるための方法を知っておく必要があります。
の編集:だけ明確にするために、..私はので、ここで近距離/遠距離面間隔のクリッピングの話ではありません。私は、キューブビューのカメラフィールドに収まるように背の高いまたはワイドにある意味します。の
すべてのヘルプは大規模いただければ幸いです!
事前に感謝します。
解決
私は解決策を提供することはできませんが、私は、おそらく、正しい方向にあなたを指すことができます。
あなたはビュー平面上の立方体の2D投影の範囲であるのホールドを取得するために必要なもの。その後、キューブの全体が表示されているかどうかを確認するために最小値と最大値X&Yの値の簡単なチェックを行うことができます。
程度まで許容因子を追加する任意の丸め誤差の世話をします。
編集:私はちょうど「2D投影WPF」とこのリンクのためのGoogle検索を行っています>思い付きました。それはあなたが何をしたいアドレスのように見えます。
FURTHER編集:私はここで上記のリンクからコードの該当部分をコピーした
。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;
}
他のヒント
私はこれに似た何かを考えることができます:
カメラに関連したキューブの最も近い点をチェックして、ニアクリッピング面からクリッピングされていないか確認してください。 私は考えることができるカメラから最も近い点は、立方体を構成する。この点の一つです。だから、立方体の6点の各々をチェックし、それらがクリッピングされているかどうかを確認する必要があります。それらのどれもあなたのキューブがあれば、その後、完全に表示されていない場合 ああ、明らかにあなたはあまりにも遠くクリッピング平面に対してチェックする必要があります。
のコードは単純です:
for each point of cube do
if !(point is in farClippingPlane and nearClippingPlane)
return false;
end if
end for
return true