2

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

peaks(10)
light 

这将创建以下图片:

峰

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

4

1 回答 1

1

在调用 peaks 之后,定义了一个表面对象。所以在你跑步之后

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 文档。如果它被定义为“平面”并且 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,:);
于 2015-09-23T19:44:57.427 回答