版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
C語言游戲模型(飛機(jī))編程實(shí)現(xiàn)
用C語言編寫一個(gè)有關(guān)飛機(jī)的小游戲,首先要解決游戲中主要元素:飛機(jī)模型的屏幕繪
圖。是繪二維平面圖還是繪三維立體圖?下面用三維立體圖繪制它,如下圖所示:
圖1、飛機(jī)模型圖
圖2、飛機(jī)模型圖
上面兩幅圖是在VC6中用OpenGL函數(shù)繪制的屏幕三維飛機(jī)模型,它的表面數(shù)據(jù)用雙二
次Nurbs曲面生成。
一、光(光照)
在屏幕上繪制的三維圖形,要用光照亮它同而產(chǎn)生明暗變化,才能使繪制的圖形更能真
實(shí)地再現(xiàn)要生成的物體。在OpenGL函數(shù)里有專門用于光照的函數(shù),只要調(diào)用它們就能還原
一個(gè)真實(shí)的模似三維世界,
二、Nurbs曲面
生成曲面的一種算法,這里主要用的是雙二次曲面。程序中飛機(jī)機(jī)身的設(shè)計(jì)基本上是一
個(gè)圓柱體。用7個(gè)頂點(diǎn)表示的一個(gè)正方形利用NURBS二次圓弧構(gòu)成一個(gè)整圓,描繪圓柱體
的外形數(shù)據(jù)。
下面是一個(gè)雙二次NURBS曲面和曲線的算法源程序:
/include"gl'gl.h”
Sincludc"math,h”
B樣條基函數(shù)計(jì)算部分*
〃計(jì)算所有非零B樣條基函數(shù)并返回其值
〃i為參數(shù)u所在的節(jié)點(diǎn)區(qū)間下標(biāo)
voidBasisFunction(inti,intp,floatu,floatU[],floatN[])
(
intj,di,dp,k;
floattul,tur,left,right;
floattmpN[50][50];
for(k=0;k<=p;k++)
(
dp=0:
for(di=i+p-k;di>=i-k:di--)
(
if(u>=U[di]&&u<U[di+l])
tmpN[di][0]=l;
else
tmpN[di][0]=0;
dp+=l;
for(j=l;j<dp;j++)
(
tul=U[di4j]-U[di];
tur=U[di^j+l]-U[di+l];
if(tul!=d)
left=(u-U[di])/tul;
else
left=0;
if(tur!=d)
right=(U[di+j+l]-u)/tur;
else
right=0;
tmpN[di][j]=left*tmpN[di][j-l]+right*tmpN[di+l][j~l];
)
N[i-k]=tmpN[i-k][p];
}
)
〃*-*-*-*-*_*_*_*-*-*_*-*T-*Bezier曲線曲面部分*
voidBcrnsteinFunc(inin,doubleu,floatB[])
{
doubleul;
intj,k;
B[0]=1.0;
ul=l.0-u;
for(j=l;j<=n;j++)
(
floatsaved=0.0;
for(k=0;k<j;k++)
(
floattemp=B[k];
B[k]=float(saved+ul*temp);
saved=float(u*temp):
}
B[j]=saved:
)
)
〃獲取P次Bezier曲線上的1ines個(gè)點(diǎn)的值
voidBczicrPoint(intp,floatpx[],floatpy[],floatpz[],intlines,floattmp[][3])
(
floatBC[20];
inti,j;
for(j=0;j<=lines;j++)
(
doublet=j/(float)lines:
BernsteinFunc(p,t.BC):
tmp[j][0]=tmp[j][l]=tmp[j][2]=0;
for(i=0:i<p+l:i++)
(
tmp[j][0]+=BC[i]*px[i];
tmp[j][l]+=BC[i]*py[i]:
[2]+=BC[i]*pz[i];
)
〃獲取P次行理Bezier曲線上的1incs個(gè)點(diǎn)的值
voidNBezierPoint(intp,flDatpx[],floatpy[],floatpz[],floatpw[],intlines,floattmp[][4])
floatx,y,z,w,BC[20]:
inti,j;
for(j=0:j<=lines;j++)
(
doublet=j/(float)lines:
BernsteinFunc(p,t.BC);
x=y=z=w=0;
for(i=0;i<p+l;i++)
(
x+=BC[i]*px[i]*pw[i];
y+=BC[i]*py[i]*pw[i];
z+=BC[i]*pz[i]*pw[i];
w+-=BC[i]*pw[i];
)
tmp[j][0]=x/w;
tmp[j][l]=y/w:
tmp[j][2]=z/w;
tmp[j][3]=w;
}
)
〃繪制P次的Bezier曲線
voidBczier(intp,floatpx[],floatpy[],floatpz[],intlines)
(
floatpt[100][3];
intj;
BezierPoint(p,px,py,pz,lines,pt):
for(j=l:j<=lines;j++)
(
glBegin(GL_LINES);
glVertex3f(pt[j-l][0],[1],pt[j-1][2]);
glVertex3f(pt[j][0],pt[j][1],pt[j][2]);
glEnd();
}
}
//----------------------------------------------------------------------------
〃繪制p次的有理BezieWlIl線
voidNBezier(intp,floatpx[Lfloatpy[],floatpz[],floatw[],intlines)
floatpt[100][4];
intj:
NBezierPoint(p,px,py,pz,w,lines,pt);
for(j=l:j<=lines;j++)
(
glBegin(GLLINES);
glVertex3f(pt[j-1][0],pt[j-l][1],pt[j-l][2]);
glVertex3f(pt[j][0],pt[j][1],pt[j][2]);
glEnd();
}
)
//---------------------------------------------------------------------------------------------
〃計(jì)算雙p次Bezier曲面上所有的點(diǎn)并保存在Pt口□口中
〃11和\,分別為曲面(u,v)方向上的網(wǎng)格數(shù)
voidBezierFacePoint(intp,intu,intv,floatpx[][4],floatpy[][4],floatpz[][4],float
pt[161][161][3])
(
floaturxfll][161],ury[l1][161],urz[ll][161];
floattx[ll],ty[ll],ts[ll],tmp[161][3];
inti,j,k;
for(j=0;j<p+l;j++)
I
for(i=0;i<p+l;i+4)
(
tx[l]=px[l][JJ;
ty[i]=py[i]L];
tz[i]=pz[i][J;
}
BezierPoint(p,tx,ty,tz,v,tmp);
for(k=0;k<=v;k++)
(
urx[j][k]=tmp[k][0];
ury[j][k]=tmp[k][1];
urz[j][k]=tmp[k][2];
}
)
for(i=0;i<=v;i++)
(
for(k=0;k<p+l;k+4)
(
lx[k]=urx[k][i];
ty[k]=ury[k][i];
tz[k]=urz[k][i];
BezierPoint(p,tx,ty,tz,u,tmp);
for(j=0:j<=u;j++)
(
pt[i][j][0]=tmp[j][0];
pt[i][j][l]=tmp[j][l];
pt[i][j][2]=tmp[j]⑵;
|
)
)
〃計(jì)算雙P次有理Bezier曲面上所有的點(diǎn)并保存在Pl口口口中
〃11和、,分別為曲面(u,v)方向上的網(wǎng)格數(shù)
voidNuBezierFacePoint(intp,intu,intv,floatpx[][4],floatpy[][4],floatpz[][4],float
w[][4],floatpt[161][161][3])
(
floaturx[11][161],ur/[l[161],urw[l1][161];
floattx[ll],ty[11],tw[ll],tmp[161][4];
inti,j,k;
for(j=0;j<p+l;j++)
(
for(i=0;i<p+l;i+-f)
(
tx[i]=px[i][-];
ty[i]=py[i][J;
tz[i]=pz[i][;];
lw[i]=w⑴[j];
}
NBezierPoint(p,tx,ty,tz,tw,v,tmp);
for(k=0;k<=v;k++)
(
urx[j][k]=tmp[k][0];
ury[j][k]=tmp[k][1];
urz[j][k]=tmp[k][2];
urw[j][k]=tmp[k][3];
)
}
for(i=0;i<=v;i++)
(
for(k=0;k<p+l;k+^)
tx[k]=urx[k][i]:
ty[k]=ury[k][i]:
tz[k]=urz[k][i];
tw[k]=urw[k][i]:
}
NBezierPoint(p,tx,ty,tz,tw,u,tmp);
for(j=0;j<=u;j++)
(
pt[i][j][O]=tmp[j][0];
pt[i][j][l]=tmp[j][1]:
Pt[i][j][2]=tmp[j][2];
}
)
)
B樣條曲線曲面部分_*
〃計(jì)算曲線上的點(diǎn)(U所對(duì)應(yīng)的所有點(diǎn))保存在Poi口中
//n=m-p-l
//p為曲線的次數(shù)
voidBSplinePoint(intn,intp,floatU[],floatP[],floatPoi[])
(
floatN[100],tmp;
inti,j;
for(i=p+l;i<=n;i++)
(
BasisFunction(i,p,U[i],U,N);
tmp=0;
for(j=i;j>=i-p;j—)
tmp+=N[j]*P[j];
Poi[i-p]=tmp;
)
)
〃計(jì)算次樣條曲線上的所有控制多邊形保存在CP口中
/幾為節(jié)點(diǎn)矢量U口的最大下標(biāo)
voidB2SplineControlPoint(intm,floatU[],floatP[],floatCP[])
{
intn,k,tm,i,cp,p;
floatPoi[100];
P=2;
n=m-p-l;
BSplinePoint(n,p,U,P,Poi);
cp=(n-p)*2+p;
for(i=0;i<2:i++)
CP[i]=P[i];
CP[cp]=P[n];
tm=2;
for(i=2;i<cp-l:i+=2)
I
k=(int)i/2:
CP[i]=Poi[k];
CP[i+l]=P[tm];
tm++:
}
)
〃繪制次B樣條曲線
//m為節(jié)點(diǎn)矢量U口的最大下標(biāo)
voidBSpline2L(intm,floatU[],floatpx[],floatpy[],floatpz[])
|
floatpcx[100],pcy[100],pcz[100],drx[3],dry[3],drz[3];
inti,j,tmcp;
B2SplineControlPoint(n,U,px,pcx);
B2SplineControlPoint(n,U,py,pcy);
B2SplineControlPoint(n,U,pz,pcz);
tmcp=m-5;
for(i=0;i<=tmcp;i++)
I
for(j=i*2;j<i*2+3;j++)
(
drx[j-i*2]=pcx[j];
dry[j-i*2]=pcy[j];
drz[j-i*2]=pcz[j];
}
Bezier(2,drx,dry,drz,20);
}
)
〃計(jì)算雙二次(x2)B樣條曲面所有控制多邊形頂點(diǎn),并保存在pl□□口中
//mu,mv分別為節(jié)點(diǎn)矢量U[],V[]的最大下標(biāo)值
voidBS2FaceConlrolPoint(inimu,I'loatU[],intmv,floatV[],floatpx[],floatpy[],float
pz[],floatpt[100][100][3])
(
inti,j,k,dp;
floattmx[50],tmy[50],tmz[50];
floattmpx[50][100],tiipy[50][100],tmpz[50][100];
floatuvx[100][100],u/y[100][100],uvz[100][100];
for(i=0:i<mv-2:i++)
dp=i*(mu-2);
for(j=dp;j<mu-2+dp;j++)
(
tmx[j-dp]=px[j];
tray[j-dp]=py[j]:
tmz[j-dp]=pz[j];
}
B2SplineControlPoint(mu,U,tmx,tmpx[i]):
B2SplineControlPoint(mu,U,tmy,tmpy[i]):
B2SplincControlPoint(mu,U,tmz,tmpz[i]);
)
for(i=0;i<2*mu-7;i++)
(
for(j=0;j<mv2;j")
(
tmx[j]=tmpx[j][i];
tmy[j]=tmpy[j][i];
tmz[j]=tmpz[j][i];
}
B2SplineControlPoint(mv,V,tmx,uvx[i]):
B2SplineControlPoint(mv,V,tmy,uvy[iJ);
B2SplineControlPoint(mv,V,tmz,uvz[i]):
for(k=0;k<2*mv-7;k++)
(
Pt[i][k][0]=uvx[i][k];
pt[i][k][l]=uvy[i][k];
pt[i][k][2]=uvz[i][k];
}
}
}
〃設(shè)置網(wǎng)格數(shù)
voidSctGridCount(intdt,inttu,inttmk[])
(
inti,tm;
tm=tu%dt;
for(i=0;i<dt-l:i++)
tmkLi]=(tu-tm)/dt;
tmk[dt-l]=tmk[O]+tm;
)
//計(jì)算雙二次(2x2次)B樣條曲面上所有的點(diǎn)并保存在bs口口口中
//nu,mv分別為節(jié)點(diǎn)矢量U[],V□的最大下標(biāo)
//uk,vk分別為B樣條曲面(u,v)方向上的網(wǎng)格數(shù)
//P為曲面的次數(shù)
voidBSplineFace2P(intnu,floatU[],intuk,intmv,floatV[],intvk,
floatpx[]ffloatpy[],floatpz[],floatbs[161][161][3])
{
intudk[20],vdk[20],i.j,k,1,hu,sv,du,dv,p=2;
floattp[100][100][3],td[161][161][3];
floattmx[4][4],tmy[4][4],tmz[4][4];
du=nu-2*p;
dv=mv-2*p;
SctGridCount(du,uk,udk);
SetGridCount(dv,vk,vdk);
BS2FaceControlPoint(nu,U,mv,V,px,py,pz,tp);
for(i=0;i<dv;i++)
I
for(k=0;k<du;kii)
(
for(j=i*p;j<p+l+i*p;j++)
(
for(1=k*p;l<p+1+k*p;1++)
(
tm>:[j-i*p][l-k*p]=tp[l][j][0]:
tmy[J-i*p][l-k*p]=tp[l][j][1];
tmZ[--i*p][l-k*p]=tp[l][j][2]:
)
)
BezierFacePoint(p,udkLk],vdk[i],tmx,tmy,tmz,id);
for(sv=i*vdk[0];sv<=vdk[i]+i*vdk[0];sv++)
(
for(hu=k*udk[0];hu<=udk[k]+k*udk[0];hu++)
(
bs[sv][hu][0]=td[sv-i*vdk[0J][hu-k*udk[0]][0];
bs[sv][hu][l]=td[sv-i*vdk[O]][hu-k*udk[0]][1];
bs[sv][hu][2]=td[sv-i*vdk[0]][hu-k*udk[0]][2];
)
)
}
)
)
Nurbs樣條曲線曲而部分
〃計(jì)算\urbs曲線上的點(diǎn)(u所對(duì)應(yīng)的所有點(diǎn))保存在Poi口中
//n=m-p-l
//p為曲線的次數(shù)
voidNurbsPoint(intn,intp,floatU[],floatP[],floatW[],floatPoi[])
floatN[100],tmp,tmw:
inti,j;
for(i=p+l;i<=n:i++)
(
BasisFunction(i,p,U,N);
tmp=0;tmw=0:
for(j=i;j>=i-p;j-)
(
tmp+=N[j]*P[j]*W[j];
tmw+=N[j]*W[j];
}
Poi[i-p]tmp/tmw:
)
)
〃計(jì)算次Nurbs曲線上的所有控制多邊形保存在CP口中
//m為節(jié)點(diǎn)矢量U口的最大下標(biāo)
voidNurbs2ControlPoint(intm,floatU[],floatP[],floatVl],floatCP[])
(
intn,k,tm,i,cp,p;
floatPoi[100];
P=2:
n=m-p-l;
NurbsPoint(n,p,U,P,W,Poi):
cp=(n-p)*2+p;
for(i=0;i<2:i++)
CPfi]=P⑴;
CP[cp]=P[n];
tm=2;
for(i=2;i<cp-l;i+=2)
(
k=(inl)i/2;
CP[i]=Poi[k];
CP[i+l]=P[tm];
tm++;
)
)
〃繪制次Nurbs樣條曲線
//m為節(jié)點(diǎn)矢量U口的最大下標(biāo)
voidNurbs2L(intm,floatU[],floatpx[],floatpy[],floatpz[],floatW[])
floatpcx[100],pcy[100],pcz[100],drx[3],dry[3],drz[3];
floatpew[100],drw[3];
inti,j,tmep;
Nurbs2ControlPoint(m,U,px,W,pcx):
Nurbs2ControlPoint(m,U,py,W,pey);
Nurbs2ControlPoint(m,U,pz,W,pez);
B2SplinoControlPoint(n,U,W,pew):
tmcp=nr5;
for(i=0;i<=tmcp;i++)
(
for(j=i*2;j<i*2+3;j++)
(
drx[j-i*2]=pcx[j];
dry[j-i*2]=pcy[j];
drz[j-i*2]=pcz[j];
drw[ji*2]=pcw[j];
)
NBezier⑵drx,dry,drz,drw,20);
}
)
〃計(jì)算雙二次(x2)Nurbs樣條曲面所有控制多邊形頂點(diǎn),并保存在pt□□口中
〃mu,mv分別為節(jié)點(diǎn)矢量U[],V口的最大卜標(biāo)值
voidNurbs2FControlPoint(intmu,floatU口,intmv,floatV[],floatpx[],floatpy[],float
pz[],floatW[],floatpt[100][1001[4])
{
inti,j,k,dp;
floattmx[50],tmy[50],tmz[50],tmw[50];
floattmpx[50][100],tnpy[50][100],tmpz[50][100],tmpw[50][100];
floatuvx[100][100],u/y[100J[100],uvz[100][100],uvw[100][100J;
for(i=0:i<mv-2:i++)
(
dp=i*(mu-2);
for(j=dp;j<mu-2+dp;j++)
(
tmx[j-dp]=px[j];
tmy[j-dp]=py[j];
tmz[j-dp]=pz[j];
tmw[j-dp]=W[j];
)
Nurbs2ControlPoint(mu,U,tmx,tmw,tmpx[i]);
Nurbs2ControlPoint(mu,(J,tmy,tmw,tmpy[i]):
Nurbs2ControlPoint(mu,U,tmz,Imw,tmpz[i]);
B2SplineControlPoint(mu,U,tmw,tmpw[i]);
)
for(i=0;i<2*mu-7;i++)
(
for(j=0;j<mv-2;j^+)
(
tmx[j]=tmpx[j][i];
tmy[j]=tmpy[j][i]:
tmz[j]=tmpz[j][i];
tmw[j]=tmpw[j][i];
}
Nurbs2ControlPoint(mv,V,tmx,tmw,uvx[i]);
Nurbs2ControlPoint(mv,V,tmy,tmw,uvy[i]);
Nurbs2ControlPoint(mv,V,tmz,tmw,uvz[i]);
B2SplineControlPoint(mv,V,tmw,uvw[i]);
for(k=0;k<2*mv-7;k++)
(
pt[i][k][O]=uvx[i][k];
pt[i][k][l]=uvy[i][k];
pt[i][k][2]=uvz[i][k];
pt[i][k][3]=uvw[i][k];
}
)
)
〃計(jì)算雙一次(2x2次)Nurbs樣條曲面上所有的點(diǎn)并保存在bs口□口中
〃nu,mv分別為節(jié)點(diǎn)矢量U[],V口的最大下標(biāo)
//uk,vk分別為B樣條曲面(u,v)方向上的網(wǎng)格數(shù)
//p為曲面的次數(shù)
voidNurbsFace(intnu,floatU[],intuk,intmv,floatV[],intvk,
floatpx[],floatpy[],floatpz[],floatw[],floatbs[161][161][3])
(
intudk[20],vdk[20],i:j,k,1,hu,sv,du,dv,p=2;
floattp[100][100][4],td[161][161][3];
floattmx[4][4],tmy[4][4],tmz[4][4]?tmw[4][4];
du=nu-2*p;
dv=mv-2*p;
SetGridCount(du,uk,udk):
SctGridCount(dv,vk,vdk);
Nurbs2FControlPoint(nu,U,mv,V,px,py,pz,w,tp);
for(i=0;i<dv;i++)
for(k=0;k<du;k++)
for(j=i*p;j<p+l+i*p;j++)
(
for(l=k*p:Kp+l+k*p;1++)
(
tmx[j-i*p][l-k*p]=tp[l][j][0];
tmy[j-i*p][l-k*p]=tp[l][j][l];
tmz[j-i*p][l-k*p]=tp[l][j][2]:
tmw[j-i*p][l-k*p]=tp[l][j][3]:
)
)
NuBczierFacePoint(p,udk[k],vdk[i],tmx,tmy,tn?,tmw,td);
for(sv=i*vdk[0]:sv<=vdk[i]+i*vdk[0];sv++)
(
for(hu=k*udk[0];hu<=udk[k]+k*udk[0];hu-H-)
{
bs[sv][hu][0]=td[svi*vdk[0]][huk*udk[O]][0];
bs[sv][hu][l]=td[sv-i*vdk[O]][hu-k*udk[O]][1];
bs[$v][hu][2]=td[sv-i*vdk[0]][hu-k*udk[0]][2];
)
)
}
)
)
〃*_*-*-*_*-*-*-*-*-*-*-*r-*-*繪制曲面部分
〃計(jì)算多邊形的外法線返回值1硒口
voidgetN(floatx[3],floaty[3],floatzL3],floattmN[3])
{
floatpl,p2,p3,ql,q2,q3:
pl=x[l]-x[0];
p2=y[l]-y[0]:
p3=z[l]-z[0];
ql=x[2]-x[l];
q2=y|;2]-y[l];
q3=z[2]-z[l];
tmN[0]=p2*q3-q2*p3;
tmN[1]=q1*p3-p1*q3;
tmN[2]=pl*q2-p2*q1:
)
〃顯示B樣條曲面
〃fill取值為或
voidShowSurfacedntu,intv,floatbs[161][161][3],intfill)
inti,j;
floatx[3],y[3],z[3],tmn[3];
for(i=0;i<=v:i++)
(
for(j=0;j<=u:j++)
(
if(fill!=0)
(
x[0]=bs[i][j][0];
x[l]=bs[i+l][j][0];
x[2]=bs[i+l][j+l][0];
y[0]=bs[i][j][1];
y[l]=bs[i+l][j][1];
y[2]-bs[iH][jil][l]:
z[0]=bs[i][j][2];
z[l]=bs[i+l][j][2]:
z[2]=bs[i+l][j+l][2];
getN(x,y,z,tmn);
glEnabletGL_NOK\(ALlZE);
glBegin(CLQUADS);
glNormalSf(tran[0],tmn[l],tmn[2]);
glBegin(GLLINES);
if(j<u)
(
glVeriex3f(bs⑴[j][0],bs[i][j][1],bs[i][j][2]):
glVertex3f(bs[i][j+1][0],bs[i][j+l][l],bs[i][j+1][2]):
)
if(i<v)
(
glVertex3f(bs[i+l][j+1][0],bs[i+l][j+l][l],bs[i+l][j+1][2]);
glVertex3f(bs[i+l][j][0],bs[i+l][j][l],bs[i+l][j][2]):
)
glEndO;
glDisable(GL_NORMALIZE);
)
else
g1Begin(GL_LINES):
glVertex3f(bs[i][j][0],bs[i][j][1],bs[i][j][2]):
glVertex3f(bs[i][j+1][0],bs[i][j+l][1],bs[i][j+1][2]):
)
if(i<v)
|
glVertex3f(bs[i][j][0],bs[i][j][1],bs[i][j][2]);
glVertex3f(bs[i+l][j][0],bs[i+l][j][1],bs[i+l][j][2]);
glEndO:
)
}
)
)
三、飛機(jī)小游戲編寫
圖3、游戲效果圖
戰(zhàn)機(jī)小游戲簡(jiǎn)單編寫了:主戰(zhàn)機(jī)的上、下、左、右移動(dòng)和開炮射擊(按空格鍵);音樂
的播放(.wav)。編寫了物體碰撞算法:擊落敵機(jī)、主戰(zhàn)機(jī)和敵機(jī)的碰撞。
Sincludc"stdafx.h"
*include"Nurbs_2p\Nurbs.h"
HWNDhwnd;
HDChdc;
HGLRChrc:
intmWidth=480;
intmileight=600;
char*mWindow€lassNamc=,,makcwindowc1ass^;
char*mWindowName="戰(zhàn)機(jī)";
intmKeystate;
typedefstructGAMEDATA
{
floatx,y;
intf_s;
}FeiJi,ZiDan:
FeijiM_FJ,DIJ_bf[50];
ZiDanGZD_bf[100];
intdj_statc;
intdzindex;
unsignedinttrx;
〃飛機(jī)機(jī)身頭部數(shù)據(jù)
floathx[]=
{
-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,-100,
-50,-50,-50,-50,-50,-50,-50,
0,0,0,0,0,0,0
);
floathy[]=
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
};
floathz[]=
{
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,-60,
-60,-60,60,60,60,-60,-60,
60,60,60,60,60,60,60,
-60,-60,60,60,60,-60,-60
);
floatHU[]={0,0,0,0.25,0.5,0.5,0.75,1,1,1);
〃飛機(jī)機(jī)身尾部數(shù)據(jù)
floatlx[]=
{
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,
400,400,400,400,400,400,400
};
floatly[]=
(
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
);
floatlz[]=
-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,
-60,-60,60,60,60,-60,-60,
-60,-60,60,60,60,-60,-60,
-40,-40,40,40,40,-40,-40
):
floatLU[]={0,0,0,0.25,0.5,0.5,0.75,1,1,1);
floatw[]=
{
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
);
〃前機(jī)翼數(shù)據(jù)
floatrx[]=
(
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
};
floatry[]=
(
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
);
floatrz[]=
60,60,60,60,60,60,
120,120,120,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
);
floatrxl[]=
(
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
);
floatrzl[]=
{
^60,-60,-60,-60,-60,-60,
120,120,120,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
};
floatRU[]={0,0,0,0.25,0.50,0.75,1,1,1);
//后機(jī)翼數(shù)據(jù)
floatex[]=
{
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,280,390,390,335,
350,350,350,350,350,350
);
floatey[]=
(
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
);
floatez[]=
{
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,190,190,190,190
};
floatcxl[]=
{
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
);
floatezl[]=
{
-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,-180,-180,-180,-180,-180,
-190,-190,-190,-190,-190,-190
);
floatEU[]=(0,0,0,0.25,0.50,0.75,1,1,1);
〃后上機(jī)翼數(shù)據(jù)
floattx[]=
|
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
);
floatty[]=
60,60,60,50,50,60,
85,85,85,85,85,85,
110,110,110J10,110,110,
135,135,135,135,135,135,
160,160,160,160,160,160,
170,170,170,170,170,170
);
floattz[]=
{
-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
);
floatTU[]={0,0,0,0.25,0.50,0.75,1,1,1);
floatbst[161][161][3];
floatbstl[161][161][3];
floatbst2[161][161][3];
floatbst3[161][161][3];
floatbst4[161][161][3];
floatbst5[161][161][3];
floatbst6[161][161][3];
LRESULTWINAPIWndProc(HWND,UINT,WPARAM,LEARAM);
BOOLsetpixelformat(HDChdc);
voidini【viewport(intwidth,intheight);
voiddrawscreen();
voidmessage1oop();
voidlightmO
|
GLfloatlamb[4]=(O.5f,0.5f,0.5f,l.Of};
GI.rioatldif[4]={0.35f,0.35f,0.35f,l.Of};
GLfloatlspe[4]=(0.55f,0.55f,0.55f,1.Of};
GLfloat]pos[4]={350.Of,500.Of,1000.Of,1.Of);
GLfloatmamb[4]=(0.3f0.3f,0.3f,l.Of};
GLfloatmdif[4]={0.3f,0.3f,0.3f,l.Of};
GLfloatmspe[4]=(O.75f,0.75f,0.75f,1.Of};
GLfloatmemi[4]={0.Of.0.Of,0.Of,l.Of};
GLfloatmshininess=128.Of;
glLightfv(GL_LIGHTl,GL_AMBIENT,lamb);
glIJghtfv(GIJ.IGUTl,GL_DIFFUSE,Idif);
glLightfv(GL_LIGHTl,GL.SPECULAR,Ispe);
glLightfv(GL_LIGHTl,GL_POSITION,Ipos);
glMaterialfv(GL_FRONT_AND_BACK,GL_AMBIENT,mamb);
glMaterialfv(GL_FRONT_AND_BACK,GL_DIFFUSE,mdif);
glMateria1fv(GL_FRONT_AND_BACK,GL_SPECULAR,mspe):
glMaterialfv(GLFRONTANDBACK,GLEMISSION,memi):
g1Materia1f(GL_FRONT_AND_BACK,GL_SHININESS,mshinincss);
)
intpresskey(inivk)
(
if(mKeystate==vk)
return1;
return0;
)
voidcircle(floatx,floaty,floatr)
(
inti;
floatp;
glBegin(GL_TR1/\NGLE_FAN);
for(i=0;i<370;i+=10)
(
p=(float)(i*3.1415926)/180;
glVertex3f((float)cos(p)*r+x,(float)sin(p)*r+y,0.Of);
}
glEndO;
)
voiddrawso1idsphere(floatx,floaty,floatr)
{
glPushMatrixO:
glTranslatcf(x,y,-100);
glRotatef(-30,1.0,0.0.0.0);
glRotatef(90,0.0,1.0,0.0);
auxSolidSphere(r);
glPopMatrix();
)
unsignedintgettexture24b(char*bitn)
{
FILE*fp:
fp=fopen(bitn,"rb");
if(fp==NULL)return0;
iniw,h,i,k;
fseek(fp,18,SEEK_SET);
fread(&w,4,1,fp);
fread(&h,4,1,fp);
unsignedchar*t,ti;
k=(w)*3;
while(k%4)k++;
t=newunsignedchar[k*hj;
fseek(fp,54,SEEK_SET);
fread(t,k*h,1,fp);
fclose(fp);
for(i=0;i<k*h;i+=3)
(
t[i]=t[i+2];
t[i+2]=ti;
)
unsignedinttr;
glGenTextures(l,&tr);
glBindTexture(GL_TEXTURE_2D,tr);
gluBuild2DMipmaps(GL_TEXTURE_2D,4,w,h,GL_RGB,GL_UNSIGNED_BYTE,t);
delete[]t;
returntr;
)
intWIN.APINinVain(HINSTANCEhinstance,HINSTANCEIprevinstance,LI^TRIpcmdline,intn
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年地面伽瑪射線全譜儀項(xiàng)目合作計(jì)劃書
- 2025年商業(yè)保理項(xiàng)目建議書
- 2025年婚慶床品項(xiàng)目發(fā)展計(jì)劃
- 員工財(cái)務(wù)方面培訓(xùn)課件
- 幽門狹窄護(hù)理操作技能培訓(xùn)
- 員工關(guān)系課件
- 呼吸系統(tǒng)疾病護(hù)理科研方法
- 護(hù)理質(zhì)量管理標(biāo)準(zhǔn)解讀
- 聽音磨耳朵課件
- 消防安全繪畫大賽通知
- 2025超重和肥胖管理指南課件
- 武警拓展訓(xùn)練方案
- 化肥產(chǎn)品生產(chǎn)許可證實(shí)施細(xì)則(一)(復(fù)肥產(chǎn)品部分)2025
- 初中be動(dòng)詞的使用
- 婦產(chǎn)科考試試題及答案
- 光伏電站運(yùn)維人員培訓(xùn)與技能提升方案
- 安全文明施工資料管理方案
- 《國家十五五規(guī)劃綱要》全文
- GB/T 46194-2025道路車輛信息安全工程
- 2025年國考《行測(cè)》全真模擬試卷一及答案
- 國家開放大學(xué)2025年商務(wù)英語4綜合測(cè)試答案
評(píng)論
0/150
提交評(píng)論