《地形模型的三维可视化》程序设计
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
《地形模型的三维可视化》程序设计
一、题目
请用OpenGL图形库,编制程序实现地形模型的三维可视化,并进行地形模型的纹理设置,并可以通过键盘进行交互操作(移动和旋转)。
(注:给定的地形模型数据是已经建好的不规则三角网。)
二、提交资料
1.程序的详细步骤和所有相关数据;
步骤:①录入三角形数据
②获得地形的范围
③绘制三角网
④设置纹理坐标
⑤计算参考点的位置
⑥移动
相关数据文件:数据文件DHS.dat
三角网文件DHS.tri
图片文件TERRAIN.BMP
2. 程序清单(包括程序说明);
#include "stdafx.h"
#include
#include
#include
#include
#include
#include
void CALLBACK elbowAdd (void);
void CALLBACK elbowSubtract (void);
void CALLBACK shoulderAdd (void);
void CALLBACK shoulderSubtract (void);
//点结构定义
typedef struct
{
long id;
double x;
double y;
}POINTXYZ;
//三角形结构定义
typedef struct
{
long id; //三角形号
long p[3]; //三角形三个顶点的序号
long xl[3]; //拓扑关系
}TRIANGLE;
//顶点变量
POINTXYZ *pPt;
//三角形变量
TRIANGLE *pTri;
//顶点总数
int iTotalNum;
//三角形总数
int iTotalTriNum;
//外围结构
typedef struct vrtagBOX
{
double minx;
double miny;
double minz;
double maxx;
double maxy;
double maxz;
}vrBOX;
//外围结构
vrBOX _box;
unsigned int m_nID; //存储纹理的索引号
int m_nWidth; //纹理图片的宽度
int m_nHeight; //纹理图片的高度
float (*_ptexture)[2]; //存储三角网的纹理数据
//视点参考点的偏移量
double lookx, looky, lookz;
//移动的速度
float _speed;
//垂直方向视点和所要看实体的间的距离
//视点的位置
double _eyeposition[3];
//参考点的位置
double _referencepoint[3];
//鼠标位移与象素之比的分母,即象素数
int _Pixels;
//设置纹理坐标
void SetTextureCoord();
//读取纹理数据
bool LoadTriangleBMP( LPSTR szFileNameD);
//向前移动
void Move(bool is_forward);
//获得鼠标在x,y方向的相对位移量
bool Rotate(int dx, int dy);
//计算视点与参考点的位置
void _CalcuEyePositionAndReferencePoint(int type,float amount);
void myinit(void);
//读取点坐标、三角形数据
void ReadData();
void Render();
//获得外围
void SetBOX();
void CALLBACK myReshape(GLsizei w, GLsizei h);
void CALLBACK display(void);
//读取纹理数据
bool LoadTriangleBMP(char* szFileName)
{
AUX_RGBImageRec *pBitmap = NULL;
if(!szFileName) return false;
//装载数据并存储
pBitmap = auxDIBImageLoad(szFileName);
if(pBitmap == NULL) return false;
glGenTextures(1, &m_nID);
// 绑定纹理到纹理数组,并进行初始化。
glBindTexture(GL_TEXTURE_2D, m_nID);
//控制纹理,映射到片元(fragment)时怎样对待纹理。
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);