1、概述
在OSG的开发应用过程中,我们有时候总会纠结于使用MFC还是Qt来嵌入OSG窗口以便于后续的功能开发,毕竟选择一个合适的UI框架,对于后续的开发还是省去很多麻烦的。但对于初学者来说,可能对框架消息机制的不熟悉,尤其是在做一些与场景互动的交互操作时候,耗费了大量时间在与OSG场景交互的实现上。如果有在使用osgearth库的开发者可能会发现源码带的示例中有osgearth_imgui这个项目,其中的ImGui就是本次文章的主角。
下面是模型编辑器的效果,采用VS2019+ImGui-1.8.5+OSG3.6.5实现。
2、ImGui
2.1 简介
ImGui又称为Dear ImGui,它是与平台无关的C++轻量级跨平台图形界面库,没有任何第三方依赖,可以将ImGui的源码直接加到项目中,也可以编译成dll。ImGui使用DX或OpenGL进行界面渲染,对于画面质量要求较高,例如客户端游戏、4k/8k视频播放时,用ImGui是很好的选择。经常用到游戏引擎的内部,用来开发编辑器的界面。开源项目地址:https://github.com/ocornut/imgui。
2.2 官方游戏编辑器效果
3、ImGui集成到OSG
参考了github上大神的imgui-osg项目,然后改进了一下实现了自己的需求。
核心代码是从osgGA::GUIEventHandler继承实现sgImGuiHandler,实现界面的绘制以及鼠标操作等。
#pragma once
#include <osgViewer/ViewerEventHandlers>
namespace osg {
class Camera;
}
class OsgImGuiHandler : public osgGA::GUIEventHandler
{
public:
OsgImGuiHandler();
bool handle(const osgGA::GUIEventAdapter& ea, osgGA::GUIActionAdapter& aa) override;
protected:
// Put your ImGui code inside this function
virtual void drawUi() = 0;
private:
void init();
void setCameraCallbacks(osg::Camera* camera);
void newFrame(osg::RenderInfo& renderInfo);
void render(osg::RenderInfo& renderInfo);
private:
struct ImGuiNewFrameCallback;
struct ImGuiRenderCallback;
double time_;
bool mousePressed_[3];
float mouseWheel_;
bool initialized_;
};
4、源码下载
下载地址