先根据经纬度计算出球面上各点,再把球分成很多小三角形,其中两极除外的四边形也分成上下二个三角形,画三角形(设为P0P1P2)时,每个点计算该面本身(pl),下面(Pdown),右面(Pright),右下面(Pdownright),求光照时,根据每个点到光源位置的经衰减后得到光线颜色,再分别计算环境光,漫反射光,镜面反射光,加点该点的颜色上(点的颜色是该点右下面的颜色,与距离衰减系数(f[i]=1.0/(c0+c1*dist[i]+c2*dist[i]*dist[i]))和面相对光源的正对率(dCosc=Dot(Lv,N1))成正比,计算时也要检测光源是否能够照到该点上,如果光照不到点上则比率为0),然后再将三维点投影到二维平面上,再根据该面是否消隐来填充三角形.
不过该程序中可能存在问题: 程序中的Lv是从原心(0,0,0)到光源lightP的一个向量,即光源的点坐标.改进方法是:对四个面,每个面添加一个中心(或其中某个点)M,令Lv=lightP-M即可.不过,程序把照到各面上的光当成平行光也未尝不可.
画三角形的源代码如下:
void CTestView::Triangle(CDC *mdc,P3d *p,bool First)//三角形面片
{
Vector vP10(P1[0]),vP11(P1[1]),vP12(P1[2]);//