WPF 3D - отображение градиентной кисти на сложной геометрии - PullRequest
2 голосов
/ 07 октября 2010

Я хотел спросить, знает ли кто-нибудь, как наложить кисть градиента на сложные объекты в WPF 3D.Результат должен выглядеть аналогично 3D-изображениям в Matlab (например, функция 3D).Допустим, у вас есть трехмерные данные, которые вы хотите визуализировать, и вы хотите различать определенные уровни значений по цвету.

1 Ответ

0 голосов
/ 11 мая 2013

Учитывая, что 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 # ...)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...