2015-09-23 2 views
2

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

peaks(10) 
light 

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

Peaks

Есть ли способ, чтобы получить матрицу с указанием интенсивность света на поверхностных пятнах для текущего вида? В качестве альтернативы есть способ просто получить атрибут 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 

Update

Я смотрел на matlab documentation имущества 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,:); 
+0

Спасибо за ваш комментарий. К сожалению, это легкие данные, которые я хочу (или, альтернативно, эффективный цвет лица (а не CData от поверхностного объекта). Есть ли способ найти алгоритм Matlab для плоского затенения (или любого другого затенения) на основе векторного нормального и вектор источника света? Это просто какое-то скалярное масштабирование, где, если векторы тангенциальны, значение равно 1 и если векторы перпендикулярны, значение равно 0? – TSGM

+0

Я посмотрел документацию Matlab свойства FaceColor. как «flat», а FaceVertexCData определяется для каждой вершины, тогда Matlab будет выбирать для каждого лица цвет первой вершины лица. Я обновил свой ответ, чтобы показать вам, как получить эффективный цвет лица. – DontCareBear

+0

Извините, но мы можем быть путают: когда свет попадает на поверхность, предыдущий матовый цвет патча (назовите его FaceColor1) будет изменен на другой цвет (назовите его FaceColor2). Это то, что я называю «эффективным цветом» р". Из того, что я понимаю о вашем обновлении, вы объясняли, как FaceColor1 был найден путем интерполяции значений вершин. Положите это по-другому. Есть ли способ вызвать объект патча с точно таким же цветом, что и патч * lit *, но без вызова команды light? – TSGM

Смежные вопросы