版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、 C语言游戏模型(飞机)编程实现 用C语言编写一个有关飞机的小游戏,首先要解决游戏中主要元素:飞机模型的屏幕绘图。是绘二维平面图还是绘三维立体图?下面用三维立体图绘制它,如下图所示: 图1、飞机模型图 图2、飞机模型图上面两幅图是在VC6中用OpenGL函数绘制的屏幕三维飞机模型,它的表面数据用双二次Nurbs曲面生成。、光(光照)在屏幕上绘制的三维图形,要用光照亮它同而产生明暗变化,才能使绘制的图形更能真实地再现要生成的物体。在OpenGL函数里有专门用于光照的函数,只要调用它们就能还原一个真实的模似三维世界。二、Nurbs曲面 生成曲面的一种算法,这里主要用的是双二次曲面。程序中飞机机身的
2、设计基本上是一个圆柱体。用7个顶点表示的一个正方形利用NURBS二次圆弧构成一个整圆,描绘圆柱体的外形数据。下面是一个双二次NURBS曲面和曲线的算法源程序:#include glgl.h#include math.h/*-*-*-*-*-*-*-*-*-*-*-*-*-*-* B样条基函数计算部分*-*-*-*-*-*-*-*-*-*-*-*-*-*/计算所有非零B样条基函数并返回其值/i为参数u所在的节点区间下标void BasisFunction(int i,int p,float u,float U,float N) int j,di,dp,k;float tul,tur,left,r
3、ight;float tmpN5050;for(k=0;k=i-k;di-)if(u=Udi&uUdi+1)tmpNdi0=1; else tmpNdi0=0; dp+=1; for(j=1;jdp;j+) tul=Udi+j-Udi; tur=Udi+j+1-Udi+1; if(tul!=0) left=(u-Udi)/tul; else left=0; if(tur!=0) right=(Udi+j+1-u)/tur; else right=0; tmpNdij=left*tmpNdij-1+right*tmpNdi+1j-1; Ni-k=tmpNi-kp; /*-*-*-*-*-*-*-
4、*-*-*-*-*-*-* Bezier曲线曲面部分*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*void BernsteinFunc(int n,double u,float B) double u1; int j,k; B0=1.0; u1=1.0-u; for(j=1;j=n;j+) float saved=0.0; for(k=0;kj;k+) float temp=Bk; Bk=float(saved+u1*temp); saved=float(u*temp); Bj=saved; /获取p次Bezier曲线上的lines个点的值void BezierPoint(
5、int p,float px,float py,float pz,int lines,float tmp3)float BC20;int i,j; for(j=0;j=lines;j+) double t=j/(float)lines; BernsteinFunc(p,t,BC); tmpj0=tmpj1=tmpj2=0; for(i=0;ip+1;i+)tmpj0+=BCi*pxi; tmpj1+=BCi*pyi; tmpj2+=BCi*pzi;/获取p次有理Bezier曲线上的lines个点的值void NBezierPoint(int p,float px,float py,float
6、pz,float pw,int lines,float tmp4)float x,y,z,w,BC20;int i,j; for(j=0;j=lines;j+) double t=j/(float)lines; BernsteinFunc(p,t,BC); x=y=z=w=0; for(i=0;ip+1;i+)x+=BCi*pxi*pwi; y+=BCi*pyi*pwi; z+=BCi*pzi*pwi; w+=BCi*pwi; tmpj0=x/w; tmpj1=y/w; tmpj2=z/w; tmpj3=w;/-/绘制p次的Bezier曲线void Bezier(int p,float px,
7、float py,float pz,int lines)float pt1003;int j; BezierPoint(p,px,py,pz,lines,pt);for(j=1;j=lines;j+) glBegin(GL_LINES); glVertex3f(ptj-10,ptj-11,ptj-12); glVertex3f(ptj0,ptj1,ptj2); glEnd();/-/绘制p次的有理Bezier曲线void NBezier(int p,float px,float py,float pz,float w,int lines)float pt1004;int j; NBezierP
8、oint(p,px,py,pz,w,lines,pt);for(j=1;j=lines;j+) glBegin(GL_LINES); glVertex3f(ptj-10,ptj-11,ptj-12); glVertex3f(ptj0,ptj1,ptj2); glEnd();/-/计算双p次Bezier曲面上所有的点并保存在Pt中/u和v分别为曲面(u,v)方向上的网格数void BezierFacePoint(int p,int u,int v,float px4,float py4,float pz4,float pt1611613)float urx11161,ury11161,urz11
9、161;float tx11,ty11,tz11,tmp1613;int i,j,k; for(j=0;jp+1;j+)for(i=0;ip+1;i+)txi=pxij; tyi=pyij; tzi=pzij; BezierPoint(p,tx,ty,tz,v,tmp); for(k=0;k=v;k+) urxjk=tmpk0; uryjk=tmpk1; urzjk=tmpk2; for(i=0;i=v;i+)for(k=0;kp+1;k+) txk=urxki; tyk=uryki; tzk=urzki; BezierPoint(p,tx,ty,tz,u,tmp); for(j=0;j=u;
10、j+) ptij0=tmpj0; ptij1=tmpj1; ptij2=tmpj2;/-/计算双p次有理Bezier曲面上所有的点并保存在Pt中/u和v分别为曲面(u,v)方向上的网格数void NuBezierFacePoint(int p,int u,int v,float px4,float py4,float pz4,float w4,float pt1611613)float urx11161,ury11161,urz11161,urw11161;float tx11,ty11,tz11,tw11,tmp1614;int i,j,k; for(j=0;jp+1;j+)for(i=0;
11、ip+1;i+) txi=pxij; tyi=pyij; tzi=pzij; twi=wij; NBezierPoint(p,tx,ty,tz,tw,v,tmp); for(k=0;k=v;k+) urxjk=tmpk0; uryjk=tmpk1; urzjk=tmpk2; urwjk=tmpk3; for(i=0;i=v;i+)for(k=0;kp+1;k+)txk=urxki; tyk=uryki; tzk=urzki; twk=urwki; NBezierPoint(p,tx,ty,tz,tw,u,tmp); for(j=0;j=u;j+) ptij0=tmpj0; ptij1=tmpj
12、1; ptij2=tmpj2;/-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-* B样条曲线曲面部分-*-*-*-*-*-*-*-*-*-*-*-*-*-*-/计算曲线上的点(u所对应的所有点)保存在Poi中/n=m-p-1/p为曲线的次数void BSplinePoint(int n,int p,float U,float P,float Poi)float N100,tmp; int i,j; for(i=p+1;i=i-p;j-)tmp+=Nj*Pj;Poii-p=tmp;/计算次样条曲线上的所有控制多边形保存在CP中/m为节点矢量U的最大下标void B2SplineC
13、ontrolPoint(int m,float U,float P,float CP)int n,k,tm,i,cp,p;float Poi100;p=2;n=m-p-1;BSplinePoint(n,p,U,P,Poi);cp=(n-p)*2+p;for(i=0;i2;i+)CPi=Pi;CPcp=Pn;tm=2;for(i=2;icp-1;i+=2) k=(int)i/2;CPi=Poik;CPi+1=Ptm;tm+;/绘制次B样条曲线/m为节点矢量U的最大下标void BSpline2L(int m,float U,float px,float py,float pz)float pcx
14、100,pcy100,pcz100,drx3,dry3,drz3;int i,j,tmcp;B2SplineControlPoint(m,U,px,pcx);B2SplineControlPoint(m,U,py,pcy);B2SplineControlPoint(m,U,pz,pcz);tmcp=m-5;for(i=0;i=tmcp;i+)for(j=i*2;ji*2+3;j+)drxj-i*2=pcxj;dryj-i*2=pcyj;drzj-i*2=pczj;Bezier(2,drx,dry,drz,20);/计算双二次(x2)B样条曲面所有控制多边形顶点,并保存在pt中/mu,mv分别为
15、节点矢量U,V的最大下标值void BS2FaceControlPoint(int mu,float U,int mv,float V,float px,float py,float pz,float pt1001003)int i,j,k,dp;float tmx50,tmy50,tmz50;float tmpx50100,tmpy50100,tmpz50100;float uvx100100,uvy100100,uvz100100;for(i=0;imv-2;i+)dp=i*(mu-2);for(j=dp;jmu-2+dp;j+)tmxj-dp=pxj;tmyj-dp=pyj;tmzj-d
16、p=pzj;B2SplineControlPoint(mu,U,tmx,tmpxi);B2SplineControlPoint(mu,U,tmy,tmpyi);B2SplineControlPoint(mu,U,tmz,tmpzi);for(i=0;i2*mu-7;i+)for(j=0;jmv-2;j+)tmxj=tmpxji;tmyj=tmpyji;tmzj=tmpzji;B2SplineControlPoint(mv,V,tmx,uvxi);B2SplineControlPoint(mv,V,tmy,uvyi);B2SplineControlPoint(mv,V,tmz,uvzi);for
17、(k=0;k2*mv-7;k+)ptik0=uvxik;ptik1=uvyik;ptik2=uvzik;/-/设置网格数void SetGridCount(int dt,int tu,int tmk)int i,tm;tm=tu%dt;for(i=0;idt-1;i+) tmki=(tu-tm)/dt;tmkdt-1=tmk0+tm;/-/计算双二次(2x2次)B样条曲面上所有的点并保存在bs中/nu,mv分别为节点矢量U,V的最大下标/uk,vk分别为B样条曲面(u,v)方向上的网格数/p为曲面的次数void BSplineFace2P(int nu,float U,int uk,int m
18、v,float V,int vk, float px,float py,float pz,float bs1611613)int udk20,vdk20,i,j,k,l,hu,sv,du,dv,p=2;float tp1001003,td1611613;float tmx44,tmy44,tmz44;du=nu-2*p;dv=mv-2*p; SetGridCount(du,uk,udk); SetGridCount(dv,vk,vdk); BS2FaceControlPoint(nu,U,mv,V,px,py,pz,tp);for(i=0;idv;i+)for(k=0;kdu;k+)for(j
19、=i*p;jp+1+i*p;j+)for(l=k*p;lp+1+k*p;l+)tmxj-i*pl-k*p=tplj0; tmyj-i*pl-k*p=tplj1; tmzj-i*pl-k*p=tplj2; BezierFacePoint(p,udkk,vdki,tmx,tmy,tmz,td); for(sv=i*vdk0;sv=vdki+i*vdk0;sv+)for(hu=k*udk0;hu=udkk+k*udk0;hu+)bssvhu0=tdsv-i*vdk0hu-k*udk00; bssvhu1=tdsv-i*vdk0hu-k*udk01; bssvhu2=tdsv-i*vdk0hu-k*u
20、dk02;/-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-* Nurbs 样条曲线曲面部分-*-*-*-*-*-*-*-*-*-*-*-*-*-*-/计算Nurbs曲线上的点(u所对应的所有点)保存在Poi中/n=m-p-1/p为曲线的次数void NurbsPoint(int n,int p,float U,float P,float W,float Poi)float N100,tmp,tmw; int i,j; for(i=p+1;i=i-p;j-)tmp+=Nj*Pj*Wj;tmw+=Nj*Wj;Poii-p=tmp/tmw;/计算次Nurbs曲线上的所有控制多边形保存
21、在CP中/m为节点矢量U的最大下标void Nurbs2ControlPoint(int m,float U,float P,float W,float CP)int n,k,tm,i,cp,p;float Poi100;p=2;n=m-p-1;NurbsPoint(n,p,U,P,W,Poi);cp=(n-p)*2+p;for(i=0;i2;i+)CPi=Pi;CPcp=Pn;tm=2;for(i=2;icp-1;i+=2) k=(int)i/2;CPi=Poik;CPi+1=Ptm;tm+;/绘制次Nurbs样条曲线/m为节点矢量U的最大下标void Nurbs2L(int m,float
22、 U,float px,float py,float pz,float W)float pcx100,pcy100,pcz100,drx3,dry3,drz3;float pcw100,drw3;int i,j,tmcp;Nurbs2ControlPoint(m,U,px,W,pcx);Nurbs2ControlPoint(m,U,py,W,pcy);Nurbs2ControlPoint(m,U,pz,W,pcz);B2SplineControlPoint(m,U,W,pcw);tmcp=m-5;for(i=0;i=tmcp;i+)for(j=i*2;ji*2+3;j+)drxj-i*2=pc
23、xj;dryj-i*2=pcyj;drzj-i*2=pczj;drwj-i*2=pcwj;NBezier(2,drx,dry,drz,drw,20);/计算双二次(x2)Nurbs样条曲面所有控制多边形顶点,并保存在pt中/mu,mv分别为节点矢量U,V的最大下标值void Nurbs2FControlPoint(int mu,float U,int mv,float V,float px,float py,float pz,float W,float pt1001004)int i,j,k,dp;float tmx50,tmy50,tmz50,tmw50;float tmpx50100,tm
24、py50100,tmpz50100,tmpw50100;float uvx100100,uvy100100,uvz100100,uvw100100;for(i=0;imv-2;i+)dp=i*(mu-2);for(j=dp;jmu-2+dp;j+)tmxj-dp=pxj;tmyj-dp=pyj;tmzj-dp=pzj;tmwj-dp=Wj;Nurbs2ControlPoint(mu,U,tmx,tmw,tmpxi);Nurbs2ControlPoint(mu,U,tmy,tmw,tmpyi);Nurbs2ControlPoint(mu,U,tmz,tmw,tmpzi);B2SplineCont
25、rolPoint(mu,U,tmw,tmpwi);for(i=0;i2*mu-7;i+)for(j=0;jmv-2;j+)tmxj=tmpxji;tmyj=tmpyji;tmzj=tmpzji;tmwj=tmpwji;Nurbs2ControlPoint(mv,V,tmx,tmw,uvxi);Nurbs2ControlPoint(mv,V,tmy,tmw,uvyi);Nurbs2ControlPoint(mv,V,tmz,tmw,uvzi);B2SplineControlPoint(mv,V,tmw,uvwi);for(k=0;k2*mv-7;k+)ptik0=uvxik;ptik1=uvyi
26、k;ptik2=uvzik;ptik3=uvwik;/-/计算双二次(2x2次)Nurbs样条曲面上所有的点并保存在bs中/nu,mv分别为节点矢量U,V的最大下标/uk,vk分别为B样条曲面(u,v)方向上的网格数/p为曲面的次数void NurbsFace(int nu,float U,int uk,int mv,float V,int vk, float px,float py,float pz,float w,float bs1611613)int udk20,vdk20,i,j,k,l,hu,sv,du,dv,p=2;float tp1001004,td1611613;float t
27、mx44,tmy44,tmz44,tmw44;du=nu-2*p;dv=mv-2*p; SetGridCount(du,uk,udk); SetGridCount(dv,vk,vdk); Nurbs2FControlPoint(nu,U,mv,V,px,py,pz,w,tp);for(i=0;idv;i+)for(k=0;kdu;k+)for(j=i*p;jp+1+i*p;j+)for(l=k*p;lp+1+k*p;l+)tmxj-i*pl-k*p=tplj0; tmyj-i*pl-k*p=tplj1; tmzj-i*pl-k*p=tplj2; tmwj-i*pl-k*p=tplj3; NuB
28、ezierFacePoint(p,udkk,vdki,tmx,tmy,tmz,tmw,td); for(sv=i*vdk0;sv=vdki+i*vdk0;sv+) for(hu=k*udk0;hu=udkk+k*udk0;hu+) bssvhu0=tdsv-i*vdk0hu-k*udk00; bssvhu1=tdsv-i*vdk0hu-k*udk01; bssvhu2=tdsv-i*vdk0hu-k*udk02;/*-*-*-*-*-*-*-*-*-*-*-*-*-*-* 绘制曲面部分*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*/计算多边形的外法线返回值tmNvo
29、id getN(float x3,float y3,float z3,float tmN3)float p1,p2,p3,q1,q2,q3;p1=x1-x0;p2=y1-y0;p3=z1-z0;q1=x2-x1;q2=y2-y1;q3=z2-z1;tmN0=p2*q3-q2*p3;tmN1=q1*p3-p1*q3;tmN2=p1*q2-p2*q1;/-/显示B样条曲面/fill取值为或void ShowSurface(int u,int v,float bs1611613,int fill)int i,j;float x3,y3,z3,tmn3;for(i=0;i=v;i+)for(j=0;j
30、=u;j+) if(fill!=0)x0=bsij0; x1=bsi+1j0; x2=bsi+1j+10; y0=bsij1; y1=bsi+1j1; y2=bsi+1j+11; z0=bsij2; z1=bsi+1j2; z2=bsi+1j+12; getN(x,y,z,tmn); glEnable(GL_NORMALIZE); glBegin(GL_QUADS); glNormal3f(tmn0,tmn1,tmn2);glBegin(GL_LINES); if(ju) glVertex3f(bsij0,bsij1,bsij2); glVertex3f(bsij+10,bsij+11,bsi
31、j+12); if(iv) glVertex3f(bsi+1j+10,bsi+1j+11,bsi+1j+12); glVertex3f(bsi+1j0,bsi+1j1,bsi+1j2); glEnd(); glDisable(GL_NORMALIZE);else glBegin(GL_LINES); if(ju) glVertex3f(bsij0,bsij1,bsij2); glVertex3f(bsij+10,bsij+11,bsij+12); if(iv) glVertex3f(bsij0,bsij1,bsij2); glVertex3f(bsi+1j0,bsi+1j1,bsi+1j2);
32、 glEnd(); 三、飞机小游戏编写 图3、游戏效果图战机小游戏简单编写了:主战机的上、下、左、右移动和开炮射击(按空格键);音乐的播放(.wav)。编写了物体碰撞算法:击落敌机、主战机和敌机的碰撞。#include stdafx.h#include Nurbs_2pNurbs.hHWND hwnd;HDC hdc;HGLRC hrc;int mWidth=480;int mHeight=600;char *mWindowClassName=makewindowclass;char *mWindowName=战机;int mKeystate;typedef struct GAMEDATAfl
33、oat x,y;int f_s;FeiJi,ZiDan;FeiJi M_FJ,DIJ_bf50;ZiDan GZD_bf100;int dj_state;int dzindex;unsigned int trx;/飞机机身头部数据float hx=-360,-360,-360,-360,-360,-360,-360, -360,-360,-360,-360,-360,-360,-360, -250,-250,-250,-250,-250,-250,-250, -200,-200,-200,-200,-200,-200,-200, -100,-100,-100,-100,-100,-100,-1
34、00, -50,-50,-50,-50,-50,-50,-50, 0,0,0,0,0,0,0; float hy=0,0,0,0,0,0,0, 0,20,20,0,-20,-20,0, 0,50,50,0,-50,-50,0, 0,60,60,0,-60,-60,0, 0,110,110,0,-60,-60,0, 0,110,110,0,-60,-60,0, 0,100,100,0,-60,-60,0; float hz=0,0,0,0,0,0,0, -20,-20,20,20,20,-20,-20, -50,-50,50,50,50,-50,-50, -60,-60,60,60,60,-60
35、,-60, -60,-60,60,60,60,-60,-60, -60,-60,60,60,60,-60,-60, -60,-60,60,60,60,-60,-60; float HU=0,0,0,0.25,0.5,0.5,0.75,1,1,1; /飞机机身尾部数据float lx=0,0,0,0,0,0,0, 150,150,150,150,150,150,150, 200,200,200,200,200,200,200, 250,250,250,250,250,250,250, 300,300,300,300,300,300,300, 350,350,350,350,350,350,350
36、, 400,400,400,400,400,400,400; float ly=0,100,100,0,-60,-60,0, 0,80,80,0,-60,-60,0, 0,80,80,0,-60,-60,0, 0,70,70,0,-60,-60,0, 0,60,60,0,-60,-60,0, 0,60,60,0,-60,-60,0, 0,40,40,0,-40,-40,0; float lz=-60,-60,60,60,60,-60,-60, -60,-60,60,60,60,-60,-60, -60,-60,60,60,60,-60,-60, -60,-60,60,60,60,-60,-60
37、, -60,-60,60,60,60,-60,-60, -60,-60,60,60,60,-60,-60, -40,-40,40,40,40,-40,-40; float LU=0,0,0,0.25,0.5,0.5,0.75,1,1,1; float w=1,0.5,0.5,1,0.5,0.5,1, 1,0.5,0.5,1,0.5,0.5,1, 1,0.5,0.5,1,0.5,0.5,1, 1,0.5,0.5,1,0.5,0.5,1,1,0.5,0.5,1,0.5,0.5,1,1,0.5,0.5,1,0.5,0.5,1,1,0.5,0.5,1,0.5,0.5,1;/前机翼数据float rx=
38、25,-50,-50,100,100,25, 40,-30,-30,110,110,40, 55,-10,-10,120,120,55, 60,10,10,120,120,60, 80,30,30,130,130,80, 95,95,95,95,95,95; float ry=10,10,-10,-10,10,10, 10,10,-10,-10,10,10, 10,10,-10,-10,10,10, 10,10,-10,-10,10,10, 10,10,-10,-10,10,10, 0,0,0,0,0,0; float rz=60,60,60,60,60,60, 120,120,120,120
39、,120,120, 180,180,180,180,180,180, 240,240,240,240,240,240, 310,310,310,310,310,310, 310,310,310,310,310,310; float rx1=25,100,100,-50,-50,25, 40,110,110,-30,-30,40, 55,120,120,-10,-10,55, 60,120,120,10,10,60, 80,130,130,30,30,80, 95,95,95,95,95,95; float rz1=-60,-60,-60,-60,-60,-60, -120,-120,-120,
40、-120,-120,-120, -180,-180,-180,-180,-180,-180, -240,-240,-240,-240,-240,-240, -310,-310,-310,-310,-310,-310, -310,-310,-310,-310,-310,-310; float RU=0,0,0,0.25,0.50,0.75,1,1,1; /后机翼数据float ex=275,200,200,350,350,275, 290,220,220,360,360,290, 305,240,240,370,370,305, 320,260,260,380,380,320, 335,280,
41、280,390,390,335, 350,350,350,350,350,350;float ey=10,10,-10,-10,10,10, 10,10,-10,-10,10,10, 10,10,-10,-10,10,10, 10,10,-10,-10,10,10, 10,10,-10,-10,10,10, 0,0,0,0,0,0; float ez=60,60,60,50,50,60, 90,90,90,90,90,90, 120,120,120,120,120,120, 150,150,150,150,150,150, 180,180,180,180,180,180, 190,190,19
42、0,190,190,190; float ex1=275,350,350,200,200,275, 290,360,360,220,220,290, 305,370,370,240,240,305, 320,380,380,260,260,320, 335,390,390,280,280,335, 350,350,350,350,350,350;float ez1=-60,-50,-50,-60,-60,-60, -90,-90,-90,-90,-90,-90, -120,-120,-120,-120,-120,-120, -150,-150,-150,-150,-150,-150, -180
43、,-180,-180,-180,-180,-180, -190,-190,-190,-190,-190,-190;float EU=0,0,0,0.25,0.50,0.75,1,1,1; /后上机翼数据float tx=265,120,120,350,350,265, 280,150,150,360,360,280, 295,180,180,370,370,295, 310,210,210,380,380,310, 325,240,240,390,390,325, 340,340,340,340,340,340; float ty=60,60,60,50,50,60, 85,85,85,85,
44、85,85, 110,110,110,110,110,110, 135,135,135,135,135,135, 160,160,160,160,160,160, 170,170,170,170,170,170; float tz=-10,-10,10,10,-10,-10, -10,-10,10,10,-10,-10, -10,-10,10,10,-10,-10, -10,-10,10,10,-10,-10, -10,-10,10,10,-10,-10, 0,0,0,0,0,0; float TU=0,0,0,0.25,0.50,0.75,1,1,1; float bst1611613; f
45、loat bst11611613; float bst21611613; float bst31611613; float bst41611613; float bst51611613; float bst61611613; LRESULT WINAPI WndProc(HWND,UINT,WPARAM,LPARAM);BOOL setpixelformat(HDC hdc);void initviewport(int width,int height);void drawscreen();void messageloop();void lightm()GLfloat lamb4=0.5f,0
46、.5f,0.5f,1.0f;GLfloat ldif4=0.35f,0.35f,0.35f,1.0f;GLfloat lspe4=0.55f,0.55f,0.55f,1.0f;GLfloat lpos4=350.0f,500.0f,1000.0f,1.0f;GLfloat mamb4=0.3f,0.3f,0.3f,1.0f;GLfloat mdif4=0.3f,0.3f,0.3f,1.0f;GLfloat mspe4=0.75f,0.75f,0.75f,1.0f;GLfloat memi4=0.0f,0.0f,0.0f,1.0f;GLfloat mshininess=128.0f;glLigh
47、tfv(GL_LIGHT1,GL_AMBIENT,lamb);glLightfv(GL_LIGHT1,GL_DIFFUSE,ldif);glLightfv(GL_LIGHT1,GL_SPECULAR,lspe);glLightfv(GL_LIGHT1,GL_POSITION,lpos);glMaterialfv(GL_FRONT_AND_BACK,GL_AMBIENT,mamb);glMaterialfv(GL_FRONT_AND_BACK,GL_DIFFUSE,mdif);glMaterialfv(GL_FRONT_AND_BACK,GL_SPECULAR,mspe);glMaterialf
48、v(GL_FRONT_AND_BACK,GL_EMISSION,memi);glMaterialf(GL_FRONT_AND_BACK,GL_SHININESS,mshininess);int presskey(int vk)if(mKeystate=vk)return 1;return 0;void circle(float x,float y,float r)int i;float p;glBegin(GL_TRIANGLE_FAN);for(i=0;i370;i+=10)p=(float)(i*3.1415926)/180;glVertex3f(float)cos(p)*r+x,(flo
49、at)sin(p)*r+y,0.0f);glEnd();void drawsolidsphere(float x,float y,float r)glPushMatrix();glTranslatef(x,y,-100);glRotatef(-30,1.0,0.0,0.0); glRotatef(90,0.0,1.0,0.0); auxSolidSphere(r);glPopMatrix();unsigned int gettexture24b(char *bitn)FILE *fp;fp=fopen(bitn,rb);if(fp=NULL) return 0;int w,h,i,k;fsee
50、k(fp,18,SEEK_SET);fread(&w,4,1,fp);fread(&h,4,1,fp);unsigned char *t,ti;k=(w)*3;while(k%4) k+;t=new unsigned char k*h;fseek(fp,54,SEEK_SET);fread(t,k*h,1,fp);fclose(fp);for(i=0;ik*h;i+=3)ti=ti;ti=ti+2;ti+2=ti;unsigned int tr;glGenTextures(1,&tr);glBindTexture(GL_TEXTURE_2D,tr);gluBuild2DMipmaps(GL_T
51、EXTURE_2D,4,w,h,GL_RGB,GL_UNSIGNED_BYTE,t);delete t;return tr;int WINAPI WinMain(HINSTANCE hinstance,HINSTANCE lprevinstance,LPSTR lpcmdline,int nshowcmd)WNDCLASS wc;int sx,sy,wx,he,mk,k;wc.cbClsExtra=0;wc.cbWndExtra=0;wc.hbrBackground=(HBRUSH)(COLOR_WINDOW+1);wc.hCursor=LoadCursor(NULL,IDC_ARROW);w
52、c.hIcon=LoadIcon(NULL,IDI_WINLOGO);wc.hInstance=hinstance;wc.lpfnWndProc=(WNDPROC)WndProc;wc.lpszClassName=mWindowClassName;wc.lpszMenuName=NULL;wc.style=CS_HREDRAW|CS_VREDRAW;RegisterClass(&wc);wx=GetSystemMetrics(SM_CXSCREEN);he=GetSystemMetrics(SM_CYSCREEN);sx=(wx-mWidth)/2;sy=(he-mHeight)/2;hwnd
53、=CreateWindow(mWindowClassName,mWindowName,WS_OVERLAPPEDWINDOW,sx,sy,mWidth,mHeight,HWND_DESKTOP,NULL,hinstance,NULL);ShowWindow(hwnd,nshowcmd);UpdateWindow(hwnd);lightm(); glEnable(GL_DEPTH_TEST); glEnable(GL_LIGHTING); glLightModelf(GL_LIGHT_MODEL_LOCAL_VIEWER,1.0); glEnable(GL_LIGHT1); glEnable(G
54、L_COLOR_MATERIAL); mk=20;k=12;NurbsFace(9,HU,mk,9,HU,mk,hx,hy,hz,w,bst); NurbsFace(9,LU,mk,9,LU,mk,lx,ly,lz,w,bst1); BSplineFace2P(8,RU,k,8,RU,k,rx,ry,rz,bst2); BSplineFace2P(8,RU,k,8,RU,k,rx1,ry,rz1,bst3); BSplineFace2P(8,EU,k,8,EU,k,ex,ey,ez,bst4); BSplineFace2P(8,EU,k,8,EU,k,ex1,ey,ez1,bst5); BSp
55、lineFace2P(8,TU,k,8,TU,k,tx,ty,tz,bst6); M_FJ.x=float(mWidth/2);M_FJ.y=60;M_FJ.f_s=1;dzindex=-1;trx=gettexture24b(bkm.bmp);messageloop();return 0;LRESULT WINAPI WndProc(HWND hwnd,UINT message,WPARAM wparam,LPARAM lparam)switch(message)case WM_CREATE: hdc=GetDC(hwnd);setpixelformat(hdc);break;case WM
56、_SIZE:mWidth=LOWORD(lparam);mHeight=HIWORD(lparam);if(mHeight=0)mHeight=1;initviewport(mWidth,mHeight);break;case WM_DESTROY:PostQuitMessage(0);break;case WM_KEYDOWN:mKeystate=wparam;break;case WM_KEYUP:mKeystate=0;break;return DefWindowProc(hwnd,message,wparam,lparam);BOOL setpixelformat(HDC hdc)PI
57、XELFORMATDESCRIPTOR pdf=sizeof(PIXELFORMATDESCRIPTOR),1,PFD_DRAW_TO_WINDOW|PFD_SUPPORT_OPENGL|PFD_DOUBLEBUFFER,PFD_TYPE_RGBA,32,0,0,0,0,0,0,0,0,0,0,0,0,0,32,0,0,PFD_MAIN_PLANE,0,0,0,0;int pix=ChoosePixelFormat(hdc,&pdf);if(pix=0)return FALSE;SetPixelFormat(hdc,pix,&pdf);hrc=wglCreateContext(hdc);wgl
58、MakeCurrent(hdc,hrc);return TRUE;void initviewport(int width,int height)glViewport(0,0,width,height);glMatrixMode(GL_PROJECTION);glLoadIdentity();glOrtho(0,width,0,height,1000,-1000);glMatrixMode(GL_MODELVIEW);glLoadIdentity();void puttexture(int x,int y,int width,int height,unsigned int tr)glPushMa
59、trix();glEnable(GL_TEXTURE_2D);glBindTexture(GL_TEXTURE_2D,tr);glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_WRAP_S,GL_CLAMP);glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_WRAP_T,GL_CLAMP);glColor3f(1.0f,1.0f,1.0f);glBegin(GL_QUADS);glTexCoord2i(0,0); glVertex2i(x,y);glTexCoord2i(1,0); glVertex2i(x+width,y);g
60、lTexCoord2i(1,1); glVertex2i(x+width,y+height);glTexCoord2i(0,1); glVertex2i(x,y+height);glEnd();glDisable(GL_TEXTURE_2D);glPopMatrix();void getdz(float x,float y)if(dzindex100)dzindex+;GZD_bfdzindex.x=x;GZD_bfdzindex.y=y;GZD_bfdzindex.f_s=1;elsedzindex=-1;void dispdz()int i;for(i=0;imHeight)GZD_bfi
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 工程试验流程
- 外拓活动总结与提升路径
- 鸡蛋盒包装设计
- 安徽省池州市2026届高三数学下学期教学质量统一监测试题二模 (一)【含答案】
- 卫生防疫教育主题班会
- 2026老年护理评估解读
- 成年健康怀孕教育
- 物理学科核心素养培养路径
- 我认识的教育技术
- 论语交友篇核心思想解析
- 2026恒丰理财有限责任公司社会招聘备考题库含答案详解(完整版)
- 2026重庆两山建设投资集团有限公司招聘8人考试备考试题及答案解析
- 2026年学校教辅岗位考试试题
- 2026年民航货运员技能考试试题及答案
- 2026年西医医师定期考核能力提升B卷题库附答案详解(B卷)
- 2026年度哈尔滨“丁香人才周”(春季)松北区乡镇卫生院招聘医学毕业生12人笔试备考试题及答案详解
- 2026海南三亚市崖州区社会招聘事业单位工作人员(含教师)77人(第1号)笔试备考题库及答案解析
- 2026年北京市高校毕业生到农村从事支农工作招聘467人农业笔试参考题库及答案解析
- 2026年512防灾减灾测试题及答案
- 【宁波】2025年中共浙江宁波市宁海县委党校招聘事业编制工作人员笔试历年典型考题及考点剖析附带答案详解
- 辽水集团笔试试题题库
评论
0/150
提交评论