Как визуализировать 3D-скалярное поле с помощью Helix.SharpDX Volume Rendering?

У меня есть задача визуализировать 3D-поле скаляров с помощью Helix Toolkit. Входной массив содержит двойные значения без ограничений, но обычно где-то между [-50000, +50000]. Скалярное значение влияет на цвет куба: минимальное значение имеет синий цвет, 0 - белый, максимальное - красный. Все остальные значения цветов интерполируются в соответствии со значением.

Сейчас я пытаюсь понять, как работает Color Transfer Map в HelixToolkit.Wpf.SharpDX. Для этого я создал простое поле скаляров 2x2x1.

MainWindow.xaml

<hx:Viewport3DX
    Name="view1"
    Grid.Row="1"
    BackgroundColor="SkyBlue"
    Camera="{Binding Camera}"
    EffectsManager="{Binding EffectsManager}"
    EnableDesignModeRendering="True"
    UseDefaultGestures="False"
    CameraRotationMode="Trackball">
    <hx:Viewport3DX.InputBindings>
        <KeyBinding Key="B" Command="hx:ViewportCommands.BackView" />
        <KeyBinding Key="F" Command="hx:ViewportCommands.FrontView" />
        <KeyBinding Key="U" Command="hx:ViewportCommands.TopView" />
        <KeyBinding Key="D" Command="hx:ViewportCommands.BottomView" />
        <KeyBinding Key="L" Command="hx:ViewportCommands.LeftView" />
        <KeyBinding Key="R" Command="hx:ViewportCommands.RightView" />
        <KeyBinding Command="hx:ViewportCommands.ZoomExtents" Gesture="Control+E" />
        <MouseBinding Command="hx:ViewportCommands.Rotate" Gesture="RightClick" />
        <MouseBinding Command="hx:ViewportCommands.Zoom" Gesture="MiddleClick" />
        <MouseBinding Command="hx:ViewportCommands.Pan" Gesture="LeftClick" />
    </hx:Viewport3DX.InputBindings>
    <hx:VolumeTextureModel3D VolumeMaterial="{Binding VolumeMaterial}" />
</hx:Viewport3DX>

MainWindowViewModel.cs

public MainWindowViewModel()
{
    Nx = 2;
    Ny = 2;
    Nz = 1;

    var m = new VolumeTextureDiffuseMaterial();

    var data = new[] {0.0f, 0.25f, 0.5f, 1.0f};

    var gradients = VolumeDataHelper.GenerateGradients(data, Nx, Ny, Nz, 1);
    m.Texture = new VolumeTextureGradientParams(gradients, Nx, Ny, Nz);
    m.TransferMap = new[]
        {Colors.Red.ToColor4(), Colors.Blue.ToColor4(), Colors.Lime.ToColor4(), Color4.White};
    m.SampleDistance = 0.1;
    m.Freeze();

    VolumeMaterial = m;
}

Я ожидал, что у меня будет 4 разных куба с разными цветами, что-то вроде (возможно, с градиентом между кубами из-за интерполяции и выборки): Желаемый

Но я продолжаю получать это странное треугольное сочетание цветов: Actual

Как именно работает массив карт переноса цвета? Как я могу добиться желаемого результата с кубами, используя объемный рендеринг HelixToolkit.SharpDX?


person Aleksei Petrov    schedule 24.06.2019    source источник
comment
Помните: если Helix или любой другой пакет в этом отношении становится слишком тяжелым и сложным для относительно простого варианта использования, вы всегда можете сделай сам... :О)   -  person jsanalytics    schedule 28.06.2019
comment
И ЗДЕСЬ образец объемного рендеринга 5x5x5 с использованием только альфа-канала между слоями, очевидно, одного цвета. Никаких сторонних библиотек, просто WPF.   -  person jsanalytics    schedule 29.06.2019
comment
9x9x9 пятицветные слои.   -  person jsanalytics    schedule 29.06.2019
comment
15x15x15 ПИКСЕЛЯЦИОННАЯ СФЕРА.   -  person jsanalytics    schedule 29.06.2019
comment
@jsanalytics, чего вы пытаетесь достичь своими демонстрациями? Вы не предоставляете никакого кода или чего-то подобного. Чистый WPF3D требует реализации очень многих элементарных вещей вручную (например, вращение мыши на трекболе и так далее). Кроме того, WPF3D борется с высокой нагрузкой (например, 1000x1000x1000 кубов). Поэтому в нашем проекте используется HelixToolkit.SharpDX. Здесь уже реализовано многое, а DirectX позволяет рисовать очень сложные сцены со скоростью 60 кадров в секунду.   -  person Aleksei Petrov    schedule 29.06.2019
comment
На машине с 16 ГБ ОЗУ происходит сбой с исключением нехватки памяти при разрешении 127x127x127. Это 63 x 63 x 63 PIXELATED DOUBLE-SPHERE — это максимум, который мы могли получить. Вы должны добавить тег supercomputers к своему вопросу...: O)   -  person jsanalytics    schedule 30.06.2019


Ответы (1)


Вы можете попробовать обратиться к этому руководству. Урок 1 и Урок 2

Именно так Helixtoolkit использовал для реализации объемного рендеринга.

person Lance H    schedule 25.06.2019