-1

我在 Matlab 中对多个等值面进行了 3D 渲染。它看起来像(屏幕截图,稍后添加的箭头):

在此处输入图像描述

我使用如下代码实现了它:

for i = 1 : n
  fv = isosurface(x, y, z, v{i}, t(i)); % x,y,z being the grid, v being the values, t being the threshold
  p = patch(fv);
  p.FaceColor = [r(i),g(i),b(i)]; % some suitable color value
  p.FaceAlpha = alpha(i); % the alpha value
  p.EdgeColor = 'none';
  isonormals(x, y, z, v, p);
  hold on;
end
camlight;
lighting('gouraud');

它迭代一系列 3D 值堆栈,每个堆栈都有不同的阈值和不同的颜色和 alpha 值,并将它们全部绘制在一个图中。特别是在这里,我有四个内表面颜色为黄色、蓝色、绿色、洋红色,alpha 等于 1,四个外表面颜色相同但 alpha 等于 0.1。

它看起来不错,但显示了一些我想摆脱的伪影。

  • 红色箭头描绘的是线状伪影,可能来自外表面的交叉点。
  • 由青色箭头描绘的是在内表面交叉处的非常清晰的颜色边界。

我希望渲染输出更平滑,不会过多强调交叉点。

我不希望红色箭头描绘的线状伪影,我希望青色箭头描绘的锐利边缘更平滑。当然,我的目标是在 Matlab 中找到解决方案。

我尝试对原始数据进行插值以将其放在更精细的网格上,但这没有任何区别,也没有尝试减少补丁的数量(使用reducepatch)。等值面相交线(青色箭头)始终是非常硬的线,并且将值设置为感兴趣区域之外的 NaN(即低于使用的最低阈值)也没有任何影响。

有评论建议渲染为矢量格式(如 eps/pdf)可能会有所帮助。使用 Matlab 2019b 则不然。使用print,saveas不允许选择painters渲染器,因此输出实际上是矢量图形确实会导致伪影。epsc 的输出不尊重透明度,pdf 的输出不会完全呈现所有补丁。那是他们自己的问题,我在这里对他们不感兴趣。

只是为了完整性,这里的 pdf 输出(我不感兴趣):

在此处输入图像描述

print(fig, '-painters', '-bestfit', '-dpdf', 'test.pdf');
4

0 回答 0