QGLViewer是在原生OpenGL的基礎上做了一層封裝,支持顯示和互動,而且與QT完美融合,可擴展性好,不足之處是這個庫只封裝了OpenGL1,其顯示速度有待提高,本人在開發環境搭建程序中也踩了不少坑,特此記錄,供日后查閱,
準備作業:下載并解壓libQGLViewer.zip
下載地址:http://libqglviewer.com/installWindows.html
解壓后如圖所示:

一、libGLViewer-2.7.2編譯
(1)VS2017+Qt5平臺編譯
VS ——> Qt VS Tools ——> Open Qt Project File(.pro)——>打開libQGLViewer-2.7.2.pro檔案

(2)編譯QGLViewer
選擇編譯生成Debug或者Release版本的庫,我選擇了在Release模式下編譯(注:Release版本和Debug版本的庫不能混用!!!),
右擊QGLViewer——>僅用于專案(J)——>僅生成QGLViewer(B)


如下圖所示,當輸出目錄下生成動態庫QGLViewer.dll和靜態庫QGLViewer.lib時即為編譯成功,

(3)示例代碼編譯
example檔案夾下都是官方給出示例代碼,感興趣的HXD可以編譯后跑一把看看效果,我這里就編譯運行一下“simpleViewer專案”,
右擊simpleViewer專案——>僅用于專案——>僅生成simpleViewer(B)
如下圖所示,顯示出了一個像老8蜜汁小憨包一樣東西,說明QGLViewer庫配置成功!

(4)qglviewerplugin插件的編譯和安裝
但是上面僅僅是在獨立的控制臺中利用OpenGL視窗顯示了圖形,在實際開發程序中實用性并不高,QGLViewer是支持把顯示視窗嵌入到QT的QWidget中去使用的,為達到上述效果必須編譯安裝qglviewerplugin插件,
1)插件編譯
右擊qglviewerplugin專案——>僅用于專案——>僅生成qglviewerplugin(B)
發生如下錯誤:qglviewerplugin專案本身編譯沒問題但是會鏈接失敗,提示無法決議的外部符號,
qglviewerPlugin.obj : error LNK2019: 無法決議的外部符號 "__declspec(dllimport) public: __cdecl Viewer::Viewer(class QWidget *)" (__imp_??0Viewer@@QEAA@PEAVQWidget@@@Z),該符號在函式 "public: virtual class QWidget * __cdecl QGLViewerPlugin::createWidget(class QWidget *)" (?createWidget@QGLViewerPlugin@@UEAAPEAVQWidget@@PEAV2@@Z) 中被參考
qglviewerPlugin.obj : error LNK2019: 無法決議的外部符號 "__declspec(dllimport) public: virtual __cdecl Viewer::~Viewer(void)" (__imp_??1Viewer@@UEAA@XZ),該符號在函式 "public: virtual void * __cdecl Viewer::`scalar deleting destructor'(unsigned int)" (??_GViewer@@UEAAPEAXI@Z) 中被參考
qglviewerPlugin.obj : error LNK2001: 無法決議的外部符號 "public: virtual void __cdecl Viewer::draw(void)" (?draw@Viewer@@UEAAXXZ)
解決方法:去原始碼里面找到這個Viewer類,把Viewer類的“類前宏定義修飾符QDESIGNER_WIDGET_EXPORT”洗掉掉,再次編譯生成即可!

2)插件安裝
將QGLViewer2.dll檔案復制到:C:\Windows\System32或者C:\Windows\SysWOW64路徑下,
將qglviewerplugin.dll復制到:Qt5安裝目錄\plugins\designer(在我計算機上路徑:C:\OSGeo4W64\apps\Qt5\plugins\designer\)
3)效果
打開QT Designer,左側控制元件欄中會出現QGLViewer控制元件,拖拽到表單中即可使用,

(5)庫檔案提取
其實操作到這里為止,QGLViewer庫和控制元件都已經編譯完畢了!但為了今后方便使用,需要新建一個include和lib檔案夾,然后把所有h檔案統一放到include目錄下,把dll檔案、lib檔案統一放到lib目錄下,
如下圖所示,在include目錄下新建QGLViewer目錄和VRender目錄,分別把各自頭檔案扔進去,



再把QGLViewer.dll、QGLViewer.lib和qglviewerplugin.dll、qglviewerplugin.lib檔案扔到lib目錄下:

二、VS工程專案配置
(1)在VS2017中新建一個帶視窗的QT專案,切換到Release模式,
(2)包含目錄:
Qt5安裝目錄\include\QTOpenGL (我的路徑:C:\OSGeo4W64\apps\Qt5\include\QtOpenGL)
Qt5安裝目錄\include\QtXml (我的路徑:C:\OSGeo4W64\apps\Qt5\include\QtXml)
include檔案夾目錄 (我的路徑:D:\libQGLViewer-2.7.2\include)
(2)庫目錄:
lib檔案夾目錄(我的路徑:D:\libQGLViewer-2.7.2\lib)
OpenGL32.Lib檔案目錄(我的路徑:C:\Program Files (x86)\Windows Kits\10\Lib\10.0.17763.0\um\x64)
(3)連接器——>輸入——>附加依賴項:
QGLViewer2.lib
OpenGL32.Lib
三、代碼實作
(1)新建一個QViewer類繼承自QGLViewer類,重寫相關虛函式,
(2)在Qt Designer中不能直接把QGLViewer控制元件拖拽到界面上去使用,而是借助于QT自帶的QWidget控制元件,利用代碼將OpenGL視窗嵌入到QWidget上來顯示圖形,
QViewer.h
#include "QGLViewer\qglviewer.h"
class QViewer : public QGLViewer
{
Q_OBJECT
public:
QViewer();
~QViewer();
protected:
// 重寫虛函式draw()和init()
virtual void draw();
virtual void init();
private:
// 自定義繪圖函式(繪制一坨老8蜜汁小憨堡)
void drawShit();
};
QViewer.cpp
#include "QViewer.h"
QViewer::QViewer()
{
}
QViewer::~QViewer()
{
}
void QViewer::draw()
{
// 必須在虛函式draw()內部呼叫自定義的繪圖函式才能成功顯示圖形!!!
drawShit();
}
void QViewer::init()
{
}
void QViewer::drawShit()
{
const float nbSteps = 200.0;
glBegin(GL_QUAD_STRIP);
for (int i = 0; i < nbSteps; ++i)
{
const float ratio = i / nbSteps;
const float angle = 21.0 * ratio;
const float c = cos(angle);
const float s = sin(angle);
const float r1 = 1.0 - 0.8f * ratio;
const float r2 = 0.8f - 0.8f * ratio;
const float alt = ratio - 0.5f;
const float nor = 0.5f;
const float up = sqrt(1.0 - nor * nor);
glColor3f(1.0 - ratio, 0.2f, ratio);
glNormal3f(nor * c, up, nor * s);
glVertex3f(r1 * c, alt, r1 * s);
glVertex3f(r2 * c, alt + 0.05f, r2 * s);
}
glEnd();
}
glWidget.cpp
#include "glWidget.h"
#include "QViewer.h"
#include "qgridlayout.h"
glWidget::glWidget(QWidget *parent)
: QWidget(parent)
{
ui.setupUi(this);
// 關鍵代碼:將OpenGL視窗嵌入到UI上去,自動呼叫QViewer類的虛函式draw(),
QViewer* xjm = new QViewer();
QGridLayout *GridGLLayout = new QGridLayout(this);
GridGLLayout->addWidget(xjm);
ui.widget->setLayout(GridGLLayout);
}
最終可以實作下圖中的效果:

轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/254831.html
標籤:其他
上一篇:矩陣轟炸游戲
