资源简介

VC++6.0中实现了以OpenGL为平台的太地球、月亮之间运动图,并可以实现上下左右的移动(场景漫游);对理解世界坐标系与物体坐标系之间的转换关系有一定帮助。这个程序包里面有详细的word格式的讲解,希望对大家有帮助

资源截图

代码片段和文件信息

#include
#include
#include
#include
#include
#include

HDC hDC=NULL; // 窗口着色描述表句柄HDC hDC=NULL; // 窗口着色描述表句柄
HGLRC hRC=NULL; // OpenGL渲染描述表句柄
HWND hWnd=NULL; // 保存我们的窗口句柄
HINSTANCE hInstance; // 保存程序的实例

bool keys[256]; // 保存键盘按键的数组
bool active=TRUE; // 窗口的活动标志,缺省为TRUE
bool fullscreen=TRUE; // 全屏标志缺省,缺省设定成全屏模式

GLfloat rtri=0.0f;
GLfloat rquad=0.0f;

GLfloat xrot; // X 旋转量
GLfloat yrot; // Y 旋转量
GLfloat zrot;
GLfloat xspeed; // X 旋转速度
GLfloat yspeed; // Y 旋转速度

//GLuint texture[6]; // 存储六个纹理

BOOL light=TRUE; // 光源的开/关
BOOL lp=FALSE; // L键按下了么?
BOOL fp=FALSE; // F键按下了么?

GLfloat LightAmbient[]= { 1.0f 1.0f 1.0f 1.0f };  // 环境光参数
GLfloat LightDiffuse[]= { 50.0f 0.0f 0.0f 1.0f };  // 漫射光参数
GLfloat LightPosition[]= { 0.0f 0.0f 0.0f 1.0f };  // 光源位置

GLuint Filter=0; // 滤波类型
GLuint texture[12]; // 3种纹理的储存空间

BOOL blend;
BOOL bpwpsp;

GLUquadricObj *quadratic; // 二次几何体
GLuint  object=0; // 二次几何体标示符

unsigned long dwRotationdwRevolution;
HANDLE h_Rotationh_Revolution;


GLfloat xtrytrztr;
GLfloat fEarthRad=0.8/100.0f;
GLfloat fMoonRad=fEarthRad*(GLfloat)(109.0/400.0);
GLfloat fSunRad=109*fEarthRad;
#define PI 3.14159

GLfloat a=2.5f;
GLfloat b=2.2f;
GLfloat SunxSunzEllxEllzEarthxEarthzMoonxMoonz;
GLfloat angleMoveAngle=0VertexAngle=0;

GLfloat x=0.0fy=0.0fz=5.0f
lx=0.0fly=0.0flz=-1.0f;

AUX_RGBImageRec *LoadBMP(char *Filename) // 载入位图图象
{
FILE *File=NULL; // 文件句柄
if (!Filename) // 确保文件名已提供
{
return NULL; // 如果没提供,返回 NULL
}
File=fopen(Filename“r“); // 尝试打开文件
if (File) // 文件存在么?
{
fclose(File); // 关闭句柄
return auxDIBImageLoad(Filename); // 载入位图并返回指针
}

MessageBox(NULL“载入位图失败!“NULLMB_OK);
return NULL; // 如果载入失败,返回 NULL
}

int LoadGLTextures() // 载入位图(调用上面的代码)并转换成纹理
{
int Status=FALSE; // 状态指示器
int loop;
int i=0j=0;
AUX_RGBImageRec *TextureImage[4]; // 创建纹理的存储空间
memset(TextureImage0sizeof(void *)*4); // 将指针设为 NULL
// 载入位图,检查有无错误,如果位图没找到则退出

if((TextureImage[0]=LoadBMP(“Data/earth.bmp“))&&(TextureImage[1]=LoadBMP(“Data/moon.bmp“))&&(TextureImage[2]=LoadBMP(“Data/sun2.bmp“))
&&(TextureImage[3]=LoadBMP(“Data/star.bmp“)))
{
Status=TRUE; // 将 Status 设为 TRUE
glGenTextures(12 &texture[0]); // 创建纹理

while(i<10){
// 创建 Nearest 滤波贴图
glBindTexture(GL_TEXTURE_2D texture[0+i]);
glTexParameteri(GL_TEXTURE_2DGL_TEXTURE_MAG_FILTERGL_NEAREST); 
glTexParameteri(GL_TEXTURE_2DGL_TEXTURE_MIN_FILTERGL_NEAREST); 
glTexImage2D(GL_TEXTURE_2D 0 3 TextureImage[j]->sizeX TextureImage[j]->sizeY 0 GL_RGB GL_UNSIGNED_BYTE TextureImage[j]->data);
// 创建线性滤波纹理
glBindTexture(GL_TEXTURE_2D texture[1+i]);
glTexParameteri(GL_TEXTURE_2DGL_TEXTURE_MAG_FILT

评论

共有 条评论