更新 model3d 元素颜色的有效方法
Efficient way of updating colors of model3d elements
我使用的 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
元素的字典并更新它们的 materials。
我尝试了很多不同的版本,但最后这是唯一能完成这项工作的实现。但是更新速度非常慢 'laggy',即使在发布模式下也是如此。
我认出了两件事:
我必须克隆现有的 material,对其进行更新并将其分配回去,以获取 material 在视口中进行更改
我无法直接设置Diffusecolor
的alpha-属性,而是实例化一个新的颜色对象
有人知道瓶颈在哪里吗?是克隆 material、实例化新颜色还是两者兼而有之?或者完全不同的东西?有没有更好的方法来进行更新?
很想听听你的建议。已经非常感谢了!
我将在这里引用我的评论,这样我们就可以结束这个问题了。
您是否使用 "ValueChanged" 事件来触发 UpdateOpacity?当用户完成拖动滑块时,您可能希望只更新不透明度:social.msdn.microsoft.com/Forums/vstudio/en-US/…。我唯一的其他建议是尝试 combine/group 将具有相同基色的元素放在一起,这样不透明度更新所需的 material 更改就更少了。
...
msdn.microsoft.com/en-us/library/bb613553.aspx
我使用的 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
元素的字典并更新它们的 materials。
我尝试了很多不同的版本,但最后这是唯一能完成这项工作的实现。但是更新速度非常慢 'laggy',即使在发布模式下也是如此。
我认出了两件事:
我必须克隆现有的 material,对其进行更新并将其分配回去,以获取 material 在视口中进行更改
我无法直接设置
Diffusecolor
的alpha-属性,而是实例化一个新的颜色对象
有人知道瓶颈在哪里吗?是克隆 material、实例化新颜色还是两者兼而有之?或者完全不同的东西?有没有更好的方法来进行更新? 很想听听你的建议。已经非常感谢了!
我将在这里引用我的评论,这样我们就可以结束这个问题了。
您是否使用 "ValueChanged" 事件来触发 UpdateOpacity?当用户完成拖动滑块时,您可能希望只更新不透明度:social.msdn.microsoft.com/Forums/vstudio/en-US/…。我唯一的其他建议是尝试 combine/group 将具有相同基色的元素放在一起,这样不透明度更新所需的 material 更改就更少了。
...
msdn.microsoft.com/en-us/library/bb613553.aspx