Учитывая, что 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
DiffuseMaterial
вашего MeshGeometry3D
.При определении кисти задайте для ее свойства ViewportUnits
значение «Абсолют».
Примерно так будет работать непосредственно в коде XAML-формы (в противном случае создайте кисть в коде (в вашей ViewModel)используя соответствующие свойства или вызовите его из словаря ресурсов):
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, это, вероятно, лучшее, что вы можете обойтись без большого количества УФ-карт.
(Если вам нужен C #, в Roslyn CTP есть надстройка VS, которая преобразует код VB в буфер обменана C # ...)