Можно ли получить информацию об интенсивности света для поверхности с помощью функции Matlab'light'?

В Matlab мы можем создать базовую поверхность с плоской лицевой молнией, используя следующее:

peaks(10)
light 

Это создает следующую картину:

Пики

Есть ли способ получить матрицу, показывающую интенсивность света на участках поверхности для текущего вида? Альтернативно, есть ли способ просто получить атрибут FaceColor, который применяется к отдельным участкам на поверхности (я предполагаю, что вычитая этот FaceColor из неосвещенного FaceColor, мы можем получить интенсивность)?

1 ответ

После того, как вы вызываете пики, определяется поверхностный объект. Итак, после запуска

peaks(10)
light

Вы можете найти этот объект с

s = findall(gcf,'Type','surface');

здесь вы можете преобразовать поверхность в патч-объект и получить цвета вершин

fv = surf2patch(s.XData,s.YData,s.ZData,s.CData);
fvcdata = fv.facevertexcdata;

На рисунке, который вы создали, Matlab использует плоскую штриховку от цветов для каждой вершины, таким образом, цвета лица вычисляются из цветов вершин и углов источника света с нормалями лица, что эквивалентно

patch(fv,'FaceVertexCData',fvcdata,'FaceColor','flat'); light

Обновить

Я посмотрел на документацию matlab свойства FaceColor. Если он определен как "плоский" и FaceVertexCData определен для каждой вершины, то Matlab выберет для каждой грани цвет первой вершины грани.

Таким образом, чтобы получить эффективный цвет лица, вы можете сделать это:

c = fvcdata(fv.faces(:,1)); % per face color
[cmin,cmax] = caxis;
cmap = colormap;
m = length(cmap);
index = fix((c-cmin)/(cmax-cmin)*m)+1;
%Clamp values outside the range [1 m]
index(index<1) = 1;
index(index>m) = m;
faceColors = cmap(index,:);
Другие вопросы по тегам