我在 a 中有一个立方体渲染Viewport3D
,我需要知道一种方法来确定所有立方体是否对用户可见。
编辑:为了清楚起见,..我不是在谈论剪裁,因为这里的近/远平面距离。我的意思是立方体太高或太宽以适合相机的视野。
任何帮助将不胜感激!
提前致谢。
我在 a 中有一个立方体渲染Viewport3D
,我需要知道一种方法来确定所有立方体是否对用户可见。
编辑:为了清楚起见,..我不是在谈论剪裁,因为这里的近/远平面距离。我的意思是立方体太高或太宽以适合相机的视野。
任何帮助将不胜感激!
提前致谢。
我无法提供解决方案,但也许我可以为您指明正确的方向。
您需要掌握的是立方体在视图平面上的 2D 投影范围。然后,您可以对最小和最大 X 和 Y 值进行简单检查,以查看整个立方体是否可见。
在范围内添加容差因子将处理任何舍入误差。
编辑:我刚刚在 Google 上搜索了“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