0

私はViewport3DXさまざまMeshGeometryModel3Dな要素で を使用しています。ユーザー インターフェイスにはPhongMaterials、すべての model3d 要素の不透明度 (のアルファ値) を更新するスライダーが統合されています。

これは、不透明度を更新するコードの現在の実装です。

geometryhandler.cs

       public void UpdateOpacity(double value)
       {

           if (_mainWindow.MyBuildingComponents == null) return;

           foreach (var component in _mainWindow.MyBuildingComponents)
           {

               // assign new material and later assign it back, to get the changes of the material recognized
               var newmaterial = (_meshIdTogeometryModel3D[component.Id].Material as PhongMaterial).Clone();

                // create new DiffusColor because setting the alpha property directly is not possible
               newmaterial.DiffuseColor = new Color4(newmaterial.DiffuseColor.Red, newmaterial.DiffuseColor.Green, newmaterial.DiffuseColor.Blue, (float)value);

               _meshIdTogeometryModel3D[component.Id].Material = newmaterial;
             
           }

       }

MainWindow.xaml.cs

        private void UpdateOpacity(object sender, RoutedPropertyChangedEventArgs<double> e)
        {
            Geometryhandler?.UpdateOpacity(SliderModelOpacity.Value);
        }

このUpdateOpacity関数は、スライダーの値が変化するたびに呼び出され、MeshGeometryModel3D要素のディクショナリを反復処理し、それらのマテリアルを更新します。

私は多くの異なるバージョンを試しましたが、最終的にこれが仕事をした唯一の実装でした. ただし、リリース モードであっても、更新は非常に遅く、「ラグ」があります。

私は2つのことを認識しました:

  • ビューポートでマテリアルを変更するには、既存のマテリアルを複製し、更新して割り当て直す必要がありました。

  • のアルファ プロパティを直接設定することはできませんでしたDiffusecolorが、代わりに新しいカラー オブジェクトをインスタンス化しました。

誰かがボトルネックがどこにあるのか考えていますか? マテリアルのクローン作成、新しい色のインスタンス化、またはその両方ですか? それともまったく違うもの?更新を行うためのより良い方法はありますか? あなたの提案を聞いて興味があります。もう本当にありがとう!

4

1 に答える 1