WPF 3D - вписать ModelVisual3D в поле зрения камеры?

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

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

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

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

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


person EightyOne Unite    schedule 02.04.2009    source источник
comment
Это то же самое, что и stackoverflow.com/questions/709368/, не так ли?   -  person ChrisF    schedule 03.04.2009


Ответы (1)


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