0

次のセットアップ: 2 つのビューポートを持つアプリケーションがあります。メイン ビューポートで要素を選択すると、モデル ジオメトリのコピーが 2 番目のビューポートに拡大表示されるはずです。

視覚補助用にスクリーンショットをアップロードしました :-) 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 の提案があるかもしれません。

私はかなりのジュニア開発者なので、改善のためのコメントをお待ちしております。ありがとうございます。

4

1 に答える 1

0

いくつかのことを試すことができます。まず、ビューポートの IsZoomEnabled と ZoomExtentsWhenLoaded が true に設定されていることを確認します。Bounds は自分で計算できます。多くの MeshModel では、これはブートルネックになりますが、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));

もう 1 つのヒントとして、アプリケーションで小さなタイミングの問題がありました。10000++ MeshModels を含むステップ ファイルをロードしてアタッチしていましたが、ZoomExtends を呼び出す前に 100 ミリ秒待たなければなりませんでした。これは、タイマーまたはタスクの遅延を介して行うことができます。

PerspectiveCamera を使用しているようです。OrthotraphicCamera を介して、カメラの width プロパティを設定することで、Zoom を自分で設定できます。

于 2016-11-24T07:20:21.063 に答える