
本文给出MATLAB绘图中的光照材质与颜色控制,包含命令:light, material, shading,colormap, alpha,附例程
文章目录
光照设置 - light 命令
基本语法
light('Position', [x, y, z], 'Style', 'infinite'|'local', 'Color', [R,G,B])
使用场景
- 增强三维图形的立体感
- 突出曲面的细节和纹理
- 创建真实的视觉效果
简单示例
% 基本光照效果
[X, Y] = meshgrid(-2:0.2:2, -2:0.2:2);
Z = peaks(X, Y);
surf(X, Y, Z);
shading interp;
light('Position', [2, 2, 3]); % 添加光源
title('基本光照效果');
运行结果:

进阶示例
% 多光源配置
figure;
[X, Y, Z] = sphere(30);
% 左图:单光源
subplot(1,2,1);
surf(X, Y, Z);
shading interp;
light('Position', [2, 2, 2], 'Color', 'white');
title('单光源');
axis equal;
% 右图:多光源
subplot(1,2,2);
surf(X, Y, Z);
shading interp;
light('Position', [2, 2, 2], 'Color', [1, 0.8, 0.8]); % 暖光
light('Position', [-2, -2, 2], 'Color', [0.8, 0.8, 1]); % 冷光
title('双光源(暖冷对比)');
axis equal;
运行结果:

材质设置 - material 命令
基本语法
material('shiny'|'dull'|'metal'|'default')
material([ka kd ks n]) % 自定义参数
材质参数
- ka: 环境光反射系数 (0-1)
- kd: 漫反射系数 (0-1)
- ks: 镜面反射系数 (0-1)
- n: 镜面反射指数 (1-∞)
简单示例
figure;
% 基本材质效果
[X, Y, Z] = sphere(40);
surf(X, Y, Z);
shading interp;
light('Position', [2, 2, 3]);
material('shiny'); % 光亮材质
title('光亮材质效果');
axis equal;
运行结果:

进阶示例
figure;
% 不同材质对比
figure;
[X, Y, Z] = sphere(30);
materials = {'default', 'shiny', 'dull', 'metal'};
titles = {'默认', '光亮', '暗淡', '金属'};
for i = 1:4
subplot(2,2,i);
surf(X, Y, Z);
shading interp;
material(materials{i});
light('Position', [2, 2, 3]);
title(titles{i});
axis equal; axis off;
end
运行结果:

着色模式 - shading 命令
基本语法
shading flat % 平面着色
shading interp % 插值着色(平滑)
shading faceted % 显示网格线(默认)
使用场景
- flat: 分段显示,突出数据区间
- interp: 平滑过渡,美观展示
- faceted: 显示网格结构
简单示例
figure;
% 基本着色效果
[X, Y] = meshgrid(-2:0.2:2, -2:0.2:2);
Z = peaks(X, Y);
surf(X, Y, Z);
shading interp; % 插值着色
light('Position', [2, 2, 3]);
title('插值着色效果');
运行结果:

进阶示例
% 三种着色模式对比
figure;
[X, Y] = meshgrid(-2:0.3:2, -2:0.3:2);
Z = peaks(X, Y);
subplot(1,3,1);
surf(X, Y, Z);
shading faceted;
light('Position', [2, 2, 3]);
title('Faceted(网格线)');
subplot(1,3,2);
surf(X, Y, Z);
shading flat;
light('Position', [2, 2, 3]);
title('Flat(平面)');
subplot(1,3,3);
surf(X, Y, Z);
shading interp;
light('Position', [2, 2, 3]);
title('Interp(插值)');
运行结果:

颜色映射 - colormap 命令
基本语法
colormap(mapname) % 使用预定义映射
colormap(custom_map) % 使用自定义映射
常用颜色映射
- jet: 蓝→青→绿→黄→红
- hot: 黑→红→黄→白
- cool: 青→品红
- parula: MATLAB默认
简单示例
% 基本颜色映射
[X, Y] = meshgrid(-2:0.1:2, -2:0.1:2);
Z = peaks(X, Y);
surf(X, Y, Z);
shading interp;
colormap('jet'); % 使用jet颜色映射
colorbar;
title('Jet颜色映射');
运行结果:

进阶示例
% 多种颜色映射对比
figure;
[X, Y] = meshgrid(-2:0.1:2, -2:0.1:2);
Z = peaks(X, Y);
maps = {'parula', 'jet', 'hot', 'cool'};
titles = {'Parula', 'Jet', 'Hot', 'Cool'};
for i = 1:4
subplot(2,2,i);
surf(X, Y, Z);
shading interp;
colormap(gca, maps{i});
colorbar;
title(titles{i});
end
运行结果:

自定义颜色映射
% 自定义双色渐变
figure;
[X, Y] = meshgrid(-2:0.1:2, -2:0.1:2);
Z = peaks(X, Y);
surf(X, Y, Z);
shading interp;
% 创建蓝到红的渐变
n = 64;
custom_map = [linspace(0,1,n)', zeros(n,1), linspace(1,0,n)'];
colormap(custom_map);
colorbar;
title('自定义蓝→红渐变');
运行结果:

透明度控制 - alpha 命令
基本语法
alpha(value) % 统一透明度 (0-1)
alpha(object, value) % 指定对象透明度
alpha(alpha_matrix) % 基于矩阵的透明度
使用场景
- 多层数据可视化
- 透视内部结构
- 创建玻璃、水等效果
简单示例
figure;
% 基本透明度效果
[X, Y] = meshgrid(-2:0.1:2, -2:0.1:2);
Z = peaks(X, Y);
surf(X, Y, Z);
shading interp;
alpha(0.6); % 设置60%透明度
light('Position', [2, 2, 3]);
title('半透明曲面');
运行结果:

进阶示例
% 多层透明曲面
figure;
[X, Y] = meshgrid(-2:0.1:2, -2:0.1:2);
Z1 = peaks(X, Y);
Z2 = 0.5 * peaks(X+0.5, Y+0.5) + 1;
% 第一层曲面
surf(X, Y, Z1, 'FaceColor', 'blue');
alpha(0.5);
shading interp;
hold on;
% 第二层曲面
surf(X, Y, Z2, 'FaceColor', 'red');
alpha(0.5);
shading interp;
light('Position', [2, 2, 3]);
title('双层透明曲面');
运行结果:

基于数据的透明度
% 数据驱动的透明度
figure;
[X, Y] = meshgrid(-2:0.1:2, -2:0.1:2);
Z = peaks(X, Y);
surf(X, Y, Z);
shading interp;
% 根据高度设置透明度
alpha_data = (Z - min(Z(:))) / (max(Z(:)) - min(Z(:)));
alpha_data = 0.3 + 0.7 * alpha_data; % 透明度范围0.3-1.0
alpha(alpha_data);
light('Position', [2, 2, 3]);
title('高度驱动透明度');
运行结果:

综合应用示例
完整的三维可视化
% 综合所有技术的示例
figure;
[X, Y] = meshgrid(-3:0.1:3, -3:0.1:3);
Z = peaks(X, Y);
% 创建曲面
h = surf(X, Y, Z);
shading interp; % 插值着色
material('shiny'); % 光亮材质
colormap('jet'); % Jet颜色映射
alpha(0.8); % 80%不透明度
% 添加光照
light('Position', [3, 3, 5], 'Color', [1, 1, 1]);
light('Position', [-2, -2, 3], 'Color', [0.5, 0.5, 0.8]);
% 美化图形
colorbar;
xlabel('X轴'); ylabel('Y轴'); zlabel('Z轴');
title('综合光照材质效果');
view(45, 30);
运行结果:

动态效果演示
% 动态光照变化
figure;
[X, Y, Z] = sphere(40);
h_surf = surf(X, Y, Z);
shading interp;
material('metal');
colormap('copper');
% 创建动态光源
for angle = 0:10:360
% 清除之前的光源
delete(findobj(gca, 'Type', 'light'));
% 计算光源位置
x_light = 3 * cos(deg2rad(angle));
y_light = 3 * sin(deg2rad(angle));
% 添加新光源
light('Position', [x_light, y_light, 3]);
title(sprintf('动态光照 (角度: %d°)', angle));
axis equal;
drawnow;
pause(0.1);
end
运行结果:

参数选择指南
光照参数建议
- Position: 通常设在对象的右上前方,如
[2, 2, 3] - Color: 白光
[1,1,1]最自然,彩色光可创造特殊效果 - Style:
'infinite'适合大多数情况
材质参数建议
- 科学数据: 使用
'default'或'dull' - 演示展示: 使用
'shiny'或'metal' - 自定义: 环境光0.2-0.4,漫反射0.6-0.8,镜面反射0.2-0.9
颜色映射建议
- 温度数据: 使用
'hot'或'cool' - 地形数据: 使用
'terrain'或自定义绿-棕色 - 通用数据: 使用
'parula'或'jet'
透明度建议
- 多层显示: 0.3-0.7范围
- 突出重点: 背景 0.2 − 0.4 0.2-0.4 0.2−0.4,重点 0.8 − 1.0 0.8-1.0 0.8−1.0
- 玻璃效果: 0.1 − 0.3 0.1-0.3 0.1−0.3范围
上述例程综合在一个mlx文件中,文件下载链接如下:
通过网盘分享的文件:draw_3dim_2.mlx
链接: https://pan.baidu.com/s/1vVgmdK1ukN5OMYpDehV1HQ?pwd=p7si 提取码: p7si
如需帮助,或有导航、定位滤波相关的代码定制需求,请点击下方卡片联系作者
3万+

被折叠的 条评论
为什么被折叠?



