WPF 3D - определите, обрезается ли ModelVisual3D внутри его Viewport3D

У меня есть рендеринг куба внутри Viewport3D, и мне нужно знать, как узнать, виден ли пользователю ВЕСЬ куб.

Правка: просто для ясности... я не говорю об отсечении из-за ближнего/дальнего плоскостного расстояния. Я имею в виду, что куб слишком высок или широк, чтобы поместиться в поле зрения камеры.

Любая помощь будет принята с благодарностью!

Заранее спасибо.


person EightyOne Unite    schedule 02.04.2009    source источник


Ответы (3)


Я не могу предложить решение, но я могу, возможно, указать вам правильное направление.

Что вам нужно получить, так это размер 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;
}
person ChrisF    schedule 02.04.2009

Я помню туториал по отсечению усеченной пирамиды на флипкоде.

Flipcode — Отбор усеченного конуса

Я надеюсь, что это помогает.

person Stefan Schmidt    schedule 06.04.2009

Я могу подумать о том, чтобы сделать что-то подобное:

Проверьте ближайшую точку куба, связанную с камерой, и убедитесь, что она отсекается от ближней плоскости отсечения. Ближайшая точка от камеры, о которой я могу думать, - это одна из этих точек, составляющих куб. Таким образом, вы должны проверить каждую из 6 точек куба и проверить, обрезаются ли они. Если ни один из них не виден, то ваш куб полностью виден. О, и, очевидно, вы также должны проверить дальнюю плоскость отсечения.

Код прост:

for each point of cube do
    if !(point is in farClippingPlane and nearClippingPlane)
       return false;
    end if
end for
return true
person Edison Gustavo Muenz    schedule 02.04.2009
comment
Извините, я, вероятно, должен был добавить, что я имел в виду 2D-отсечение, поскольку прямоугольный параллелепипед слишком высок для окна просмотра. Спасибо хоть - person EightyOne Unite; 02.04.2009