/********************************************************************** 功 能: 实现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; //intensity double I_v[4]; //intensity at each vertex double L[3]; //light vector double N[3]; //normal vector double R[3]; //reflected vector double V[3]; //viewing vector double distance; //distance between light and vertex double cosTheta; //cosine of angle between light and normal double cosAlpha; //cosine of angle between reflected vector and viewing vector double diffuse; //diffuse reflection coefficient double specular; //specular reflection coefficient double uv[4]; //interpolation coefficients

//calculate intensity at each vertex
for (int i = 0; i < 4; i++)
{
	//calculate light vector
	L[0] = lightPos[0] - Vertices[i][0];
	L[1] = lightPos[1] - Vertices[i][1];
	L[2] = lightPos[2] - Vertices[i][2];

	//calculate distance between light and vertex
	distance = sqrt(L[0] * L[0] + L[1] * L[1] + L[2] * L[2]);

	//normalize light vector
	L[0] /= distance;
	L[1] /= distance;
	L[2] /= distance;

	//calculate normal vector
	N[0] = Normals[i][0];
	N[1] = Normals[i][1];
	N[2] = Normals[i][2];

	//calculate cosine of angle between light and normal
	cosTheta = L[0] * N[0] + L[1] * N[1] + L[2] * N[2];

	//calculate diffuse reflection coefficient
	diffuse = Kd * cosTheta;

	//calculate reflected vector
	R[0] = 2 * cosTheta * N[0] - L[0];
	R[1] = 2 * cosTheta * N[1] - L[1];
	R[2] = 2 * cosTheta * N[2] - L[2];

	//calculate viewing vector
	V[0] = Pt[0] - Vertices[i][0];
	V[1] = Pt[1] - Vertices[i][1];
	V[2] = Pt[2] - Vertices[i][2];

	//normalize viewing vector
	distance = sqrt(V[0] * V[0] + V[1] * V[1] + V[2] * V[2]);
	V[0] /= distance;
	V[1] /= distance;
	V[2] /= distance;

	//calculate cosine of angle between reflected vector and viewing vector
	cosAlpha = R[0] * V[0] + R[1] * V[1] + R[2] * V[2];

	//calculate specular reflection coefficient
	specular = Ks * pow(cosAlpha, n);

	//calculate intensity at vertex i
	I_v[i] = Ip * (diffuse + specular);
}

//perform bilinear interpolation to get intensity at point Pt
if (BilinearInterpolation(Vertices, Pt, uv))
{
	for (int i = 0; i < 4; i++)
	{
		I += I_v[i] * uv[i];
	}
}
else
{
	I = I_v[0];
}

return I;
Phong光照模型实现 - 计算给定点的漫放射光强

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

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