【MATLAB绘图进阶教程】(2-5)光照材质与颜色控制详解,包含命令:light, material, shading,colormap, alpha,附例程

在这里插入图片描述

本文给出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.20.4,重点 0.8 − 1.0 0.8-1.0 0.81.0
  • 玻璃效果: 0.1 − 0.3 0.1-0.3 0.10.3范围

上述例程综合在一个mlx文件中,文件下载链接如下:
通过网盘分享的文件:draw_3dim_2.mlx
链接: https://pan.baidu.com/s/1vVgmdK1ukN5OMYpDehV1HQ?pwd=p7si 提取码: p7si

如需帮助,或有导航、定位滤波相关的代码定制需求,请点击下方卡片联系作者

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

MATLAB卡尔曼

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值