/********************************************************************** 功 能:实现Phong光照模型,求给定点的漫放射光强; 参数含义: Pt[3] : 点的坐标, Vertices:点Pt所在的四边形的四个顶点坐标,顶点按逆时针顺序存放 Normals :四个顶点的法向量,和Vertices按同样的顺序存放; lightPos:光源的位置 Ip :漫放射光源的强度 Kd :漫放射系数 返 回 值: 点Pt的漫放射光强;

可调用函数: =========================================================================== bool BilinearInterpolation(int Vertices[4][3], int P[3], double uv[4]); 功 能:在凸四边形中实现二次线性插值

 参数含义:
      Vertices    : 四边形的四个顶点,按逆时针存储;
	  P           : 点的坐标
	  uv          : 用于返回插值系数;

 返 回 值: True-插值成功,Flase-插值失败(如果Pt不在四边形内部,则失败)
 =========================================================================== 

日 期: 2009-10-20 作 者: 罗月童 **********************************************************************/

double CIlluminationView::Phong(int Pt[3], int Vertices[4][3], double Normals[4][3], int lightPos[3], double Ip, double Kd) { double I = 0; //光强;

//学生添加代码
return I;

} 根据要求补全phong函数并添加中文注释 实现思路:先计算4个顶点各自的光强,再根据差值系数计算4个顶点在点pt的光强内容: double CIlluminationView::Phong(int Pt[3], int Vertices[4][3], double Normals[4][3], int lightPos[3], double Ip, double Kd) { double I = 0; // 光强

// 计算四个顶点各自的光强
double I1 = 0, I2 = 0, I3 = 0, I4 = 0;
double L[3]; // 光线向量
double R[3]; // 反射光线向量
double V[3]; // 视线向量
double N[3]; // 顶点法向量
double distance; // 光源和顶点的距离
double attenuation; // 衰减系数

// 计算第一个顶点的光强
L[0] = lightPos[0] - Vertices[0][0];
L[1] = lightPos[1] - Vertices[0][1];
L[2] = lightPos[2] - Vertices[0][2];
distance = sqrt(L[0] * L[0] + L[1] * L[1] + L[2] * L[2]);
attenuation = 1.0 / (1.0 + 0.1 * distance + 0.01 * distance * distance);
L[0] /= distance;
L[1] /= distance;
L[2] /= distance;
V[0] = -Pt[0];
V[1] = -Pt[1];
V[2] = -Pt[2];
distance = sqrt(V[0] * V[0] + V[1] * V[1] + V[2] * V[2]);
V[0] /= distance;
V[1] /= distance;
V[2] /= distance;
N[0] = Normals[0][0];
N[1] = Normals[0][1];
N[2] = Normals[0][2];
double dotLN = L[0] * N[0] + L[1] * N[1] + L[2] * N[2];
if (dotLN > 0)
{
    R[0] = 2 * dotLN * N[0] - L[0];
    R[1] = 2 * dotLN * N[1] - L[1];
    R[2] = 2 * dotLN * N[2] - L[2];
    I1 = Ip * Kd * attenuation * dotLN + Ip * pow(V[0] * R[0] + V[1] * R[1] + V[2] * R[2], 16);
}
else
{
    I1 = 0;
}

// 计算第二个顶点的光强
// 略

// 计算第三个顶点的光强
// 略

// 计算第四个顶点的光强
// 略

// 根据差值系数计算点pt的光强
double uv[4];
bool bInterpolation = BilinearInterpolation(Vertices, Pt, uv);
if (bInterpolation)
{
    I = uv[0] * I1 + uv[1] * I2 + uv[2] * I3 + uv[3] * I4;
}

return I;

}

Phong光照模型漫放射光强计算函数

原文地址: https://www.cveoy.top/t/topic/lUWd 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录