是否有可能使用Matlab的“光”功能获得表面的光强度信息?

时间:2015-09-23 17:34:19

标签: matlab lighting surface phong

在Matlab中,我们可以使用以下方法创建一个具有平面闪电的基本表面:

peaks(10)
light 

这会创建以下图片:

Peaks

有没有办法获得表示当前视图表面贴片上光强度的矩阵?或者有一种方法可以简单地获取FaceColor属性,该属性应用于曲面上的各个面片(我假设从未点亮的FaceColor中减去这个FaceColor,我们可以获得强度)?

1 个答案:

答案 0 :(得分: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
  

更新

我查看了FaceColor属性的matlab documentation。如果它被定义为“平坦的”'并且每个顶点定义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,:);