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

 //计算四个顶点的光强
 double I1 = Kd * Ip * max(0.0, DotProduct(Normals[0], Normalize(SubtractVectors(lightPos, Vertices[0]))));
 double I2 = Kd * Ip * max(0.0, DotProduct(Normals[1], Normalize(SubtractVectors(lightPos, Vertices[1]))));
 double I3 = Kd * Ip * max(0.0, DotProduct(Normals[2], Normalize(SubtractVectors(lightPos, Vertices[2]))));
 double I4 = Kd * Ip * max(0.0, DotProduct(Normals[3], Normalize(SubtractVectors(lightPos, Vertices[3]))));

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

 //根据差值系数计算点Pt的光强
 I = uv[0] * I1 + uv[1] * I2 + uv[2] * I3 + uv[3] * I4;

 return I;

}

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

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

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