真实感图形程序设计 建立球体模型,编程实现简单光照模型(环境光、漫反射、镜面反射光)对球体的光照影响效果;实现光源位置的改变,对球体的光照影响效果。

实验目的及要求:

  1. 建立球体模型,编程实现简单光照模型(环境光、漫反射、镜面反射光)对球体的光照影响效果;
  2. 实现光源位置的改变,对球体的光照影响效果。

软硬件环境:

  1. 硬件:戴尔笔记本一台
  2. 软件:MATLAB

算法或原理分析(实验内容):

1.Phong算法中影响光照的三个因素

环境光(Ambient):可以理解为现实中的白天的室内,白天在室内我们能看的见物体,但是并没有感知光线的方向,其实是因为太阳离我们太远了,导致我们周围的光线强度都是一样的。

漫反射(Diffuse):面向光源的表面更亮。

镜面反射(Specular):模拟光在抛光或金属表面的反射

其实最终我们就是要计算出一个影响颜色的因子,在执行片段着色器程序时用这个变量fragColor去乘以该因子,进而根据接收的光线将颜色设置得更亮或更暗。将场景中对其他光的影响因素环境光、漫反射、镜面反射分别叫做A、D、S,则计算那个影响颜色的因子可以用下面公式来表示。

如果模型没有纹理,将按照下面这个公式去算:

有纹理,将按照下面这个公式去算:

环境光(Ambient)对光线的影响

它只是一个常数因素,可以使我们所有的物体更亮或更暗。环境光是最容易计算一种影响因素。我们只需要传递一种颜色,用它乘以模型的基色,它只是调制基色。所以我们只需要一个矢量来调制环境光强度和颜色。

漫反射(Diffuse)对光的影响

以点光源为例:假设有一个光源照在一个物体上,面向光源的一面整体会比背向光源的一面更亮

对于漫反射的计算,首先在上图中的物体上取几个顶点位置P1、P2、P3,相应的顶点法向量为N1、N2、N3。顶点法向量是垂直于每个点的切平面的矢量。如下:

在上图中可以很明显的看出来,P1位置一定比P2更亮,P3基本不会受到该光源的影响。而P1位置比P2更亮是因为,P1受到的光照是从该顶点的正上方照射过来的,而P2受到的光线是比正上方稍微偏了一些。所以我们在计算每个顶点的漫反射影响因子时,顶点的法向量与该点受到光线的夹角是影响明暗的一个因素。

镜面反射对光的影响

当光线照射到表面时,它的某些部分被吸收而另一部分被反射,反射就是光线从物体上反射回来。镜面反射如下:

将空间中的观察点,比作相机(Camera)对于镜面反射,最重要的是要注意,只有当相机处于适当的位置时,反射光才会可见。

2.光源位置改变:

光源位置对光照方向的影响:光源的位置决定了光线的方向。当光源位于球体的左侧时,光线从左侧照射到球体,球体左侧会更加明亮。当光源位于球体的上方时,光线从上方照射到球体,球体上方会更加明亮。同理,当光源位于球体的下方或后方时,球体的下方或后方会更加明亮。

光源距离对光照强度的影响:光源距离球体的远近也会影响光照的强度。当光源距离球体较近时,球体上的光照强度会更强,反之则较弱。

光源颜色对光照颜色的影响:光源的颜色也会影响球体被照亮的颜色。例如,当使用红色光源时,球体被照亮的部分会呈现红色。

程序代码或实现过程:

1.[x, y, z] = sphere(50); % 创建一个球体模型 

figure

h = surf(x, y, z); % 设置光照属性

set(h, 'AmbientCoefficient', 500); % 环境光系数

set(h, 'DiffuseCoefficient', 5); % 漫反射系数

set(h, 'SpecularCoefficient', 500); % 镜面反射系数

set(h, 'SpecularPower', 200); % 镜面反射光的模糊程度

lighting gouraud;

camlight right;

colormap('gray'); % 调整光照方向和颜色

shading interp;

axis off;

view(3); % 显示图形

2.close all

[x,y,z] = sphere(40);

colormap(jet)

subplot(1,2,1);

surf(x,y,z),shading interp

light('position',[2,-2,2],'style','local')

lighting phong

title('phong')

subplot(1,2,2)

surf(x,y,z,-z),shading flat

lighting flat

light('position',[-1,0.5,1],'style','local','color','w')

title('flat')

% 更改光源位置 

camlight left; % 将光源移到左侧

camlight above; % 将光源移到上方

camlight below; % 将光源移到下方

camlight behind; % 将光源移到后方

结果分析:

简单光照模型

改变光源位置

最近更新

  1. TCP协议是安全的吗?

    2024-01-01 23:06:01       16 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-01-01 23:06:01       16 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-01-01 23:06:01       15 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-01-01 23:06:01       18 阅读

热门阅读

  1. k8s部署 CNI 网络组件与k8s集群搭建(二)

    2024-01-01 23:06:01       35 阅读
  2. Dubbo

    Dubbo

    2024-01-01 23:06:01      37 阅读
  3. Prometheus监控redis

    2024-01-01 23:06:01       44 阅读
  4. python并发编程

    2024-01-01 23:06:01       36 阅读
  5. Python异步编程与协程:魔法的快舞

    2024-01-01 23:06:01       39 阅读
  6. 【人工智能Ⅰ】AI课后习题

    2024-01-01 23:06:01       29 阅读
  7. 科普:敏捷估算为什么用斐波那契数列

    2024-01-01 23:06:01       28 阅读
  8. 算法训练营Day29

    2024-01-01 23:06:01       38 阅读
  9. 编码(Encoding)

    2024-01-01 23:06:01       39 阅读
  10. Python期末复习资料

    2024-01-01 23:06:01       29 阅读
  11. 鸟瞰UML(上)

    2024-01-01 23:06:01       27 阅读
  12. 算法题明明的随机数

    2024-01-01 23:06:01       40 阅读