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

发布时间:2023年12月31日

实验目的及要求:

  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; % 将光源移到后方

结果分析:

简单光照模型

改变光源位置

文章来源:https://blog.csdn.net/m0_64429340/article/details/135303590
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。