在一个三维系统中,要根据时间确定太阳位置,并将此位置设置为具体的光源
以产生真实光照及阴影效果
太阳的直射点经纬度计算方法如下:
根据基础的地理知识,
纬度:太阳高度角为90度的地方的纬度
经度:当地时间为正午12点的地方的经度
经度比较好算,一天24小时,地球360度,
经度每差一度,时间差4分钟
经度几乎是每分钟都会变化的,纬度则是每天变化
先来看看经度的计算方法
EXPORT double CALLBACK CalcLongitude(double currLong,double currTime) { double res = 0.0; if(currLong>=0) { res = (12.0 - currTime)*15.0+currLong; if(res>180.0) { res -= 360.0; } } else { res = currLong - (currTime - 12.0)*15.0; if(res<-180.0) res += 360.0; } return res; }
纬度的计算方法,参考网上的python代码改编过来的
具体的参数也是不懂,不过实际测试了一下,与实际情况一致
int CalcDay(int year,int month,int day) { int leap=0; if((year%4==0 && year%100 !=0) || year%400 ==0) { leap = 1; } else { leap = 0; } int mm[12]= {0,31,leap+59,leap+90,leap+120,leap+151,leap+181,leap+212,leap+243,leap+273,leap+304,leap+334}; return mm[month-1]+day; } EXPORT double CALLBACK CalcLatitude(int year,int month,int day) { double tick = CalcDay(year,month,day) - 79.6764-0.2422*(year-1985)+int((year-1985)/4); double sita = 2*3.14159265*tick/365.2422; double delta = 0.3723+23.2567*sin(sita) +0.1149*sin(2*sita)-0.1712*sin(3*sita) -0.758*cos(sita)+0.3656*cos(2*sita) +0.0201*cos(3*sita); return delta; }