#include "std.h"
#include "obj.h"
#include "include/BITMAP.H"
extern GLfloat r;
float gao=1.8f;
extern CString test;
baiscobj::baiscobj()
{
g_text = gluNewQuadric(); //创建多变体
g_eye[0]= MAP;// 设置眼睛观察点
g_eye[2]=-MAP;//设置眼睛观察点
g_Angle=0; //设置观察的角度
g_elev=-0;
char appdir[256]; //保存当前运行路径
GetCurrentDirectory(256,appdir); //获取当前运行路径
CString dir=appdir;
if(dir.Right(8)!="运行程序")
SetCurrentDirectory("../运行程序"); //设置当前运行路径
g_imageData = LoadBit("data/images/Terrain1.bmp",&g_bit); //调等高地形图
LoadT8("data/images/sand3.bmp", g_cactus[0]); //地面帖图
LoadT8("data/images/4RBack.bmp",g_cactus[2]); //天空贴图后
LoadT8("data/images/4Front.bmp",g_cactus[3]); //天空贴图前
LoadT8("data/images/4Top.bmp", g_cactus[4]); //天空贴图顶
LoadT8("data/images/4Left.bmp", g_cactus[5]); //天空贴图左
LoadT8("data/images/4Right.bmp",g_cactus[6]); //天空贴图右
LoadT16("data/images/CACTUS2.bmp",g_cactus[11]); //树1帖图
LoadT16("data/images/CACTUS1.BMP",g_cactus[12]); //树2帖图
InitTerrain(5);//初始化地面
glEnable(GL_TEXTURE_2D);
}
baiscobj::~baiscobj()
{ for(int i=0;i<16;i++) glDeleteTextures(1, &g_cactus[i]); //删除纹理
glDisableClientState(GL_VERTEX_ARRAY); //关闭第二个纹理通道
glDisableClientState(GL_TEXTURE_COORD_ARRAY); //关闭纹理通道
}
void baiscobj::light0()
{ GLfloat light_position[] = {1.0,5.0,1.0,1.0}; //光源位置
glLightfv(GL_LIGHT0, GL_POSITION, light_position);
glEnable(GL_LIGHTING); //启动光源
glEnable(GL_LIGHT0); //启动光源0
glEnable(GL_DEPTH_TEST); //启用深度测试
glEnable(GL_COLOR_MATERIAL); //启动颜色材质, 允许使用颜色材质。启动之后我们才能通过颜色来设置材质
}
BOOL baiscobj::DisplayScene()
{ float speed=0.5f; //步长
float x=g_eye[0],y=g_eye[2],z=g_eye[2];
if (KEY_DOWN(VK_SHIFT)) speed =speed*2; //按SHIFT时的加速true
if (KEY_DOWN(VK_LEFT)) g_Angle-=speed*2; //左转,方位角-
if (KEY_DOWN(VK_RIGHT)) g_Angle+=speed*2; //右转,方位角+
rad_xz = float (3.13149* g_Angle/180.0f); //计算左右旋转角度
if (KEY_DOWN(33)) g_elev +=speed; //Page UP 键
if (KEY_DOWN(34)) g_elev -=speed; //Page Down键
if (g_elev<-360) g_elev =-360; //仰俯角
if (g_elev> 360) g_elev = 360; //仰俯角
if (KEY_DOWN(VK_UP)) //前进
{ g_eye[2]+=(float)sin(rad_xz)*speed; //视点的x分量
g_eye[0]+=(float)cos(rad_xz)*speed; //视点的Z分量
}
if (KEY_DOWN(VK_DOWN)) //后退
{ g_eye[2]-=(float)sin(rad_xz)*speed; //视点的x分量
g_eye[0]-=(float)cos(rad_xz)*speed; //视点的Z分量
}
//控制到摄像机不离开地面
if(g_eye[0]< MAP_SCALE) g_eye[0]= MAP_SCALE;
if(g_eye[0]> (MAP_W-2)*MAP_SCALE) g_eye[0]= (MAP_W-2)*MAP_SCALE;
if(g_eye[2]<-(MAP_W-2)*MAP_SCALE) g_eye[2]=-(MAP_W-2)*MAP_SCALE;
if(g_eye[2]> -MAP_SCALE) g_eye[2]= -MAP_SCALE;
g_eye[1] =GetHeight((float)g_eye[0],(float)g_eye[2])+gao;
g_look[0] = (float)(g_eye[0] +100*cos(rad_xz));
g_look[2] = (float)(g_eye[2] +100*sin(rad_xz));
g_look[1] = g_eye[1] +g_elev;
gluLookAt(g_eye[0],g_eye[1],g_eye[2], //视点
g_look[0],g_look[1],g_look[2], //目标点
0.0,1.0,0.0 //视点方向
);
return TRUE;
}
//==========================================================================
void baiscobj::InitTerrain(float h) //初始化地形
{ int index = 0;
int Vertex;
for (int z = 0; z < MAP_W; z++)
for (int x = 0; x < MAP_W; x++)
{ Vertex = z * MAP_W + x;
g_terrain [Vertex][0] = float(x)*MAP_SCALE; //地域数据X分量
g_terrain [Vertex][1] = (float)(g_imageData[(z*MAP_W+x)*3]/3); //Y分量,随机产生地形的高度
g_terrain [Vertex][2] = -float(z)*MAP_SCALE; //地域数据Z分量
g_texcoord[Vertex][0] = (float) x;//索引数组x
g_texcoord[Vertex][1] = (float) z; //索引数组z
g_index [index++] = Vertex;
g_index [index++] = Vertex+ MAP_W;
}
glEnableClientState(GL_VERTEX_ARRAY); //允许使用地域数组
glVertexPointer (3,GL_FLOAT,0,g_terrain); //装入地域数据
glEnableClientState(GL_TEXTURE_COORD_ARRAY); //允许使用索引数组
glTexCoordPointer (2,GL_FLOAT,0,g_texcoord); //装入索引数组
}
void baiscobj::DrawSand() //显示随机山势
{ glBindTexture(GL_TEXTURE_2D, g_cactus[0]); //地贴图
glTexEnvf (GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); //放大采用线性滤波
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_NEAREST);
for (int z = 0; z < MAP_W-1; z++)
glDrawElements(GL_TRIANGLE_STRIP,MAP_W*2,GL_UNSIGNED_INT,&g_index[z*MAP_W*2]);// 显示由顶点数组指定的面,结果就形成了高低不平的曲面
}
float baiscobj::GetHeight(float x, float z) // 取地面高度
{ float CameraX = x/MAP_SCALE; //计算在那一块
float CameraZ =-z/MAP_SCALE; //计算在那一块
int Col0 = int(CameraX); //块的列号
int Row0 = int(CameraZ); //块的行号
int Col1 = Col0 + 1; //相邻列
int Row1 = Row0 + 1; //相邻行
if (Col1 > MAP_W) Col1 = 0; //相邻列大于地块数,取首列
if (Row1 > MAP_W) Row1 = 0; //相邻行大于地块数,取首行
float h00=g_terrain[Col0 + Row0*MAP_W][1]; //获取块四角的高度
float h01=g_terrain[Col1 + Row0*MAP_W][1];
float h11=g_terrain[Col1 + Row1*MAP_W][1];
float h10=g_terrain[Col0 + Row1*MAP_W][1];
float tx =CameraX - int(CameraX); //求块内X偏移位置
float ty =CameraZ - int(CameraZ); //求块内Z偏移位置
float txty = tx * ty; //以下为双线性插值(内插)计算
return h00*(1.0f-ty-tx+txty)
+ h01*(tx-txty)
+ h11*txty
+ h10*(ty-txty); //返回插值计算值,为所求点的高度。
}
void baiscobj::CreateSkyBox(int a,int wi,int he,int le) //显示天空
{ float width =MAP*wi; // 天空盒宽
float height=MAP*he; // 天空盒高
float length=MAP*le; // 天空盒长
float x = MAP -width /2; // 天空的位置x
float y = MAP/a-height/2; // 天空的位置y
float z = -MAP -length/2; // 天空的位置z
texture(g_cactus[2]); // 设置BACK贴图左
glBegin(GL_QUADS); // 多组独立填充四边形
glTexCoord2f(1.0f,0.0f); glVertex3f(x+width,y, z);
glTexCoord2f(1.0f,1.0f); glVertex3f(x+width,y+height,z);
glTexCoord2f(0.0f,1.0f); glVertex3f(x, y+height,z);
glTexCoord2f(0.0f,0.0f); glVertex3f(x, y, z);
glEnd();
texture(g_cactus[3]); // 设置FRONT贴图右
glBegin(GL_QUADS); // 多组独立填充四边形
glTexCoord2f(1.0f,0.0f); glVertex3f(x, y, z+length);
glTexCoord2f(1.0f,1.0f); glVertex3f(x, y+height,z+length);
glTexCoord2f(0.0f,1.0f); glVertex3f(x+width,y+height,z+length);
glTexCoord2f(0.0f,0.0f); glVertex3f(x+width,y, z+length);
glEnd();
texture(g_cactus[4]); // 设置TOP贴图顶
glBegin(GL_QUADS); // 多组独立填充四边形
glTexCoord2f(0.0f,1.0f); glVertex3f(x+width,y+height,z);
glTexCoord2f(0.0f,0.0f); glVertex3f(x+width,y+height,z+length);
glTexCoord2f(1.0f,0.0f); glVertex3f(x, y+height,z+length);
glTexCoord2f(1.0f,1.0f); glVertex3f(x, y+height,z);
glEnd();
texture(g_cactus[5]); // 设置LEFT贴图前
glBegin(GL_QUADS); // 多组独立填充四边形
glTexCoord2f(1.0f,1.0f); glVertex3f(x, y+height,z);
glTexCoord2f(0.0f,1.0f); glVertex3f(x, y+height,z+length);
glTexCoord2f(0.0f,0.0f); glVertex3f(x, y, z+length);
glTexCoord2f(1.0f,0.0f); glVertex3f(x, y, z);
glEnd();
texture(g_cactus[6]); // 设置RIGHT贴图后
glBegin(GL_QUADS); // 多组独立填充四边形
glTexCoord2f(0.0f,0.0f); glVertex3f(x+width,y, z);
glTexCoord2f(1.0f,0.0f); glVertex3f(x+width,y, z+length);
glTexCoord2f(1.0f,1.0f); glVertex3f(x+width,y+height,z+length);
glTexCoord2f(0.0f,1.0f); glVertex3f(x+width,y+height,z);
glEnd();
}
void baiscobj::texture(UINT tex
没有合适的资源?快使用搜索试试~ 我知道了~
资源推荐
资源详情
资源评论
收起资源包目录
草原风景.rar (37个子文件)
草原风景
草原风景.plg 1KB
Std.h 929B
obj.cpp 12KB
草原风景.ncb 41KB
OpenGl.cpp 3KB
obj.h 1KB
Debug
vc60.pdb 60KB
草原风景.ilk 1.76MB
草原风景.pdb 2.78MB
data
images
4RBACK.BMP 33KB
4LEFT.BMP 33KB
4RIGHT.BMP 33KB
4FRONT.BMP 33KB
Terrain1.bmp 3KB
CACTUS2.BMP 192KB
SAND3.BMP 257KB
4TOP.BMP 65KB
CACTUS1.BMP 192KB
Thumbs.db 131KB
OpenGl.obj 18KB
草原风景.obj 14KB
vc60.idb 137KB
obj.obj 38KB
草原风景.pch 3.26MB
草原风景.exe 1.33MB
piano.wav 2.2MB
Std.obj 7KB
Std.cpp 16B
include
bitmap.h 3KB
vectorlib.h 2KB
OpenGl.h 754B
草原风景.cpp 3KB
草原风景.dsw 524B
草原风景.dsp 4KB
OpenGl.h.bak 781B
草原风景.opt 54KB
OpenGl.cpp.bak 3KB
共 37 条
- 1
TracyMcGrady_Houston
- 粉丝: 0
- 资源: 4
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功
- 1
- 2
前往页