/*********************************************************************** 功 能:实现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; //itensity;

 // 先分别计算4个顶点的漫反射光强
 double I1 = Kd * Ip * max(0.0, DotProduct(Normals[0], NormalizeVector(SubtractVectors(lightPos, Vertices[0]))));
 double I2 = Kd * Ip * max(0.0, DotProduct(Normals[1], NormalizeVector(SubtractVectors(lightPos, Vertices[1]))));
 double I3 = Kd * Ip * max(0.0, DotProduct(Normals[2], NormalizeVector(SubtractVectors(lightPos, Vertices[2]))));
 double I4 = Kd * Ip * max(0.0, DotProduct(Normals[3], NormalizeVector(SubtractVectors(lightPos, Vertices[3]))));

 // 判断点Pt是否在四边形内部
 double uv[4];
 if (!BilinearInterpolation(Vertices, Pt, uv)) {
	 return 0;
 }

 // 根据差值系数计算点Pt的漫反射光强
 I = I1 * (1 - uv[0] - uv[1] + uv[0]*uv[1]) + I2 * (uv[0] - uv[0]*uv[1]) + I3 * uv[0]*uv[1] + I4 * (uv[1] - uv[0]*uv[1]);

 return I;

}

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

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

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