【问题标题】:How to zoom to a model in a helix-toolkit sharpdx viewport?如何在 helix-toolkit sharpdx 视口中缩放到模型?
【发布时间】:2016-11-24 15:20:21
【问题描述】:

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

我为一些视觉辅助上传了一个屏幕截图 :-) 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() 方法不适合我吗? 如果没有,也许有更复杂的 hack xD 的建议。

我是一名初级开发人员,因此我愿意接受任何 cmet 的改进,谢谢。

【问题讨论】:

  • 既然你已经计算了边界,你可以尝试使用 ViewportExtensions.ZoomExtents(myViewport, bounds, 200)
  • 嗨 SigiN,我已经试过了,但扩展仍然搞砸了,我又检查了一遍。但是,在调试时,我注意到边界的最小值和最大值非常奇怪。每对中的一个值( min max )始终为 0,而另一个是正值或负值。边界是否有可能只返回局部维度,而不是关于全局坐标系的坐标?还需要在 helixtoolkit 示例文件中对此进行测试。

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


【解决方案1】:

您可以尝试一些方法。首先确保您的视口上的 IsZoomEnabled 和 ZoomExtentsWhenLoaded 设置为 true。 你可以自己计算边界,对于很多 MeshModels 这将是一个bootleneck,但对于几何图形来说就足够了。

            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,您可以通过设置相机的 width 属性自行设置 Zoom。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-26
    • 2012-12-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多