Вопрос

У меня есть кубоид, размеры которого импортированы из 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;
        }
    }

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

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

Решение

Что вам нужно, так это размер 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);
                }
            }
        }
    }
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top