Main Content

光照概述

光照命令

MATLAB® 图形环境提供的命令允许您放置光源并调整反射光线的对象的特性。这些命令如下。

命令

用途

camlight

相对于相机位置创建或移动光源

lightangle

在球面坐标中创建或放置光源

light

创建光源对象

lighting

选择光照方法

material

设置被照亮对象的反射属性

您可以设置光源和被照亮对象的属性,以获得特定的结果。除了本主题中的材料外,您还可以通过学习光照示例来了解光照在可视化中的应用。

光源对象

您可以使用 light 函数创建光源对象。有三个重要的光源对象属性:

  • Color - 光源对象投射的光线的颜色

  • Style - 无限远(默认值)或局部

  • Position - 方向(无限远光源)或位置(局部光源)

Color 属性决定来自光源的定向光的颜色。场景中对象的颜色由对象和光源的颜色共同决定。

Style 属性决定光源是从指定位置向所有方向发光的点源(Style 设置为 local),还是放置在无限远处,从指定位置的方向发出平行光线的光源(Style 设置为 infinite)。

Position 属性以坐标区数据单位指定光源的位置。在光源无限远的情况下,Position 指定光源的方向。

光源影响与其在同一坐标区内的曲面和补片对象。这些对象有许多属性,可在被光源照亮时改变对象的外观。

影响光照的属性

您看不到光源对象本身,但可以看到它们照射在位于相同坐标区内的任何补片和曲面对象上的效果。有许多函数可以创建这些对象,包括 surfmeshpcolorfillfill3 以及 surfacepatch 函数。

您可以通过设置各种坐标区、光源、补片和曲面对象属性来控制光照效果。所有属性都具有默认值,它们一般情况下可以产生理想的结果。但是,您可以通过调整这些属性的值来实现想要的特定效果。

属性

作用

AmbientLightColor

坐标区属性,指定场景中背景光源的颜色,没有方向,均匀地影响所有对象。仅当坐标区内存在可见的光源对象时,才会出现环境光效果。

AmbientStrength

补片和曲面属性,决定从对象反射的环境光分量的强度。

DiffuseStrength

补片和曲面属性,决定从对象反射的散射光分量的强度。

SpecularStrength

补片和曲面属性,决定从对象反射的镜面反射光分量的强度。

SpecularExponent

补片和曲面属性,决定镜面反射光的大小。

SpecularColorReflectance

补片和曲面属性,决定镜面反射按对象颜色或光源颜色进行着色的程度。

FaceLighting

补片和曲面属性,决定用来计算对象面上的光照效果的方法。选项包括无光照、均一光照或 Gouraud 光照算法。

EdgeLighting

补片和曲面属性,决定用来计算对象边上的光照效果的方法。选项包括无光照、均一光照或 Gouraud 光照算法。

BackFaceLighting

补片和曲面属性,决定当顶点法线远离相机时如何照亮对象的面。此属性对于区分对象的内表面和外表面很有用。

FaceColor

补片和曲面属性,指定对象面的颜色。

EdgeColor

补片和曲面属性,指定对象边的颜色。

VertexNormals

补片和曲面属性,包含对象每个顶点的法向量。MATLAB 使用顶点法向量执行光照计算。虽然 MATLAB 会自动生成此数据,但您也可以指定自己的顶点法向。

NormalMode

补片和曲面属性,决定当您更改对象数据后 MATLAB 是重新计算顶点法向 (auto) 还是使用 VertexNormals 属性的当前值 (manual)。如果您为 VertexNormals 指定值,MATLAB 会将此属性设置为 manual

有关详细信息,请参阅 Axes 属性Surface 属性Patch 属性

光照控制示例

光照是为图形场景增加真实感的一种方式。它通过模拟自然光(例如来自太阳的定向光)照射下对象上出现的高光区和黑暗区来实现。为了产生光照效果,MATLAB 定义了一个图形对象,称为光源。MATLAB 将光照应用于曲面对象和补片对象。

示例 - 在场景中添加光源

此示例显示膜表面,并使用从相机位置右侧发出的光源照亮它。

membrane
camlight

创建光源将激活许多与光照相关的属性,它们控制诸如环境光和对象反射属性之类的特性。

Surface plot with lighting. The surface has a reflective appearance.

示例 - 数学函数光照效果

光照可以增强数学函数的曲面图的显示。例如,使用 ezsurf 命令计算表达式

sin(x2+y2)÷(x2+y2)

在 -6π 到 6π 区域内的值。

h = fsurf(@(x,y) sin(sqrt(x.^2+y.^2))./sqrt(x.^2+y.^2), ...
[-6*pi,6*pi]);

Surface plot with default appearance

现在使用 lightangle 函数添加光照,此函数接受以方位角和仰角表示的光照位置。

view(0,75)
shading interp
lightangle(-45,30)
h.FaceLighting = 'gouraud';
h.AmbientStrength = 0.3;
h.DiffuseStrength = 0.8;
h.SpecularStrength = 0.9;
h.SpecularExponent = 25;
h.BackFaceLighting = 'unlit';

Surface plot shown from a different angle with lighting to give it a reflective appearance

使用 findobj 获取曲面对象的句柄后,可以设置影响曲面的反射光的属性。有关这些属性的详细说明,请参阅影响光照的属性