6.4MATLAB学习笔记之图形对象句柄-光照和材质处理

光照和材质处理

使用光源对象实现光照处理,可以将图形表现得更加真实,使图形表面微妙的差异更清楚。

光源对象是不可见的,但是可以像设置其他图形对象的属性那样设置光源对象的类型、颜色、 位置和其他属性。

材质体现了图形对象的反射特性,修改区域块和曲面对象的反射特性,可以改变在场景中应用光照时对象的显示外观。

一、光照处理

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 光照时的显示效果,第二个球还标出了光源的位置。

untitled

二、材质处理

材质体现了图形对象的反射特性,修改区域块和曲面对象的反射特性,可以改变在场景中应 用光照时对象的显示外观。

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属性从 默认设置变成了正常光照,删除了不必要的边缘效应。程序运行后,生成的图形效果如图所示。

untitled

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值