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