我在Viewport3D
内有一个立方体渲染,我需要知道一种方法来确定用户是否可以看到所有立方体。
编辑:为了清楚起见,我不是在谈论裁剪因为这里的近/远飞机距离。我的意思是立方体要高或宽以适应摄像机视野。
任何帮助都会受到大力赞赏!
提前致谢。
答案 0 :(得分:2)
我无法提供解决方案,但我或许可以指出正确的方向。
您需要掌握的是立方体在视图平面上的2D投影范围。然后,您可以对最小和最大X& Y值以查看整个多维数据集是否可见。
在范围内添加容差因子将处理任何舍入错误。
编辑:我刚刚完成了Google搜索“2D投影WPF”并且出现了link。看起来它可以解决你想要的问题。进一步编辑:我在这里复制了上述链接的相关代码部分。
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 :(得分:1)
答案 2 :(得分:0)
我可以想到做类似的事情:
检查与相机相关的立方体的最近点,并检查它是否从近剪裁平面剪切。 我能想到的距离相机最近的点就是组成立方体的这一点。因此,您必须检查多维数据集的6个点中的每个点,并检查它们是否被剪裁。如果它们都不是,那么你的立方体是完全可见的 哦,显然你也必须检查远剪裁平面。
代码很简单:
for each point of cube do
if !(point is in farClippingPlane and nearClippingPlane)
return false;
end if
end for
return true