资源描述:
《一个简单的三维程序》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库。
1、一个简单的三维程序/*这是一个简单的三维引擎程序,模仿三个天体的运动,一个行星绕轴自转,两个卫星分别绕行星的经线和纬线做公转。(在turboc3.0下编译成功)*/#include#include#include#include#include#include#include#include#include#include#defineESC27#defineF80//此数
2、表示通常情况下操作者离电脑的距离(80厘米)#defineHIGHT480//屏幕纵向分辩率#defineWIDE640//屏幕横向分辨率#definePAI3.1415926//圆周率#defineTIME0.05//转动间隔时间(每0.2秒转动5度)typedefstruct{floatx;floaty;}_2D;//二维坐标点typedefstruct{floatx;floaty;floatz;}_3D;//三维坐标点typedefstruct{intanglex;intangley;intanglez;}Axle;//轴向量(anglex,y
3、,z分别表示向量与x,y,z轴的夹角)typedefstruct{//纬度圈由赤道加上南北半球的各四个纬度圈共9个纬度圈组成,经度等分成10个圈//所以用二维数组g[9][10]来记录经纬度交点_3D*g[9][10];//temp[9][10]用来记录g[9][10]各点从三维变换到二维时的坐标_2D*temp[9][10];_3D*center;//自转中心坐标,即球心坐标_3D*round_center;//公转中心坐标floatr;//球体半径}Globe;//球体floatObserve_Mat[4][4],World_Mat[4][4];
4、//观察坐标矩阵与世界坐标矩阵floatSin[360],Cos[360];//存放三角函数值的两个数组,可以减少大量的浮点运算,以提高效率size_tSize2D,Size3D,Sizeaxle,Sizeglobe;//各结构体的尺寸_3D*Observe;//观察者所在的位置坐标Globe*Moon1,*Moon2,*Earth;//卫星1,卫星2,地球三个球体intZangle=5;//转动角速度//建立三角函数表voidcreate_table(){inti;for(i=0;i<360;i++){Sin[i]=sin(i*PAI/180);C
5、os[i]=cos(i*PAI/180);}}//初始化观察者位置voidinit_observe(){Observe=(_3D*)malloc(Size3D);Observe->x=160;Observe->y=0;Observe->z=0;}//把单位矩阵赋值给目标矩阵voidto_EMat(floatmat[4][4]){inti,j;for(i=0;i<4;i++)for(j=0;j<4;j++)mat[i][j]=0;for(i=0;i<4;i++)mat[i][i]=1;}//把三维坐标点1的值赋给点2void_3D_cpy(_3D*po
6、int1,_3D*point2){point1->x=point2->x;point1->y=point2->y;point1->z=point2->z;}//把二维坐标点1的值赋给点2void_2D_cpy(_2D*point1,_2D*point2){point1->x=point2->x;point1->y=point2->y;}//初始化各结构体的尺寸voidinit_size(){Size2D=sizeof(_2D);Size3D=sizeof(_3D);Sizeaxle=sizeof(Axle);Sizeglobe=sizeof(Glob
7、e);}//初始化观察坐标矩阵与世界坐标矩阵(设定为单位矩阵)voidinit_Mat(){inti,j;for(i=0;i<4;i++)for(j=0;j<4;j++){Observe_Mat[i][j]=0;World_Mat[i][j]=0;}for(i=0;i<4;i++){Observe_Mat[i][i]=1;World_Mat[i][i]=1;}}//矩阵1乘矩阵2得到矩阵3voidmat_mult(floatmat1[4][4],floatmat2[4][4],floatmat3[4][4]){inti,j;for(i=0;i<4;i
8、++)for(j=0;j<4;j++)mat3[i][j]=mat1[i][0]*mat2[0][j]+ma