2010-10-07 100 views
2

我想問問是否有人知道如何將漸變畫筆映射到WPF 3D中的複雜對象上。結果應該看起來類似於matlab中的3D圖像(例如3D功能)。比方說,你有一些你想要可視化的三維數據,你想通過顏色來區分特定的值。WPF 3D - 在複雜幾何圖形上繪製漸變畫筆

回答

0

給出一個定義GradientBrush是這樣的:

 <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> 

從根本上說,你分配GradientBrushMeshGeometry3DDiffuseMaterial。定義筆刷時,請將其ViewportUnits屬性設置爲「絕對」。

像這樣的一個XAML格式的代碼隱藏直接工作(否則,在代碼中創建刷(在視圖模型),使用相應的屬性,或從你的資源字典稱呼它):

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

然後,對於幾何體中的每個Point3D,將0.0和1.0之間的值分配給相應的紋理座標。一般地,對於預大小Point陣列它看起來是這樣的:

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) 

如果你的面很長,或頂點之間的值相距甚遠很,你的繪圖會看起來很奇怪。但鑑於WPF 3D的限制,它可能是您沒有太多UV映射就可以做的最好的選擇。 (如果你需要C#,Roslyn CTP有一個VS附加組件,它可以將剪貼板上的VB代碼轉換爲C#...)