2016-10-31 8 views
0

다음 설정 : 두 개의 뷰포트가있는 응용 프로그램이 있습니다. 기본 뷰포트에서 요소를 선택하면 모델 형상의 복사본이 두 번째 뷰포트에 확대 표시됩니다. 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에 대한 더 복잡한 해킹을 제안 할 수 있습니다.

저는 중학교 개발자이므로 개선을 위해 의견을 보내 주셔서 감사합니다.

+0

이미 사용 범위를 계산 했으므로 \t ViewportExtensions.ZoomExtents (myViewport, bounds, 200) – SigiN

+0

안녕하세요. SigiN 님, 이미 시도했지만 확장이 여전히 엉망입니다. 방금 다시 확인했습니다. 그러나 디버깅하는 동안 경계의 최소 및 최대 값이 매우 이상하다는 사실을 확인했습니다. 각 쌍의 한 값 (최소 <-> 최대 값)은 항상 0이고 다른 하나는 양수 또는 음수 값입니다. 경계가 글로벌 차원의 좌표계가 아닌 로컬 차원 만 반환 할 수 있습니까? helixtoolkit 샘플 파일에서도이를 테스트해야합니다. – Daniel

답변

0

몇 가지 시도해 볼 수 있습니다. 먼저 뷰포트의 IsZoomEnabled 및 ZoomExtentsWhenLoaded가 true로 설정되어 있는지 확인하십시오. Yourres에 의해 Bounds를 계산할 수 있습니다. MeshModels에서 많이 벗어나기 때문에 부트 로크가되지만 기하학만으로는 충분합니다.

  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를 통해 카메라의 너비 속성을 설정하여 확대/축소를 직접 설정할 수 있습니다.