2010-10-07 3 views
2

Je voulais savoir si quelqu'un sait comment mapper un dégradé sur des objets complexes dans WPF 3D. Le résultat devrait ressembler aux images 3D dans matlab (fonction 3D par exemple). Disons que vous avez des données tridimensionnelles que vous souhaitez visualiser et que vous voulez différencier certains niveaux de valeurs par couleur.WPF 3D - Brosse de dégradé de mappage sur une géométrie complexe

Répondre

0

Étant donné un GradientBrush défini quelque chose comme ceci:

 <LinearGradientBrush x:Name="RedYellowGradient"> 
      <GradientStop Color="Blue" Offset="0.01" /> 
      <GradientStop Color="Purple" Offset="0.25"/> 
      <GradientStop Color="Red" Offset="0.5"/> 
      <GradientStop Color="Orange" Offset="0.75"/> 
      <GradientStop Color="Yellow" Offset="1.0"/> 
     </LinearGradientBrush> 

Fondamentalement, vous attribuez la GradientBrush à la DiffuseMaterial de votre MeshGeometry3D. Lorsque vous définissez le pinceau, définissez sa propriété ViewportUnits sur "Absolute".

Quelque chose comme cela fonctionnerait directement dans le code-behind d'une forme XAML (sinon, créez le pinceau dans le code (dans votre ViewModel) en utilisant les propriétés correspondantes, ou appeler à partir de votre dictionnaire de ressources):

MyMaterial = New DiffuseMaterial(RedYellowGradient) With {.ViewportUnits = BrushMappingMode.Absolute} 

Ensuite, pour chaque Point3D de votre géométrie, attribuez une valeur comprise entre 0,0 et 1,0 à la coordonnée de texture correspondante. Génériquement, pour un tableau pré-taille Point il pourrait ressembler à ceci:

Parallel.For(0, positions.Count - 3, Sub(i) 
              Dim p = positions(i) 
              Dim plotValue = GetYourValue(p.X, p.Y, p.Z) 
              Dim t = (plotValue - minPlot)/(maxPlot - minPlot) 
              If t < 0 Then t = 0 
              If t > 1 Then t = 1             
              arr(i) = New Point(t, 0.5) 
             End Sub) 

Si vos facettes sont très longues ou les valeurs entre les sommets très éloignés, votre tracé regarderont étrange. Mais étant donné les restrictions de WPF 3D, c'est probablement le meilleur que vous pouvez faire sans beaucoup de cartographie UV.

(Si vous avez besoin de C#, le CTP Roslyn a un add-on VS qui va convertir le code VB du presse-papiers en C# ...)