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; //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;
}
原文地址: https://www.cveoy.top/t/topic/lUPL 著作权归作者所有。请勿转载和采集!