光照和材质处理
使用光源对象实现光照处理,可以将图形表现得更加真实,使图形表面微妙的差异更清楚。
光源对象是不可见的,但是可以像设置其他图形对象的属性那样设置光源对象的类型、颜色、 位置和其他属性。
材质体现了图形对象的反射特性,修改区域块和曲面对象的反射特性,可以改变在场景中应用光照时对象的显示外观。
一、光照处理
MATLAB提供light函数创建光源对象,其调用格式如下:
句柄变量=light(属性名1,属性值1,属性名2,属性值2,…)
发光对象有如下3个重要属性。
(1)Color属性:设置光的颜色,默认为白色。
(2)Style属性:设置光源对象是否在无穷远,可取值为’infinite’ (默认值)或local’, 分别表示无穷远光和近光。
(3)Position属性:该属性的取值是数值向量,取三维坐标点组成的向量形式[x,y,z], 用于设置光源对象与坐标轴原点的距离。
- 发光对象的位置与Style 属性有关,
- 若Style 属性为local, 则设置的是光源的实际位置;
- 若 Style 属性为’infinite’, 则设置的是光线射过来的方向,表示穿过该点射向原点。
假如函数不包含任何参数,则采用默认设置:白光、无穷远、穿过(1,0,1)点射向坐标原点。
利用lighting 命令可以设置光照模式,其格式如下:
lighting 选项
其中,选项有4种取值: flat 、gouraud 、phong 、none 。
- flat选项使得入射光均匀洒落在图形对 象的每个面上,是默认选项;
- gouraud 选项先对顶点颜色插补,再对顶点勾画的面上颜色进行插补,用于表现曲面;
- phong 选项对顶点处的法线插值,再计算各个像素的反光,它生成的光照效果好,但更费时;
- none 选项关闭所有光源。
例1 绘制光照处理后的球面并观察不同光照模式下的效果。 程序如下:
[x,y,z]=sphere(20);
subplot(1,4,1)
surf(x,y,z);axis equal
shading interp
hold on
subplot(1,4,2)
surf(x,y,z);axis equal
light('Position',[0,1,1])
shading interp;lighting flat
hold on
plot3(0,1,1,'p');text(0,1,1,' light')
subplot(1,4,3)
surf(x,y,z);axis equal
light('Position',[0,1,1])
shading interp;lighting gouraud
hold on
subplot(1,4,4)
surf(x,y,z);axis equal
light('Position',[0,1,1])
shading interp;lighting phong
程序运行结果如图所示,4个球分别是没有使用光照,使用flat 光照,使用gouraud 光照和使用phong 光照时的显示效果,第二个球还标出了光源的位置。
二、材质处理
材质体现了图形对象的反射特性,修改区域块和曲面对象的反射特性,可以改变在场景中应 用光照时对象的显示外观。
1.图形对象的反射特性
图形对象的反射特性包括镜面反射和漫反射、环境光、镜面反射指数、镜面反射光的颜色和背面光照,可以组合使用这几种特性来生成特殊的显示结果。
(1)镜面反射和漫反射。
- 区域块和曲面对象的SpecularStrength属性用来控制对象表面镜面反射的强度,属性值取0~1之间的数,默认取0.9。
- DiffuseStrength 属性用来控制对象表面漫反射的强度,属性值取0~1之间的数,默认值取0.6。
(2)环境光。
- 环境光不是镜面光,它均匀地洒在场景中的所有对象上。只有在坐标系中有 Light 对象时环境光才可见。
- AmbientStrength 属性是一个用于区域块和曲面对象的属性,确定特定对象上环境光的强度,属性值取0~1之间的数,默认值取0.3。
(3)镜面反射指数。
镜面反射光的大小与区域块和曲面对象的SpecularExponent 属性有关, 该属性的值介于1~500之间,默认值为10。
(4)镜面反射光的颜色。
- 镜面反射光的颜色可以有一个变化范围,即从对象颜色与光源颜色的组合色变到只有光源颜色。
- 区域块和曲面对象的SpecularColorReflectance 属性控制这个颜色,属性值取0~1之间的数,默认值为1。
(5)背面光照。
- 背面光照可用于显示对象内表面和外表面的差别。
- 区域块和曲面对象的 BackFaceLighting 属性控制该效果,属性取值为’unlit’ 、lit ‘和’reverselit’ (默认值)。
2.material函数
使用material函数也可以设置区域块和曲面对象的表面反射特性,其调用格式如下:
(1)material shiny:镜面反射光的强度比漫反射光和环境光的强度要高得多,镜面光的颜色只决定于光源的颜色。
(2)material dull:主要进行漫反射,没有镜面反射,但是反射光的颜色只与光源有关。
(3)material metal: 镜面反射很强,环境光和漫反射光较弱,反射光的颜色与光源和对象 的颜色都有关系。
(4)material([ka,kd,ks]): 设置对象的环境光、漫反射光和镜面光的强度。
(5)material([ka,kd,ks,n]): 设置环境光、漫反射光、镜面光的强度以及对象的镜面反射指数。
(6)material([ka,kd,ks,n,sc]): 设置环境光、漫反射光、镜面光的强度、对象的镜面反射指数以及镜面反射光的颜色。
(7)material default:将环境光、漫反射光、镜面光的强度、对象的镜面反射指数和镜面反射光的颜色设置为默认值。
注意:material 函数设置坐标系中所有区域块和曲面对象的 AmbientStrength 、Diffuse- Strength 、SpecularStrength 、SpecularExponent 和 SpecularColorReflectance 属性。坐标系中必须 有一个可见的 Light 对象。
例2 生成一个球体和一个立方体,观察表面反射特性设置效果。
程序如下:
sphere(36)
h=findobj('Type','surface');
set(h,'FaceLighting','phong','FaceColor','interp',...
'EdgeColor',[0.4,0.4,0.4],'BackFaceLighting','lit')
hold on
vert=[2,0,-1;2,1,-1;3,0,0;3,0,-1;2,0,0;2,1,0;3,1,0;3,0,0];
fac=[1,2,3,4;2,6,7,3;4,3,7,8;1,5,8,4;1,2,6,5;5,6,7,8];
patch('Faces',fac,'Vertices',vert,'FaceColor','y')
light('Position',[1,3,2])
light('Position',[-3,-1,3])
material shiny
axis equal
hold off
程序中用 findobj 函数查找Type 属性为surface 的对象,从而可以获取该球面的句柄,进而 设置其属性。球面使用了phong FaceLighting属性值,因为生成了最平滑的光照插值效果。vert 和 fac 定义立方体。默认时,立方体使用flat Facelighting属性值增强每个边的可见性。material shiny 命令会影响立方体和球体的反射属性。因为球体是闭合的,所以BackFaceLighting属性从 默认设置变成了正常光照,删除了不必要的边缘效应。程序运行后,生成的图形效果如图10-11 所示。
flat Facelighting属性值增强每个边的可见性。material shiny 命令会影响立方体和球体的反射属性。因为球体是闭合的,所以BackFaceLighting属性从 默认设置变成了正常光照,删除了不必要的边缘效应。程序运行后,生成的图形效果如图所示。