Phong光照模型漫放射光强计算函数
/*********************************************************************** 功 能:实现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;
}
原文地址: https://www.cveoy.top/t/topic/lUWS 著作权归作者所有。请勿转载和采集!