WPF 3D - Detirmine是否被修剪一ModelVisual3D里面的的Viewport3D
-
22-08-2019 - |
题
我有一个Viewport3D
内立方体的渲染,我需要知道一种方法找出所有的立方体是否对用户可见。
编辑:只是要清楚,..我不是在谈论这里,因为近/远平面距离的剪裁。我的意思是立方体是高或宽,以适应在视场照相机强>
任何帮助,将大规模理解!
预先感谢。
解决方案
我不能提供一个解决方案,但我可以,或许,指向您在正确的方向。
您需要什么得到的是在视图平面立方体的2D投影的程度保持。然后,您可以做的最小和最大X和Y值的简单检查,看看整个立方体是否可见。
添加容许因子的程度将采取任何舍入误差的护理。
编辑:我刚才已经做了谷歌搜索“2D投影WPF”,这链接走了过来。它看起来像它解决了你想要的东西。
进一步编辑:我已经从这里上述链接复制的代码的相关部分
。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
不隶属于 StackOverflow