【发布时间】:2019-06-26 21:38:11
【问题描述】:
我的任务是使用 Helix Toolkit 可视化 3D 标量场。输入数组包含没有限制的双精度值,但通常介于 [-50000, +50000] 之间。标量值影响立方体的颜色:最小值为蓝色,0 - 白色,最大值 - 红色。所有其他颜色值都根据该值进行插值。
现在我正在尝试了解颜色传输图在 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 个不同颜色的不同立方体,例如(由于插值和采样,立方体之间可能存在渐变):
但我不断得到这种奇怪的三角形混色:
颜色传输图数组的工作原理是什么?如何使用 HelixToolkit.SharpDX 的体积渲染来获得所需的立方体效果?
【问题讨论】:
-
请记住:如果
Helix或任何其他软件包对于相对简单的用例来说过于繁重和复杂,您可以随时 do it yourself...:O)跨度> -
和HERE 一个示例 5x5x5 体积渲染,仅使用层之间的 Alpha 通道,显然是相同的颜色。没有第 3 方库,只有普通的 WPF。
-
9x9x9 五色图层。
-
15x15x15 PIXELATED SPHERE.
-
@jsanalytics,您想通过演示实现什么目标?你不提供任何代码或类似的东西。纯 WPF3D 需要手动实现这么多基本的东西(如轨迹球鼠标旋转等)。此外,WPF3D 难以应对高负载(例如 1000x1000x1000 立方体)。这就是我们项目中使用 HelixToolkit.SharpDX 的原因。这里已经实现了很多东西,DirectX 可以以 60 fps 的速度绘制非常复杂的场景。
标签: c# helix-3d-toolkit volume-rendering