Как увеличить модель в окне просмотра helix-toolkit sharpdx?

Следующая настройка: у меня есть приложение с двумя окнами просмотра. При выборе элемента на основном видовом экране копия геометрии модели должна отображаться увеличенной во втором видовом экране.

Я загрузил скриншот для наглядности :-) http://imgur.com/ILG8Ylk

Мой подход к этому (среди прочего) заключается в использовании метода ZoomExtents:

MainViewModel.cs

    public void SetDetailedModelGeometry(MeshGeometryModel3D geometry)
    {

        MyDetailedModel = new Element3DCollection();
        MyModelViewportDetailed.Reset();

        if (geometry != null)
        {
            var bounds = geometry.Bounds;

            //var rec = new Rect3D(bounds.Minimum.X, bounds.Minimum.Y, bounds.Minimum.Z, bounds.Maximum.X,bounds.Maximum.Y,bounds.Maximum.Z);

            this.MyDetailedModel.Add(geometry);
            MyDetailedModel[0].Attach(MyModelViewportDetailed.RenderHost);

            this.OnPropertyChanged("MyDetailedModel");

            MyModelViewportDetailed.ZoomExtents();
            //MyModelViewportDetailed.ZoomExtents(rec);

        }

    }

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

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

    public void SetDetailedModelGeometry(MeshGeometryModel3D geometry)
    {

        MyDetailedModel = new Element3DCollection();
        MyModelViewportDetailed.Reset();

        if (geometry != null)
        {

            var bounds = geometry.Bounds;
            var rec = new Rect3D( bounds.Minimum.X, bounds.Minimum.Y, bounds.Minimum.Z,  bounds.Maximum.X, bounds.Maximum.Y, bounds.Maximum.Z);
            // move model 

            var delta = new Point3D(Math.Abs(bounds.Maximum.X - bounds.Minimum.X), Math.Abs(bounds.Maximum.Y - bounds.Minimum.Y), Math.Abs(bounds.Maximum.Z - bounds.Minimum.Z));
            var center = new Point3D(bounds.Minimum.X+delta.X, bounds.Minimum.Y+delta.Y, bounds.Minimum.Z+delta.Z);

            TransformDetailed = new TranslateTransform3D(-center.X,-center.Y,-center.Z);
            geometry.Transform = TransformDetailed;

            // notice property change
            this.MyDetailedModel.Add(geometry);
            MyDetailedModel[0].Attach(MyModelViewportDetailed.RenderHost);

            this.OnPropertyChanged("MyDetailedModel");

            MyModelViewportDetailed.ZoomExtents();
            MyModelViewportDetailed.CameraController.AddZoomForce(-1.0);


        }

Кто-нибудь знает, почему у меня не работает метод zoomExtends()? А если нет, может быть, есть предложения по более сложному хаку xD.

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


person Daniel    schedule 31.10.2016    source источник
comment
Поскольку вы уже рассчитали границы, вы можете попробовать использовать ViewportExtensions.ZoomExtents(myViewport, bounds, 200)   -  person SigiN    schedule 23.11.2016
comment
Привет, SigiN, я уже пробовал это, но расширение все еще испорчено, я только что проверил это еще раз. Однако во время отладки я заметил, что минимальное и максимальное значения границ довольно странные. Одно значение каждой пары (min ‹-› max) всегда равно 0, а другое — либо положительное, либо отрицательное значение. Возможно ли, что границы возвращают только локальный размер, а не координаты относительно глобальной системы координат? Необходимо также проверить это в файлах примеров helixtoolkit.   -  person Daniel    schedule 23.11.2016


Ответы (1)


Вы можете попробовать несколько вещей. Сначала убедитесь, что для IsZoomEnabled и ZoomExtentsWhenLoaded в вашем окне просмотра установлено значение true. Вы можете рассчитать границы самостоятельно, для многих MeshModels это будет узким местом, но только для Geometry этого будет достаточно.

            var mx= (this.ModelGeometry[0] as MeshGeometryModel3D).Geometry.Positions.Min(item => item.X);
            var my = (this.ModelGeometry[0] as MeshGeometryModel3D).Geometry.Positions.Min(item => item.Y);
            var mz = (this.ModelGeometry[0] as MeshGeometryModel3D).Geometry.Positions.Min(item => item.Z);
            BoundingBox bounds = new BoundingBox(new Vector3(mx, my, mz), new Vector3(x, y, z));

Еще одна подсказка: у меня была небольшая проблема с синхронизацией в моем приложении, я загружал и прикреплял файлы шагов с 10000++ MeshModels, и перед вызовом ZoomExtends мне пришлось ждать около 100 мс. Вы можете сделать это с помощью таймера или задержки задачи.

Я вижу, вы используете PerspectiveCamera. С помощью OrthotraphicCamera вы можете установить масштаб самостоятельно, установив свойство ширины камеры.

person SigiN    schedule 24.11.2016