?? renderview.cpp
字號(hào):
int x, z;
int r = 256; // 隨機(jī)數(shù)最大值
float gradient, shadow = 0.5, max = 0;
FILE *fp;
if((fp=fopen("airport.asc.","rb"))==NULL) return;
float XCorner, YCorner;
int OridtmDX, OridtmDY;
float CellSize;
fread(&XCorner,sizeof(float),1,fp);
fread(&YCorner,sizeof(float),1,fp);
fread(&OridtmDX,sizeof(int),1,fp);
fread(&OridtmDY,sizeof(int),1,fp);
fread(&CellSize,sizeof(float),1,fp);
fread(y,sizeof(float),MAP*MAP,fp);
for (x = 0; x < MAP; x++ )
for ( z = 0; z < MAP; z++)
y[x][z] /=2.0;
fclose(fp);
// 在地形中隨機(jī)生成一些樹(shù)木
for(x=0; x<MAP; x++){
for(z=0; z<MAP; z++) {
if(rand()%13==0 && y[x][z]>0)
object[x][z] = 't';
else
object[x][z] = 'n';
}
}
for(x=0; x<=MAP; x++){
for(z=0; z<=MAP; z++) {
gradient = ((GLfloat) (y[x][z]-y[x+1][z])) / 100.0f;
if(y[x][z]>64) {
if((y[x][z]-y[x][z+1])<8 && (y[x][z]-y[x][z+1])>-8 && (y[x][z]-y[x+1][z])<8 && (y[x][z]-y[x+1][z])>-8) {
c[x][z].g = gradient + 0.75f;
c[x][z].r = c[x][z].g;
c[x][z].b = c[x][z].g;
}
else {
c[x][z].r = gradient + 0.75f;
c[x][z].g = c[x][z].r*0.8f;
c[x][z].b = c[x][z].r*0.5f;
}
} else
if(y[x][z]>0){
c[x][z].g = gradient + 0.75f;
c[x][z].r = c[x][z].g * 0.6f;
c[x][z].b = 0.0f;
}
else {
c[x][z].r = gradient + 1.0f;
c[x][z].g = c[x][z].r * 0.75f;
c[x][z].b = c[x][z].r * 0.5f;
}
}
}
}
void CRenderView::MakeTexture(void) {
int i, j;
FILE *fp;
unsigned char *image;
int rc;
fp = fopen("res\\texture.bmp","rb");
if(!fp) return;
fseek(fp,54,SEEK_SET);
image = (unsigned char *)malloc(WIDTH*WIDTH*3);
rc=fread(image,sizeof(unsigned char),WIDTH*WIDTH*3,fp);
fclose(fp);
for(i=0; i<WIDTH; i++) {
for(j=0; j<WIDTH; j++) {
texImg[i][j][0] = (GLubyte) *(image+i*WIDTH*3+j*3);
texImg[i][j][1] = (GLubyte) *(image+i*WIDTH*3+j*3+1);
texImg[i][j][2] = (GLubyte) *(image+i*WIDTH*3+j*3+2);
texImg[i][j][3] = (GLubyte) 255;
}
}
}
void CRenderView::CheckHeight(void) {
float x0, x1, lx, lz, x, z, midpoint;
int fx, fz;
x = (patriot_posx/(comp*1.0f));
z = (patriot_posz/(comp*1.0f));
fx = (int)(x);
fz = (int)(z);
lx = x - fx;
lz = z - fz;
x0 = y[fx][fz] + (y[fx][fz+1] - y[fx][fz])*lz;
x1 = y[fx+1][fz] + (y[fx+1][fz+1] - y[fx+1][fz])*lz;
midpoint = x0 + (x1 - x0)*lx;
patriot_posy = midpoint + 50.0f;
}
void CRenderView::DrawTree(int x, int z)
{
int x1, y1, z1;
y1 = (int)y[x][z];
x1 = (int)x * comp;
z1 = (int)z * comp;
glEnable(GL_TEXTURE_2D);
glBegin(GL_POLYGON);
glColor3f(0.6f, 0.4f, 0.0f);
glVertex3f((float)x1-1, (float)y1+5, (float)z1);
glVertex3f((float)x1+1, (float)y1+5, (float)z1);
glVertex3f((float)x1+1, (float)y1, (float)z1);
glVertex3f((float)x1-1, (float)y1, (float)z1);
glEnd();
glBegin(GL_POLYGON);
glVertex3f((float)x1, (float)y1+5, (float)z1-2);
glVertex3f((float)x1, (float)y1+5, (float)z1+2);
glVertex3f((float)x1, (float)y1, (float)z1+2);
glVertex3f((float)x1, (float)y1, (float)z1-2);
glEnd();
glBegin(GL_POLYGON);
glColor3f(0.35f, 0.7f, 0.0f);
glTexCoord2f(0.0f, 0.0f);
glVertex3f((float)x1-10, (float)y1+5, (float)z1);
glTexCoord2f(0.5f, 1.0f);
glVertex3f((float)x1, (float)y1+25, (float)z1);
glTexCoord2f(1.0f, 0.0f);
glVertex3f((float)x1+10, (float)y1+5, (float)z1);
glEnd();
glBegin(GL_POLYGON);
glColor3f(0.4f, 0.8f, 0.0f);
glTexCoord2f(0.0f, 0.0f);
glVertex3f((float)x1, (float)y1+5, (float)z1-10);
glTexCoord2f(0.5f, 1.0f);
glVertex3f((float)x1, (float)y1+25, (float)z1);
glTexCoord2f(1.0f, 0.0f);
glVertex3f((float)x1, (float)y1+5, (float)z1+10);
glEnd();
}
// Function that moves the eye or turns the angle of sight.
// Updates scene if update != 0.
void CRenderView::MoveEye(int type, GLfloat amount, int update)
{
GLfloat a;
switch(type){
case FORWARD:
patriot_posx += lookx*amount*2;
patriot_posz += lookz*amount*2;
break;
case TURNLEFT:
lookx = lookx*(float)cos(amount) + lookz*(float)sin(amount);
lookz = lookz*(float)cos(amount) - lookx*(float)sin(amount);
// 因?yàn)楦↑c(diǎn)數(shù)計(jì)算存在誤差,因此有時(shí)lookx^2 + lookz^2 != 1,以下進(jìn)行校正
a = 1.0f / (float)sqrt(lookx*lookx + lookz*lookz);
lookx *= a;
lookz *= a;
break;
case STRAFELEFT:
patriot_posx += lookz * amount;
patriot_posz -= lookx * amount;
break;
case UP:
patriot_posy += amount;
break;
case LOOKUP:
looky += amount;
break;
}
CheckHeight();
glPushMatrix();
glPopMatrix();
if (update){
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
glBegin(GL_POLYGON);
glVertex3f(patriot_posx+lookx, patriot_posy+looky, patriot_posz+lookz);
glVertex3f(patriot_posx+lookx, patriot_posy+looky+10, patriot_posz+lookz);
glVertex3f(patriot_posx+lookx, patriot_posy+looky-10, patriot_posz+lookz);
glEnd();
}
}
void CRenderView::DrawPatriot(void)
{
GLfloat no_mat[] = { 0.05f, 0.05f, 0.05f, 1.0f };
GLfloat mat_ambient[] = { 0.35f, 0.35f, 0.45f, 1.0f };
GLfloat mat_diffuse[] = { 0.6f, 0.6f, 0.8f, 1.0f };
GLfloat mat_specular[] = { 1.0f, 1.0f, 1.0f, 1.0f };
GLfloat no_shininess[] = { 0.0f };
GLfloat low_shininess[] = { 100.0f };
GLfloat high_shininess[] = { 10.0f };
GLfloat mat_emission[] = {0.3f, 0.2f, 0.2f, 0.0f};
GLfloat ambient[4] = { 0.2f, 0.2f, 0.3f, 1.0f };
GLfloat diffuse[4] = { 0.8f, 0.8f, 1.0f, 1.0f };
GLfloat specular[4] = { 1.0f, 1.0f, 1.0f, 1.0f };
GLfloat position[4] = { 10.0f,10.0f,10.0f, 1.0f };
glLightfv(GL_LIGHT0, GL_AMBIENT, ambient);
glLightfv(GL_LIGHT0, GL_DIFFUSE, diffuse);
glLightfv(GL_LIGHT0, GL_SPECULAR,specular);
glLightfv(GL_LIGHT0, GL_POSITION, position);
glEnable (GL_LIGHTING);
glEnable (GL_LIGHT0);
glMaterialfv(GL_FRONT, GL_AMBIENT, mat_ambient);
glMaterialfv(GL_FRONT, GL_DIFFUSE, mat_diffuse);
glMaterialfv(GL_FRONT, GL_SPECULAR, mat_specular);
glMaterialfv(GL_FRONT, GL_SHININESS, low_shininess);
glMaterialfv(GL_FRONT, GL_EMISSION, no_mat);
glDepthFunc(GL_LESS);
glEnable(GL_DEPTH_TEST);
glmDraw(patriot, GLM_SMOOTH|GLM_MATERIAL);
glDisable(GL_LIGHTING);
}
void CRenderView::DrawPlane(void)
{
GLfloat no_mat[] = { 0.05f, 0.05f, 0.05f, 1.0f };
GLfloat mat_ambient[] = { 0.35f, 0.35f, 0.45f, 1.0f };
GLfloat mat_diffuse[] = { 0.6f, 0.6f, 0.8f, 1.0f };
GLfloat mat_specular[] = { 1.0f, 1.0f, 1.0f, 1.0f };
GLfloat low_shininess[] = { 100.0f };
GLfloat mat_emission[] = {0.3f, 0.2f, 0.2f, 0.0f};
GLfloat ambient[4] = { 1.0f, 1.0f, 1.0f, 1.0f };
GLfloat diffuse[4] = { 1.0f, 1.0f, 1.0f, 1.0f };
GLfloat specular[4] = { 1.0f, 1.0f, 1.0f, 1.0f };
GLfloat position[4] = { 0.0f,0.0f,10.0f, 1.0f };
glLightfv(GL_LIGHT0, GL_AMBIENT, ambient);
glLightfv(GL_LIGHT0, GL_DIFFUSE, diffuse);
glLightfv(GL_LIGHT0, GL_SPECULAR,specular);
glLightfv(GL_LIGHT0, GL_POSITION, position);
glEnable(GL_LIGHT0);
glEnable(GL_LIGHTING);
glMaterialfv(GL_FRONT, GL_AMBIENT, mat_ambient);
glMaterialfv(GL_FRONT, GL_DIFFUSE, mat_diffuse);
glMaterialfv(GL_FRONT, GL_SPECULAR, mat_specular);
glMaterialfv(GL_FRONT, GL_SHININESS, low_shininess);
glMaterialfv(GL_FRONT, GL_EMISSION, no_mat);
glDepthFunc(GL_LESS);
glEnable(GL_DEPTH_TEST);
glmDraw(plane, GLM_SMOOTH);
glDisable(GL_LIGHTING);
}
void CRenderView::TrackObj(void)
{
float ta=-90.0f, thita=ta*PI/180.0f, distance=20.0f;
static GLuint FireList = 0;
CPaintDC dc(this);
HWND hWnd = GetSafeHwnd();
HDC hDC = ::GetDC(hWnd);
wglMakeCurrent(hDC,m_hGLContext);
glPushMatrix();
glLoadIdentity();
gluLookAt(patriot_posx, patriot_posy, patriot_posz,patriot_posx+lookx, patriot_posy+looky, patriot_posz+lookz, 0.0f,1.0f,0.0f);
glTranslatef(patriot_posx+lookx, patriot_posy+looky, patriot_posz+lookz);
if (Shoot){
glRotatef(-90,1,0,0);
glRotatef(-30,0,1,0);
glTranslatef(0, 5, 0);
DrawPatriot();
glCallList(FireList+1);
FireList = (FireList+1) % LIST;
} else {
glRotatef(-90,1,0,0);
glRotatef(-30,0,0,1);
DrawPlane();
}
if (L>12 || L<10) flag=1-flag;
if (flag) L-=0.1f; else L+=0.1f;
counter++;
patriot_posx=patriot_posx-(float)cos(thita)*14.0f;
patriot_posz=patriot_posz+(float)sin(thita)*14.0f;
CheckHeight();
glDisable(GL_BLEND);
glPopMatrix();
}
void CRenderView::GenFire()
{
float r,dt,dy,t,y;
int k, l, ff, i, j, list;
for (list=0; list<LIST; list++){
srnd=0;
for (i=0;i<CN;i++){
tmp[i][0]=(float)(cos(i*2.0f*PI/CN));
tmp[i][1]=(float)(sin(i*2.0f*PI/CN));
}
for (j=0; j<6; j++)
for (k=0; k<CN; k++){
red_green[j][k]=2*rand()/32767.0f;
tail[j][k]=TAILL*rand()/32767.0f+1;
}
ff=(srnd++)%6;
dt=(float)(DT/L*PI);
dy=(float)((L-DT)/VN);
y=0;
for(k=0;k<=VN;k++)
{
r=(float)(H*sin(y*PI/L+dt));
for(l=0;l<CN;l++)
{
vetxm[list][k][l][0]=r*tmp[l][0];
vetxm[list][k][l][1]=-y;
vetxm[list][k][l][2]=r*tmp[l][1];
vetxm[list][k][l][6]=1;
if (y<=red_green[ff][l]){
t=y/red_green[ff][l];
vetxm[list][k][l][3]=vetxm[list][k][l][4]=t*t+0.1f;
vetxm[list][k][l][4]=vetxm[list][k][l][3]-0.3f;
vetxm[list][k][l][5]=vetxm[list][k][l][4]+0.4f;
} else {
vetxm[list][k][l][3]=1.0f-y/(L-DT+ADDL);
vetxm[list][k][l][4]=vetxm[list][k][l][3]-0.3f;
vetxm[list][k][l][5]=0.08f;
}
t=L-DT-y;
if(t<=tail[ff][l])
vetxm[list][k][l][6]=0;
}
y+=dy;
}
}
}
void CRenderView::MakeFireList()
{
int k, l,list;
for (list = 0; list < LIST; list++){
glNewList(list+1, GL_COMPILE);
glEnable(GL_BLEND);
glBlendFunc(GL_SRC_ALPHA,GL_ONE);
glDisable(GL_LIGHTING);
glDisable(GL_DEPTH_TEST);
for(k=0;k<VN;k++)
{
for(l=0;l<CN-1;l++)
{
glBegin(GL_POLYGON);
glColor4f(vetxm[list][k][l][3],vetxm[list][k][l][4],vetxm[list][k][l][5],vetxm[list][k][l][6]);
glVertex3f(vetxm[list][k][l][0],vetxm[list][k][l][1],vetxm[list][k][l][2]);
glColor4f(vetxm[list][k+1][l][3],vetxm[list][k+1][l][4],vetxm[list][k+1][l][5],vetxm[list][k+1][l][6]);
glVertex3f(vetxm[list][k+1][l][0],vetxm[list][k+1][l][1],vetxm[list][k+1][l][2]);
glColor4f(vetxm[list][k+1][l+1][3],vetxm[list][k+1][l+1][4],vetxm[list][k+1][l+1][5],vetxm[list][k+1][l+1][6]);
glVertex3f(vetxm[list][k+1][l+1][0],vetxm[list][k+1][l+1][1],vetxm[list][k+1][l+1][2]);
glColor4f(vetxm[list][k][l+1][3],vetxm[list][k][l+1][4],vetxm[list][k][l+1][5],vetxm[list][k][l+1][6]);
glVertex3f(vetxm[list][k][l+1][0],vetxm[list][k][l+1][1],vetxm[list][k][l+1][2]);
glEnd();
glFlush();
}
glBegin(GL_POLYGON);
glColor4f(vetxm[list][k][l][3],vetxm[list][k][l][4],vetxm[list][k][l][5],vetxm[list][k][l][6]);
glVertex3f(vetxm[list][k][l][0],vetxm[list][k][l][1],vetxm[list][k][l][2]);
glColor4f(vetxm[list][k+1][l][3],vetxm[list][k+1][l][4],vetxm[list][k+1][l][5],vetxm[list][k+1][l][6]);
glVertex3f(vetxm[list][k+1][l][0],vetxm[list][k+1][l][1],vetxm[list][k+1][l][2]);
glColor4f(vetxm[list][k+1][0][3],vetxm[list][k+1][0][4],vetxm[list][k+1][0][5],vetxm[list][k+1][0][6]);
glVertex3f(vetxm[list][k+1][0][0],vetxm[list][k+1][0][1],vetxm[list][k+1][0][2]);
glColor4f(vetxm[list][k][0][3],vetxm[list][k][0][4],vetxm[list][k][0][5],vetxm[list][k][0][6]);
glVertex3f(vetxm[list][k][0][0],vetxm[list][k][0][1],vetxm[list][k][0][2]);
glEnd();
}
glFlush();
glDisable(GL_BLEND);
glDisable(GL_CULL_FACE);
glEnable(GL_DEPTH_TEST);
glEndList();
}
}
void CRenderView::OnTimer(UINT nIDEvent)
{
loop+=1.0f;
Invalidate(FALSE);
}
?? 快捷鍵說(shuō)明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -