首先,我们来绘制一个海螺的复杂图形
close all
t = linspace(0,2*pi,512);
[u v] = meshgrid(t);
a = -0.4;
b = 0.5;
c = 0.1;
n = 3;
x = (a*(1-v/(2*pi)).*(1+cos(u))+c).*cos(n*v);
y = (a*(1-v/(2*pi)).*(1+cos(u))+c).*sin(n*v);
z = b*v/(2*pi)+a*(1-v/(2*pi)).*sin(u);
surf(x,y,z,z)
axis off
axis equal
colormap(hsv(1024))
shading interp
material shiny
%lighting phong
camlight('left','infinite')
view([-160 25])
结果:
这里我们进行了一系列设置:
axis off:将坐标轴关闭,只显示曲面
axis equal:坐标轴的长度相同
shading interp:上一篇文章中已经讲过,这个语句的作用是去除黑色的边界线并将颜色的变化更自然(连续过渡)
material shiny:材料设置为镜面反射
在MATLAB官方网站上有对这个函数的进一步解释:
% material %设置 surface 和 patch 对象的光照特征。
% material shiny %使得对象具有相对于漫反射和环境光更高的镜面反射,镜面反射光的颜色仅取决于光源的颜色。
% material dull %设置反射属性,使得对象反射更多的漫射光并且没有镜面反射光,但反射光的颜色仅取决于光源。
% material metal %设置反射属性,使得对象具有非常高的镜面反射、非常低的环境和漫反射,反射光的颜色同时取决于光源和对象的颜色。
% material([ka kd ks]) %设置对象的环境/漫反射/镜面反射强度。
lighting phong语句表示引入冯氏光照模型
重新绘制图形
%lighting phong
将这个语句注释,可以观察亮点附近的图形:
出现了明显的波纹,这是因为在不设置光照模型的情况下,默认的光照只是引入了光源,不能根据物体的实际空间形状模拟出光照效果,可以用以下语句进行对比:
sphere
axis equal
lightangle(-45,30)
结果:
引入lighting phong函数:
figure
sphere
axis equal
lightangle(-45,30)
lighting phong
结果:
camlight('left','infinite')语句创造了一个光源:
% camlight('headlight') %在相机位置创建光源。
% camlight('right') %在相机右上方创建光源。
% camlight('left') %在相机左上方创建光源。
参考:
《高等光学仿真——光波导、激光》
MATLAB官网