我有一个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;
}

其他提示

记得上flipcode域剔除的教程。

Flipcode - 域剔除

我希望它能帮助。

我能想到做类似的东西这一点:

检查与相机有关的立方体的最近点,并检查它是否正从近裁剪平面裁剪。 从相机,我能想到的最近点是这样的点组成的立方体的一个。所以,你必须检查每个立方体的6分,并检查它们是否被修剪。如果他们都不是,那么你的立方体,如果完全可见 哦,很明显,你必须要检查的远裁剪平面了。

的代码很简单:

for each point of cube do
    if !(point is in farClippingPlane and nearClippingPlane)
       return false;
    end if
end for
return true
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top