0

我正在使用Viewport3DX具有许多不同MeshGeometryModel3D元素的 a 。用户界面集成了一个滑块,该滑块将更新PhongMaterials所有 model3d 元素的不透明度(的 alpha 值)。

这是我当前对更新不透明度的代码的实现:

几何处理程序.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;
             
           }

       }

主窗口.xaml.cs

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

每次滑块的值发生变化时,都会调用该UpdateOpacity函数,遍历MeshGeometryModel3D元素字典并更新其材质。

我尝试了许多不同的版本,但最终这是完成这项工作的唯一实现。然而,即使在发布模式下,更新也非常缓慢且“滞后”。

我认识到两件事:

  • 我必须克隆现有的材质,更新它并重新分配它以使材质在视口中发生变化

  • 我不能直接设置 alpha 属性Diffusecolor,而是实例化一个新的颜色对象

有人知道瓶颈可能在哪里吗?是材料的克隆、新颜色的实例化还是两者兼而有之?还是完全不同的东西?有没有更好的更新方法?很想听听你的建议。已经非常感谢了!

4

1 回答 1

1

我将在此处引用我的评论,以便我们可以结束这个问题。

您是否使用“ValueChanged”事件来触发 UpdateOpacity?当用户完成拖动滑块时,您可能只想查看更新不透明度:social.msdn.microsoft.com/Forums/vstudio/en-US/...。我唯一的其他建议是尝试将具有相同基色的元素组合/组合在一起,因此不透明度更新所需的材料更改更少。

...

msdn.microsoft.com/en-us/library/bb613553.aspx

于 2017-03-28T02:57:49.810 回答