Laden...

OpacityMask auf 3D-Fläche

Erstellt von Lector vor 14 Jahren Letzter Beitrag vor 14 Jahren 3.109 Views
L
Lector Themenstarter:in
862 Beiträge seit 2006
vor 14 Jahren
OpacityMask auf 3D-Fläche

Hallo,

Ich möchte eine Spiegelung ähnlich wie hier http://code-inside.de/blog/2008/03/02/howto-wpf-spiegelung-mit-dem-visualbrush/ in 3D umsetzen.
Dazu verwende ich ein GeometryModel3D Objekt welches die Form eines Quadrats hat. Als Material habe ich ein DiffuseMaterial mit VisualBrush angewendet. Das ganze funktioniert wunderbar. Das einzige was an einem perfekten Spiegeleffekt noch fehlt ist die Transparenz. Im oben genannten Beispiel wird auf einem 2D-Control einfach eine OpacityMask angewendet. Wie setzte ich das auf einer 3D-Fläche um? Ich habe bereits etwas einer MaterialGroup herumbespielt und einen unteren Halbtransparenten Layer hinzugefügt. Allerdings möchte ich dass sich die OpacityMask auf meine VisualBrush auswirkt.
Weis jemand wie ich so etwas realisieren könnte?

W
113 Beiträge seit 2006
vor 14 Jahren

Hallo Lector,

Weiß nicht obs dir hilft aber, ich habe das so gemacht:


Material LoadMaterial(ImageSource ImageSrc)
{
   Image img = new Image();
   img.Source = ImageSrc;
   Color startColor = Color.FromArgb(0, 255, 255, 255);
   Color endColor = Color.FromArgb(127, 255, 255, 255);
   GradientStopCollection stops = new GradientStopCollection();
   stops.Add(new GradientStop(startColor, 0.5));
   stops.Add(new GradientStop(endColor, 1.0));
   img.OpacityMask = new LinearGradientBrush(stops, 90.0);
   Brush brush = new VisualBrush(img);
   return new DiffuseMaterial(brush);
}
//....

mfg, XaN

L
Lector Themenstarter:in
862 Beiträge seit 2006
vor 14 Jahren

Dank für den Tipp. Ich habe das ganze ähnlich umgesetzt:


private Material createMirrorMaterial(Visual visual)
{
  VisualBrush visualBrush = new VisualBrush(visual);
  visualBrush.RelativeTransform = m_scale; //Damit die Y-Achse gespiegelt ist
  Rectangle rect = new Rectangle();
  rect.Width = 200;
  rect.Height = 200;
  rect.Fill = visualBrush;
  rect.OpacityMask = m_opacityMask; //Damit wir einen Farbverlauf ins transparente haben
  VisualBrush mirrorBrush = new VisualBrush(rect);
  DiffuseMaterial material = new DiffuseMaterial(mirrorBrush);
  return material;
}

m_scale und m_opacityMask erstelle ich am Anfang und rufe Freeze() auf um etwas Performance zu gewinnen. Ich habe jedoch festgestellt dass der Spiegeleffekt ziemlich langsam ist wenn ich ein Objekt bewege.
Es wäre toll wenn jemand Tipps hat wie ich das Ganze schneller machen könnte.