/**********************************************************************

  • 功 能:实现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;

    //学生添加代码 return I;

} */

// 根据功能要求补全phong函数代码并添加注释内容: 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;

// 计算光线向量
double L[3];
L[0] = lightPos[0] - Pt[0];
L[1] = lightPos[1] - Pt[1];
L[2] = lightPos[2] - Pt[2];

// 计算光线向量的模长
double L_len = sqrt(L[0]*L[0] + L[1]*L[1] + L[2]*L[2]);

// 归一化光线向量
L[0] /= L_len;
L[1] /= L_len;
L[2] /= L_len;

// 计算法向量
double N[3];
double uv[4];
if(BilinearInterpolation(Vertices, Pt, uv))
{
	N[0] = uv[0]*Normals[0][0] + uv[1]*Normals[1][0] + uv[2]*Normals[2][0] + uv[3]*Normals[3][0];
	N[1] = uv[0]*Normals[0][1] + uv[1]*Normals[1][1] + uv[2]*Normals[2][1] + uv[3]*Normals[3][1];
	N[2] = uv[0]*Normals[0][2] + uv[1]*Normals[1][2] + uv[2]*Normals[2][2] + uv[3]*Normals[3][2];

	// 计算法向量的模长
	double N_len = sqrt(N[0]*N[0] + N[1]*N[1] + N[2]*N[2]);

	// 归一化法向量
	N[0] /= N_len;
	N[1] /= N_len;
	N[2] /= N_len;

	// 计算漫反射光强
	I = Ip * Kd * (L[0]*N[0] + L[1]*N[1] + L[2]*N[2]);
	if(I < 0)   // 光强不能为负数
		I = 0;
}

return I;

}

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

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

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