OpenGL绘制地球仪

文章目录

  • OpenGL绘制地球仪
    • 环境配置
    • glut配置
    • glaux环境配置
    • 源码
      • Main.cpp
      • MyTexMgr.h
      • MyTexMgr.cpp
    • 资料下载

环境配置

使用软件:visual studio 2019

glut配置

新建一新项目(控制台应用)点击项目/管理NuGet程序包

搜索nupengl,安装,至此glut配置完成

glaux环境配置

可以自行下载glaux,也可以在文章底部链接下载

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-2o5yVql7-1671718380622)(C:\Users\zdsss\AppData\Roaming\Typora\typora-user-images\image-20221222220311033.png)]

glaux.dll放置在

C:\Windows\SysWOW64(64位)

C:\Windows\System32(32位)

glaux.h放置在

C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\VC\Tools\MSVC\14.29.30133\include

在此目录下新建一GL文件夹,将glaux.h放进去

glaux.lib放置在

C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\VC\Tools\MSVC\14.29.30133\lib\x86

ps:位置可能不一致,但大体相同

源码

Main.cpp

#include "MyTexMgr.h"
#include <iostream>
#include <stdlib.h>
#include <vector>
#include "MyTexMgr.h"
#include <GL/glut.h>
#define  GLUT_WHEEL_UP 3           //定义滚轮操作
#define  GLUT_WHEEL_DOWN 4using namespace std;static float _angle = 30.0f;
static float _cameraAngle = 0.0f;
static int oldX;
static int oldY;
static int X = 400;
static int Y = 240;
static int flag = 33;
static float _rotX=0;
static float _rotY=0;
static float xyz[3]={1,1,1};
static float r=200;static GLUquadric*  _earth;
static MyTexMgr     _texLoader;//键盘操作
void handleKeypress(unsigned char key, int x, int y) {switch (key) {case 27: //Escape keyexit(0);break;//按键+为我旋转加速case '+':flag -= 3;break;//按键+为我旋转减速case '-':flag += 3;break;case 'w':Y += 20;break;case 'a':X -= 20;break;case 's':Y -= 20;break;case 'd':X += 20;break;}
}//光照
void initLight()
{GLfloat    position[] = { -1.0,1.0,1.0,0};GLfloat ambientLight[]={0.4,0.4,0.4,1};GLfloat diffuseLight[]={0.8,0.8,0.8,1};GLfloat specularLight[]={0.8,0.8,0.8,1};GLfloat posLight[]={400,240,1,1};//设置照明模型参数//全局环境光glLightModelfv(GL_LIGHT_MODEL_AMBIENT,ambientLight);//环境光glLightfv(GL_LIGHT0,GL_AMBIENT,ambientLight);//位置glLightfv(GL_LIGHT0, GL_POSITION, position);//漫射光glLightfv(GL_LIGHT0,GL_DIFFUSE,diffuseLight);//反射光glLightfv(GL_LIGHT0,GL_SPECULAR,specularLight);//指定材质glMaterialf(GL_FRONT_AND_BACK,GL_SHININESS,128);
}//定义D建模光照材质
void initRendering() {//创建二次曲面对象_earth=gluNewQuadric();//纹理装载(指定bmp位图位置)_texLoader.loadTex(L"earth",L"D:/download/earth.bmp");glEnable(GL_LIGHT0);glEnable(GL_LIGHTING);initLight();glEnable(GL_DEPTH_TEST);glEnable(GL_LINE_SMOOTH);
}//删除建模
void deinitRendering()
{gluDeleteQuadric(_earth);
}//窗口调整调用
void handleResize(int w, int h) {if (h==0){h=1;} glViewport(0, 0, w, h);glMatrixMode(GL_PROJECTION);glLoadIdentity();glOrtho(0,w,0,h,-200,200);glMatrixMode(GL_MODELVIEW);
}//画地球
void drawEarth()
{static bool loaded=false;//纹理绑定到目标glBindTexture(GL_TEXTURE_2D,_texLoader.getTex(L"earth"));if (!loaded){    //纹理坐标自动生成  glTexGeni(GL_S,GL_TEXTURE_GEN_MODE,GL_SPHERE_MAP);glTexGeni(GL_T,GL_TEXTURE_GEN_MODE,GL_SPHERE_MAP);//表面生成纹理坐标gluQuadricDrawStyle(_earth,GL_FILL);gluQuadricNormals(_earth,GLU_SMOOTH);//生成纹理坐标gluQuadricTexture(_earth,GL_TRUE);}//生成球体glPushMatrix();{    glEnable(GL_TEXTURE_2D);glRotatef(-90,1,0,0);gluSphere(_earth,r,100,100);glDisable(GL_TEXTURE_2D);}glPopMatrix();}//绘制D场景
void drawScene() {glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);glMatrixMode(GL_MODELVIEW); //切换到绘图透视图glLoadIdentity(); //重置绘图透视图glPushMatrix();//实现缩放glScalef(xyz[0],xyz[1],xyz[2]);//此时需要把地球往后方移动防止放大的时候中间出现黑色圆圈glTranslatef(X,Y,-200);//实现拖动旋转glRotatef(_rotX/100,0,1,0);glRotatef(-_rotY/100,1,0,0);//实现自动旋转glRotatef(_angle,0,1,0);drawEarth();glPopMatrix();glutSwapBuffers();
}//实现自动旋转效果
void update(int value) {_angle += 2.0f;if (_angle > 360) {_angle -= 360;}//刷新glutPostRedisplay(); //初始值为30fpsglutTimerFunc(flag, update, 0);
}//处理鼠标点击旋转事件
//处理鼠标点击滑动事件
void handleMotion(int x,int y)
{int rx=x-oldX;int ry=480-y-oldY;_rotX+=rx;_rotY+=ry;//重画glutPostRedisplay();
}//处理鼠标事件
void handleMouse(int button,int state,int x,int y)
{   //控制旋转static bool done=false;if (button==GLUT_LEFT_BUTTON){  oldX=x;oldY=480-y;}   //放大if (button == GLUT_WHEEL_UP) {xyz[0] += 0.1; xyz[1] += 0.1; xyz[2] += 0.1;glutPostRedisplay();}//缩小if (button == GLUT_WHEEL_DOWN) {if (xyz[0] > 0.4) {xyz[0] -= 0.1; xyz[1] -= 0.1; xyz[2] -= 0.1;}glutPostRedisplay();}
}int main(int argc, char** argv) {//初始化glutInit(&argc, argv);glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGBA | GLUT_DEPTH);glutInitWindowSize(800, 480);//创建窗口glutCreateWindow("地球仪");initRendering();//设置用户操作glutDisplayFunc(drawScene);glutKeyboardFunc(handleKeypress);glutReshapeFunc(handleResize);glutMotionFunc(handleMotion);glutMouseFunc(handleMouse);//运动效果glutTimerFunc(flag, update, 0); glutMainLoop();//退出时删除建模deinitRendering();return 0;
}

MyTexMgr.h

#pragma once#include <string>
#include <map>
#include <gl/GLAux.h>using namespace std;enum TexMgrErrCode
{INVALD_TEXTURE = 0
};typedef unsigned int uint;/**@class MyTexMgr@brief Texture管理*/
class MyTexMgr
{
public:MyTexMgr(void);virtual ~MyTexMgr(void);public:bool   loadTex(const wstring& texName, const wstring& fileName);uint   getTex(const wstring& texName);bool delTex(const wstring& texName);public:bool  clear();protected:AUX_RGBImageRec* loadBMP(const wchar_t* fileName);map<wstring, uint>    m_textures;
};

MyTexMgr.cpp

#include <GL/glaux.h>
#pragma comment ( lib, "glaux.lib" )
#include "MyTexMgr.h"
#include <fstream>
#include <gl/GL.h>
#include <gl/GLU.h>MyTexMgr::MyTexMgr(void)
{
}MyTexMgr::~MyTexMgr(void)
{if (m_textures.empty()){return;}map<wstring, uint>::iterator it;for (it = m_textures.begin(); it != m_textures.end(); ++it){glDeleteTextures(1, &it->second);}
}bool MyTexMgr::loadTex(const wstring& texName, const wstring& fileName)
{GLuint newElem;glGenTextures(1, &newElem);AUX_RGBImageRec* rec = loadBMP(fileName.c_str());if (!rec){glDeleteTextures(1, &newElem);return false;}glBindTexture(GL_TEXTURE_2D, newElem);glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, rec->sizeX, rec->sizeY,0, GL_RGB, GL_UNSIGNED_BYTE, rec->data);glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);if (getTex(texName) != INVALD_TEXTURE){delTex(texName);}m_textures.insert(make_pair(texName, newElem));delete    rec->data;free(rec);return true;}uint MyTexMgr::getTex(const wstring& texName)
{map<wstring, uint>::iterator it;it = m_textures.find(texName);if (it != m_textures.end()){return it->second;}else{return INVALD_TEXTURE;}
}bool MyTexMgr::delTex(const wstring& texName)
{map<wstring, uint>::iterator it;it = m_textures.find(texName);if (it != m_textures.end()){glDeleteTextures(1, &it->second);m_textures.erase(it);}return true;
}AUX_RGBImageRec* MyTexMgr::loadBMP(const wchar_t* fileName)
{wifstream infile(fileName);if (infile.is_open()){return auxDIBImageLoadW(fileName);}else{return NULL;}}bool MyTexMgr::clear()
{if (m_textures.empty()){return true;}map<wstring, uint>::iterator it;for (it = m_textures.begin(); it != m_textures.end(); ++it){glDeleteTextures(1, &it->second);}m_textures.clear();return true;
}

资料下载

百度网盘 提取码:jh09

OpenGL绘制地球仪(包含环境配置)相关推荐

  1. 【OpenGL学习笔记①】——openGL flew flgw flut 环境配置 + 绘制出Hello World

      该文章旨在帮助 计算机图形学 openGL 初学者快速安装和配置 openGL的环境(包括glew和glfw,还有glut[进阶]),并手把手指导如何绘制出第一句 "Hello Worl ...

  2. 老子不信我学不会OpenGL系列!001 环境配置!

    附录: GLFW: Window Guide: GLFW的官方帮助 Building applications: 对 编译.链接 这个过程的一个解释,而且还有一个错误列表. GLFW with Cod ...

  3. [转]OpenGL超级宝典 5e 环境配置

    OpenGL超级宝典(第五版)环境配置 1.各种库的配置 (1)glew 下载:https://sourceforge.net/projects/glew/files/glew/1.7.0/glew- ...

  4. OpenGL超级宝典 5e 环境配置

    OpenGL超级宝典(第五版)环境配置 1.各种库的配置 (1)glew 下载:https://sourceforge.net/projects/glew/files/glew/1.7.0/glew- ...

  5. OpenGL超级宝典开发环境配置(VS2010)

    <OpenGL超级宝典>第五版中的例子使用了GLEW.freeglut和GLTools三个库. 1.GLEW The OpenGL Extension Wrangler Library i ...

  6. OpenGL学习入门之VS2010环境配置 [转]

    OpenGL开发环境简介 基于OpenGL标准开发的应用程序运行时需有动态链接库OpenGL32.DLL.Glu32.DLL,这两个文件在安装Windows NT时已自动装载到C:\WINDOWS\S ...

  7. 图解VC++ opengl环境配置和几个入门例子

    VC6下载 http://blog.csdn.net/bcbobo21cn/article/details/44200205 demo工程和glut库下载 http://pan.baidu.com/s ...

  8. Windows7+VS2012下OpenGL 4的环境配置

    系统环境 Windows 7 Ultimate x64,Visual Studio Ultimate 2012 Update 4,和一块支持OpenGL 4.x的显卡. 准备工作 首先用GPU Cap ...

  9. OpenGL 环境配置教程-库文件汇总【glfw/glew/glad/glm/std_img】

    OpenGL的环境配置是最让初学者头疼的事情了,主要是一开始链接什么glfw.glad,不知道有什么用,什么链接库.包含目录很头大,有一步做错就可能一大堆报错. 本文对LearnOpenGL CN教程 ...

最新文章

  1. HDU 2181 哈密顿绕行世界问题【DFS】
  2. 最长公共子序列的C++实现---附二维指针的使用方法
  3. 由init、loadView、viewDidLoad、viewDidUnload、dealloc的关系说起
  4. 键盘-App监听软键盘按键的三种方式
  5. 8-10 牛客网刷题知识点集合
  6. Python——列表中存放字典遇到的问题
  7. python三种数据类型_Python零基础入门学习02:Python基本数据类型:数字类型
  8. UI设计中的弹窗设计素材,技巧快get起来
  9. SDRAM容量的计算方法
  10. Qt三方库开发技术:Qt应用内部打开PDF文件
  11. 解决浏览器不能安装idm插件
  12. 关于吾爱(52)破解网注册时临时安全验证码以及填完信息没有确认或提交按钮的问题
  13. 计算机网络——FTP网络服务器
  14. 金星DEM数据介绍与下载教程
  15. 使用SpringBoot构建项目时运行出现Java HotSpot(TM) 64-Bit Server VM warning但是不影响运行
  16. 计算机维修实操,wt初级计算机维修工操作题(二).doc
  17. 重装Win10系统之U盘启动盘的制作(详细教程)
  18. GA005-185-10
  19. 抓包工具fiddler
  20. java 判断 子集_java – 获取集合子集的策略

热门文章

  1. 易语言编程-远程封包拦截与发送技术
  2. thinkphp框架配置验证是否登录公共函数的方法
  3. QRCode 二维码:生于日本,辉煌于中国,原理及(python)实现
  4. wdr6500虚拟服务器,TP-Link TL-WDR6500双频无线路由器的安装教程
  5. 发文章的期刊-山东省期刊
  6. r语言 python 金融 论文_R语言实现金融数据的时间序列分析及建模
  7. 电动车断码屏为什么更适宜选用LCD显示屏
  8. 安全测试常用几个工具(开源商业)调研
  9. 长三角数学建模------赛后总结
  10. 前端程序员必备的 6 个浏览器插件!