如何在helix-toolkit sharpdx视口中缩放到模型?

时间:2016-10-31 11:04:25

标签: c# wpf 3d viewport helix-3d-toolkit

以下设置:我有一个带有两个视口的应用程序。在主视口上选择元素时,应该在第二个视口中放大显示模型几何体的副本。

我上传了一些视觉辅助的截图:-) 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的建议。

我是初级开发人员,所以我愿意接受任何改进意见,谢谢。

1 个答案:

答案 0 :(得分:0)

你可以尝试一些事情。首先确保视口上的IsZoomEnabled和ZoomExtentsWhenLoaded设置为true。 您可以通过yourselft计算Bounds,对于很多关闭MeshModel,这将是一个bootleneck,但仅仅在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 ++ MeshModel的步骤文件,在调用ZoomExtends之前我不得不等待大约100毫秒。您可以通过计时器或任务延迟来完成此操作。

我看到你正在使用PerspectiveCamera。通过OrthotraphicCamera,您可以通过设置相机的宽度属性来自行设置缩放。