1

我在 a 中有一个立方体渲染Viewport3D,我需要知道一种方法来确定所有立方体是否对用户可见。

编辑:为了清楚起见,..我不是在谈论剪裁,因为这里的近/远平面距离。我的意思是立方体太高或太宽以适合相机的视野。

任何帮助将不胜感激!

提前致谢。

4

3 回答 3

2

我无法提供解决方案,但也许我可以为您指明正确的方向。

您需要掌握的是立方体在视图平面上的 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;
}
于 2009-04-02T12:22:39.387 回答
1

我记得一个关于翻转码截锥剔除的教程。

Flipcode - 截锥体剔除

我希望它有所帮助。

于 2009-04-06T22:56:08.403 回答
0

我可以考虑做类似的事情:

检查与相机相关的立方体的最近点,并检查它是否从近剪裁平面剪裁。我能想到的离相机最近的点是构成立方体的点之一。因此,您必须检查立方体的 6 个点中的每一个,并检查它们是否被剪裁。如果它们都不是,那么您的立方体是否完全可见哦,显然您还必须检查远剪切平面。

代码很简单:

for each point of cube do
    if !(point is in farClippingPlane and nearClippingPlane)
       return false;
    end if
end for
return true
于 2009-04-02T12:04:50.833 回答