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