WPF 3D - Установите ModelVisual3D в поле зрения камеры? - PullRequest
2 голосов
/ 02 апреля 2009

У меня есть кубоид, размеры которого импортируются из XML, поэтому мне нужно быть уверенным, что независимо от размера модели камера всегда может видеть все это. Это для предварительного просмотра. Скорее всего, я нарисую заголовок сверху, показывающий шкалу для ясности.

Я думаю, что мне нужна какая-то функция, которая скажет мне, подходит ли ModelVisual3D в пределах FieldOfView камеры или, возможно, самого ViewPort3D.

Пока у меня есть статический обратный вызов (свойства измерения DependencyProperty s), когда свойства измерений изменяются, как указано ниже. Это довольно грубо в данный момент, но вы поняли, на что я смотрю. В закомментированном разделе показано, какую именно логику я ищу

    private static void OnCubeDimensionsChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
    {
        if (!valueSemaphore)
        {
            //while(mainModel.WillClip(mainCamera))
            //{
            //     mainCamera.FieldOfView--;
            //}

            valueSemaphore = true;
            double propertyValue = 0.0;
            Product3D p = d as Product3D;

            switch (e.Property.Name)
            {
                case "CubeHeight":
                    propertyValue = (double.Parse(e.NewValue.ToString()) / 100) * 8;
                    p.CubeHeight = propertyValue;
                    break;
                case "CubeWidth":
                    propertyValue = (double.Parse(e.NewValue.ToString()) / 100) * 5.3;
                    p.CubeWidth = propertyValue;
                    break;
                case "CubeDepth":
                    propertyValue = (double.Parse(e.NewValue.ToString()) / 100) * 2.6;
                    p.CubeDepth = propertyValue;
                    break;
            }
            valueSemaphore = false;
        }
    }

Если кто-нибудь знает, что должно быть в закомментированном разделе, я буду вечно благодарен.
Заранее спасибо.

1 Ответ

3 голосов
/ 03 апреля 2009

То, что вам нужно, - это степень 2D-проекции куба на плоскость вида. Затем вы можете просто проверить минимальное и максимальное значения X & Y, чтобы увидеть, виден ли весь куб.

Добавление допускового коэффициента в степень позволит устранить любые ошибки округления.

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

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);
                }
            }
        }
    }
...