WPF 3D - Detirmine是否将ModelVisual3D剪裁在其Viewport3D中

时间:2009-04-02 11:43:22

标签: wpf 3d viewport3d modelvisual3d

我在Viewport3D内有一个立方体渲染,我需要知道一种方法来确定用户是否可以看到所有立方体。

编辑:为了清楚起见,我不是在谈论裁剪因为这里的近/远飞机距离。我的意思是立方体要高或宽以适应摄像机视野。

任何帮助都会受到大力赞赏!

提前致谢。

3 个答案:

答案 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)

我记得有关翻转码的截头剔除的教程。

Flipcode - Frustum Culling

我希望它有所帮助。

答案 2 :(得分:0)

我可以想到做类似的事情:

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

代码很简单:

for each point of cube do
    if !(point is in farClippingPlane and nearClippingPlane)
       return false;
    end if
end for
return true