2
我想問問是否有人知道如何將漸變畫筆映射到WPF 3D中的複雜對象上。結果應該看起來類似於matlab中的3D圖像(例如3D功能)。比方說,你有一些你想要可視化的三維數據,你想通過顏色來區分特定的值。WPF 3D - 在複雜幾何圖形上繪製漸變畫筆
我想問問是否有人知道如何將漸變畫筆映射到WPF 3D中的複雜對象上。結果應該看起來類似於matlab中的3D圖像(例如3D功能)。比方說,你有一些你想要可視化的三維數據,你想通過顏色來區分特定的值。WPF 3D - 在複雜幾何圖形上繪製漸變畫筆
給出一個定義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>
從根本上說,你分配GradientBrush
您MeshGeometry3D
的DiffuseMaterial
。定義筆刷時,請將其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#...)