2016-10-31 8 views
0

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

Я загрузил скриншот для некоторой визуальной помощи :-) 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); 

     } 

    } 

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

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

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.

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

+0

Поскольку вы уже рассчитали границы, вы можете попытаться использовать \t ViewportExtensions.ZoomExtents (myViewport, bounds, 200) – SigiN

+0

Привет, SigiN, я пробовал это уже, но расширение все еще испортилось, я только что проверил его снова. Однако во время отладки я заметил, что минимальные и максимальные значения границ довольно странные. Одно значение каждой пары (мин. <-> max) всегда равно 0, а другое - либо положительное, либо отрицательное значение. Возможно ли, что границы возвращают только локальную размерность, а не координаты в отношении глобальной системы координат? Необходимо протестировать это в файлах образцов helixtoolkit. – Daniel

ответ

0

Вы можете попробовать несколько вещей. Сначала убедитесь, что для 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 вы можете установить Zoom самостоятельно, установив свойство ширины камеры.