更新model3d元素颜色的有效方法

时间:2016-11-11 21:35:56

标签: sharpdx helix-3d-toolkit

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

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

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元素的字典并更新其材质。

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

我认识到两件事:

  • 我必须克隆现有材料,更新并重新分配,以便在视口中更改材料

  • 我无法直接设置Diffusecolor的alpha-property,而是实例化一个新的颜色对象

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

1 个答案:

答案 0 :(得分:1)

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

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

...

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