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

StackOverflow https://stackoverflow.com/questions/709368

Вопрос

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

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

Любая помощь будет оценена по достоинству!

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

Это было полезно?

Решение

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

Что вам нужно, так это размер 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;
}

Другие советы

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

Flipcode — отсечение усеченной пирамиды

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

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

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

Код прост:

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