qt + opengl 绘制地球

33 篇文章 4 订阅
28 篇文章 3 订阅

方法:

先载入纹理图(pLoadTex函数);

再画建立一个二次曲面物体(gluNewQuadric函数),并利用函数gluQuadricTexture声明这个二次曲面可以贴纹理;

在paintGL函数里,只要调用glBindTexture和gluSphere函数,即可绘制地球。

代码:

pro文件:

#-------------------------------------------------
#
# Project created by QtCreator 2017-11-19T07:35:32
#
#-------------------------------------------------

QT       += core gui opengl

greaterThan(QT_MAJOR_VERSION, 4): QT += widgets

TARGET = GlEarth
TEMPLATE = app


SOURCES += main.cpp\
        mainwindow.cpp

HEADERS  += mainwindow.h

FORMS    += mainwindow.ui
LIBS += -lopengl32 -lGLU32

h文件:

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QOpenGLWidget>
#include <QOpenGLFunctions>
#include <GL/GLU.H>



class MainWindow : public QOpenGLWidget, protected QOpenGLFunctions
{
    Q_OBJECT

public:
    explicit MainWindow(QWidget *parent = 0);
    ~MainWindow();

private:
    GLUquadricObj   *       m_pQuadObj;
    GLuint                  m_uiTexture;
    unsigned char   *       pLoadTex(char *, unsigned long &, unsigned long &);
protected:
    void            initializeGL();
    void            paintGL();
    void            resizeGL(int w, int h);
};

#endif // MAINWINDOW

cpp:

#include "mainwindow.h"
#include <QDir>


MainWindow::MainWindow(QWidget *parent) :
    QOpenGLWidget(parent)
{

}

MainWindow::~MainWindow()
{
    glDeleteTextures(1, &m_uiTexture);
	gluDeleteQuadric(m_pQuadObj);     
}

void MainWindow::initializeGL()
{
    initializeOpenGLFunctions();

    unsigned long bWidth = 0;
    unsigned long bHeight = 0;

    QString qstrPath = QDir::currentPath();
    qstrPath += "/earth.bmp";
    unsigned char * pData = pLoadTex(qstrPath.toLatin1().data(), bWidth, bHeight);


    glGenTextures(1, &m_uiTexture);
    glBindTexture(GL_TEXTURE_2D, m_uiTexture);
    	
    glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR);
    glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR);

	gluBuild2DMipmaps(GL_TEXTURE_2D, 3, bWidth, bHeight, GL_BGR_EXT, GL_UNSIGNED_BYTE, pData);
 

	glEnable(GL_TEXTURE_2D);
    m_pQuadObj = gluNewQuadric();//创建一个二次曲面物体
	gluQuadricDrawStyle(m_pQuadObj, GL_FILL);
	gluQuadricNormals(m_pQuadObj, GLU_SMOOTH);
	gluQuadricOrientation(m_pQuadObj, GLU_OUTSIDE);
    gluQuadricTexture(m_pQuadObj,GL_TRUE);

    if (pData)
        free(pData);

    glClearColor(0,0,0,0);
    glEnable(GL_DEPTH_TEST);
}

void MainWindow::paintGL()
{
    glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

	//glEnable(GL_TEXTURE);
    glBindTexture(GL_TEXTURE_2D, m_uiTexture);
    gluSphere(m_pQuadObj, 1.0f, 20, 20);
	//glDisable(GL_TEXTURE);
    //gluDeleteQuadric(m_pQuadObj);                    //删除二次曲面对象
}

void MainWindow::resizeGL(int w, int h)
{
    glViewport(0,0,w,h);

	glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    /*GLfloat fAspect;
    fAspect = (float)w / (float)h;
    gluPerspective(45.0, fAspect, 1.0, 500.0);*/
	glOrtho(-2, 2, -2, 2, 0, 10);
    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity();
}

unsigned char * MainWindow::pLoadTex(char * Image, unsigned long & bWidth, unsigned long & bHeight)
{
    FILE* img = NULL;
    img = fopen(Image, "rb");

    DWORD size = 0;

    fseek(img,18,SEEK_SET);
    fread(&bWidth,4,1,img);
    fread(&bHeight,4,1,img);
    fseek(img,0,SEEK_END);
    size = ftell(img) - 54;

    unsigned char *data = (unsigned char*)malloc(size);

    fseek(img,54,SEEK_SET);    // image data
    fread(data,size,1,img);

    fclose(img);

    return data;
}


earth.bmp纹理图片在我的资源中。


效果是从南极看地球:




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值