Как избежать резких артефактов в виде линий при наложении трехмерных изображений изоповерхностей?

Я сделал 3D-рендеринг нескольких изоповерхностей в Matlab. Это выглядит так (скриншот, стрелки добавлены позже):

Я сделал это, используя такой код:

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');

который выполняет итерацию по серии стеков трехмерных значений, каждый с разным порогом, разным цветом и альфа-значением, и отображает их все на фигуре. В частности, здесь у меня были четыре внутренние поверхности, окрашенные в желтый, синий, зеленый, пурпурный цвет с альфа-каналом, равным единице, и четыре внешние поверхности с такими же цветами, но альфа-канал, равный 0,1.

Выглядит нормально, но показывает некоторые артефакты, от которых я хотел бы избавиться.

  • Красными стрелками изображены артефакты, похожие на линии, вероятно, от пересечений внешних поверхностей.
  • Голубыми стрелками изображены очень четкие цветные границы на пересечении внутренних поверхностей.

Я ожидал более плавного рендеринга, который не так сильно подчеркивает пересечения.

Я не хочу, чтобы линии, подобные артефактам, изображались красными стрелками, и я хочу, чтобы острые края, изображенные голубыми стрелками, были более плавными. Конечно, я стремлюсь к решению в Matlab.

Я попытался интерполировать исходные данные, чтобы получить их на более мелкой сетке, но это не имело никакого значения, и я не пытался уменьшить количество патчей (с помощью reducepatch). Линии пересечения изоповерхностей (голубые стрелки) всегда очень жесткие, и установка значений NaN за пределами интересующей области (т.е. ниже самого низкого используемого порога) также не имеет никакого эффекта.

В одном из комментариев говорилось, что может помочь рендеринг в векторный формат, например eps / pdf. С Matlab 2019b этого не происходит. С помощьюprintне saveas чтобы позволить выбрать paintersрендерер, поэтому на выходе действительно векторная графика действительно приводит к артефактам. Вывод в epsc не соблюдает прозрачность, а вывод в pdf не отображает все патчи полностью. Это собственные проблемы, и они меня здесь не интересуют.

Просто для полноты здесь вывод pdf (который меня не интересует):

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

0 ответов

Другие вопросы по тегам