预览加载中,请您耐心等待几秒...
1/10
2/10
3/10
4/10
5/10
6/10
7/10
8/10
9/10
10/10

亲,该文档总共43页,到这已经超出免费预览范围,如果喜欢就直接下载吧~

如果您无法下载资料,请参考说明:

1、部分资料下载需要金币,请确保您的账户上有足够的金币

2、已购买过的文档,再次下载不重复扣费

3、资料包下载后请先用软件解压,在使用对应软件打开

C语言游戏模型(飞机)编程实现用C语言编写一个有关飞机的小游戏,首先要解决游戏中主要元素:飞机模型的屏幕绘图。是绘二维平面图还是绘三维立体图?下面用三维立体图绘制它,如下图所示:图1、飞机模型图图2、飞机模型图上面两幅图是在VC6中用OpenGL函数绘制的屏幕三维飞机模型,它的表面数据用双二次Nurbs曲面生成。-、光(光照)在屏幕上绘制的三维图形,要用光照亮它同而产生明暗变化,才能使绘制的图形更能真实地再现要生成的物体。在OpenGL函数里有专门用于光照的函数,只要调用它们就能还原一个真实的模似三维世界。二、Nurbs曲面生成曲面的一种算法,这里主要用的是双二次曲面。程序中飞机机身的设计基本上是一个圆柱体。用7个顶点表示的一个正方形利用NURBS二次圆弧构成一个整圆,描绘圆柱体的外形数据。下面是一个双二次NURBS曲面和曲线的算法源程序:#include"gl\gl.h"#include"math.h"//*-*-*-*-*-*-*-*-*-*-*-*-*-*-*B样条基函数计算部分*-*-*-*-*-*-*-*-*-*-*-*-*-*//计算所有非零B样条基函数并返回其值//i为参数u所在的节点区间下标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+1])tmpN[di][0]=1;elsetmpN[di][0]=0;dp+=1;for(j=1;j<dp;j++){tul=U[di+j]-U[di];tur=U[di+j+1]-U[di+1];if(tul!=0)left=(u-U[di])/tul;elseleft=0;if(tur!=0)right=(U[di+j+1]-u)/tur;elseright=0;tmpN[di][j]=left*tmpN[di][j-1]+right*tmpN[di+1][j-1];}}N[i-k]=tmpN[i-k][p];}}//*-*-*-*-*-*-*-*-*-*-*-*-*-*Bezier曲线曲面部分*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*voidBernsteinFunc(intn,doubleu,floatB[]){doubleu1;intj,k;B[0]=1.0;u1=1.0-u;for(j=1;j<=n;j++){floatsaved=0.0;for(k=0;k<j;k++){floattemp=B[k];B[k]=float(saved+u1*temp);saved=float(u*temp);}B[j]=saved;}}//获取p次Bezier曲线上的lines个点的值voidBezierPoint(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][1]=tmp[j][2]=0;for(i=0;i<p+1;i++){tmp[j][0]+=BC[i]*px[i];tmp[j][1]+=BC[i]*py[i];tmp[j][2]+=BC[i]*pz[i];}}}//获取p次有理Bezier曲线上的lines个点的值voidNBezierPoint(intp,floatpx[],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+1;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][1]=y/w;tmp[j][2]=z/w;tmp[j][3]=w;}}//-----------------------------------------------------------------------------------//绘制p次的Be