VS-Qt-OSG-CMake基本项目框架
在VS-Qt-CMake基础上,打开mainwindow.ui,添加一个QWidget,然后在widget上右键-提升,选择SceneViewWidget
CMakeLists.txt中添加了OSG相关配置
cmake_minimum_required(VERSION 3.0) SET(PRODUCT_NAME ReadS3C) SET(PRODUCT_HEADER_FILES mainwindow.h SceneViewWidget.h ) SET(PRODUCT_UI_FILES mainwindow.ui ) SET(PRODUCT_FILES main.cpp mainwindow.cpp SceneViewWidget.cpp ${PRODUCT_HEADER_FILES} ) SET(PRODUCT_DATA_FILES data/axes.osgt data/arial.ttf ) FIND_PATH(OSG_INCLUDE_DIR osg/Referenced PATHS $ENV{OSG_ROOT}/include $ENV{OSG_DIR}/include /usr/include /usr/local/include ) FIND_PATH(OSG_LIB_DIR libosg.so osg.lib PATHS $ENV{OSG_ROOT}/lib $ENV{OSG_DIR}/lib /usr/lib /usr/local/lib ) SET(OSG_DEBUG_POSTFIX "d" CACHE STRING "add a postfix, usually d on windows") SET(OSG_RELEASE_POSTFIX "" CACHE STRING "add a postfix, usually empty on windows") SET(QT_FOUND FALSE) IF(${CMAKE_VERSION} VERSION_LESS "3.2.0") FIND_PACKAGE(Qt5Widgets) IF(Qt5Widgets_FOUND) ADD_DEFINITIONS(-DUSE_QT_VERSION=5) SET(QT_FOUND TRUE) ELSE(Qt5Widgets_FOUND) MESSAGE("*** Qt5 not found, which may be caused by missing/wrong CMake module files. " "You should set Qt5Widgets_DIR to $(QT_DIR)/lib/cmake/Qt5Widgets/ to find variables.") ENDIF(Qt5Widgets_FOUND) ELSE() FIND_PACKAGE(Qt5 COMPONENTS Widgets) IF(Qt5_FOUND) ADD_DEFINITIONS(-DUSE_QT_VERSION=5) SET(QT_FOUND TRUE) ENDIF(Qt5_FOUND) ENDIF() QT5_WRAP_UI(UI_FILES ${PRODUCT_UI_FILES}) QT5_WRAP_CPP(MOC_FILES ${PRODUCT_HEADER_FILES}) SET(PRODUCT_FILES ${PRODUCT_FILES} ${UI_FILES} ${MOC_FILES}) IF(WIN32) #SET(PRODUCT_FILES ${PRODUCT_FILES} my.rc) ENDIF(WIN32) IF(QT_FOUND) #QT5_ADD_RESOURCES(RES_FILES skin/qdarkstyle/style.qrc) ENDIF() SET(PRODUCT_FILES ${PRODUCT_FILES} ${RES_FILES}) SOURCE_GROUP("auto generated files" FILES ${UI_FILES} ${MOC_FILES} ${RES_FILES}) SOURCE_GROUP("ui files" FILES ${PRODUCT_UI_FILES}) SET(EXTERNAL_LIBRARIES ${EXTERNAL_LIBRARIES} debug osgQt${OSG_DEBUG_POSTFIX} optimized osgQt${OSG_RELEASE_POSTFIX} ) INCLUDE_DIRECTORIES(${OSG_INCLUDE_DIR} ${CMAKE_CURRENT_SOURCE_DIR} ${CMAKE_CURRENT_BINARY_DIR}) LINK_DIRECTORIES(${OSG_LIB_DIR}) SET(WITH_CONSOLE 1) IF(${WITH_CONSOLE}) ADD_EXECUTABLE(${PRODUCT_NAME} ${PRODUCT_FILES}) ELSE(${WITH_CONSOLE}) ADD_EXECUTABLE(${PRODUCT_NAME} WIN32 ${PRODUCT_FILES}) ENDIF(${WITH_CONSOLE}) SET_TARGET_PROPERTIES(${PRODUCT_NAME} PROPERTIES DEBUG_POSTFIX "${CMAKE_DEBUG_POSTFIX}") TARGET_LINK_LIBRARIES(${PRODUCT_NAME} debug osg${OSG_DEBUG_POSTFIX} optimized osg${OSG_RELEASE_POSTFIX} debug osgAnimation${OSG_DEBUG_POSTFIX} optimized osgAnimation${OSG_RELEASE_POSTFIX} debug osgParticle${OSG_DEBUG_POSTFIX} optimized osgParticle${OSG_RELEASE_POSTFIX} debug osgDB${OSG_DEBUG_POSTFIX} optimized osgDB${OSG_RELEASE_POSTFIX} debug osgGA${OSG_DEBUG_POSTFIX} optimized osgGA${OSG_RELEASE_POSTFIX} debug osgText${OSG_DEBUG_POSTFIX} optimized osgText${OSG_RELEASE_POSTFIX} debug osgTerrain${OSG_DEBUG_POSTFIX} optimized osgTerrain${OSG_RELEASE_POSTFIX} debug osgUtil${OSG_DEBUG_POSTFIX} optimized osgUtil${OSG_RELEASE_POSTFIX} debug osgViewer${OSG_DEBUG_POSTFIX} optimized osgViewer${OSG_RELEASE_POSTFIX} debug OpenThreads${OSG_DEBUG_POSTFIX} optimized OpenThreads${OSG_RELEASE_POSTFIX} ${OPENGL_LIBRARIES} ${THIRD_PARTY_LIBRARIES} ${EXTERNAL_LIBRARIES} ) SET_TARGET_PROPERTIES(${PRODUCT_NAME} PROPERTIES ARCHIVE_OUTPUT_DIRECTORY_DEBUG "${PROJECT_BINARY_DIR}/lib" ARCHIVE_OUTPUT_DIRECTORY_RELEASE "${PROJECT_BINARY_DIR}/lib" LIBRARY_OUTPUT_DIRECTORY_DEBUG "${PROJECT_BINARY_DIR}/lib" LIBRARY_OUTPUT_DIRECTORY_RELEASE "${PROJECT_BINARY_DIR}/lib" RUNTIME_OUTPUT_DIRECTORY_DEBUG "${PROJECT_BINARY_DIR}/bin" RUNTIME_OUTPUT_DIRECTORY_RELEASE "${PROJECT_BINARY_DIR}/bin") INSTALL(TARGETS ${PRODUCT_NAME} RUNTIME DESTINATION ${CMAKE_INSTALL_PREFIX}/bin) INSTALL(FILES ${PRODUCT_DATA_FILES} DESTINATION ${CMAKE_INSTALL_PREFIX}/bin/data) IF(QT_FOUND) QT5_USE_MODULES(${PRODUCT_NAME} Widgets Network OpenGL) ENDIF(QT_FOUND)
SceneViewWidget.h
#pragma once #include <QWidget> #include <QGridLayout> #include <QTimer> #include "osgViewer\CompositeViewer" #include "osgDB\ReadFile" #include "osgQt\GraphicsWindowQt" class SceneViewWidget : public QWidget, public osgViewer::CompositeViewer { public: SceneViewWidget(QWidget* parent = 0, Qt::WindowFlags f = 0, osgViewer::ViewerBase::ThreadingModel threadingModel = osgViewer::CompositeViewer::SingleThreaded); QWidget* addViewWidget(osgQt::GraphicsWindowQt* gw, osg::Node* scene); osgQt::GraphicsWindowQt* createGraphicsWindow(int x, int y, int w, int h, const std::string& name = "", bool windowDecoration = false); virtual void paintEvent(QPaintEvent* event); protected: virtual void initScene(); protected: osg::ref_ptr<osg::Group> sceneRoot; QTimer _timer; };
SceneViewWidget.cpp
#include "SceneViewWidget.h" #include "osgViewer\ViewerEventHandlers" #include "osgGA\TrackballManipulator" SceneViewWidget::SceneViewWidget(QWidget* parent /*= 0*/, Qt::WindowFlags f /*= 0*/, osgViewer::ViewerBase::ThreadingModel threadingModel /*= osgViewer::CompositeViewer::SingleThreaded*/) : QWidget(parent, f) { setThreadingModel(threadingModel); // disable the default setting of viewer.done() by pressing Escape. setKeyEventSetsDone(0); initScene(); QWidget* widget1 = addViewWidget(createGraphicsWindow(0, 0, 100, 100), sceneRoot); QGridLayout* grid = new QGridLayout; grid->addWidget(widget1, 0, 0); setLayout(grid); connect(&_timer, SIGNAL(timeout()), this, SLOT(update())); _timer.start(10); } QWidget* SceneViewWidget::addViewWidget(osgQt::GraphicsWindowQt* gw, osg::Node* scene) { osgViewer::View* view = new osgViewer::View; addView(view); osg::Camera* camera = view->getCamera(); camera->setGraphicsContext(gw); const osg::GraphicsContext::Traits* traits = gw->getTraits(); //camera->setClearColor(osg::Vec4(0.2, 0.2, 0.2, 1.0)); camera->setViewport(new osg::Viewport(0, 0, traits->width, traits->height)); camera->setProjectionMatrixAsPerspective(30.0f, static_cast<double>(traits->width) / static_cast<double>(traits->height), 1.0f, 10000.0f); view->setSceneData(scene); view->addEventHandler(new osgViewer::StatsHandler); view->setCameraManipulator(new osgGA::TrackballManipulator); gw->setTouchEventsEnabled(true); return gw->getGLWidget(); } osgQt::GraphicsWindowQt* SceneViewWidget::createGraphicsWindow(int x, int y, int w, int h, const std::string& name /*= ""*/, bool windowDecoration /*= false*/) { osg::DisplaySettings* ds = osg::DisplaySettings::instance().get(); osg::ref_ptr<osg::GraphicsContext::Traits> traits = new osg::GraphicsContext::Traits; traits->windowName = name; traits->windowDecoration = windowDecoration; traits->x = x; traits->y = y; traits->width = w; traits->height = h; traits->doubleBuffer = true; traits->alpha = ds->getMinimumNumAlphaBits(); traits->stencil = ds->getMinimumNumStencilBits(); traits->sampleBuffers = ds->getMultiSamples(); traits->samples = ds->getNumMultiSamples();//抗锯齿 return new osgQt::GraphicsWindowQt(traits.get()); } void SceneViewWidget::paintEvent(QPaintEvent* event) { frame(); } void SceneViewWidget::initScene() { sceneRoot = new osg::Group(); osg::Node* axesModel = osgDB::readNodeFile("data/axes.osgt.(0.5,0.5,0.5).scale"); if(axesModel) sceneRoot->addChild(axesModel); osg::ref_ptr<osgText::Font> font = osgText::readRefFontFile("data/arial.ttf"); osgText::Text* text = new osgText::Text(); text->setPosition(osg::Vec3(0.0, 0.0, 0.5)); text->setFont(font); text->setAutoRotateToScreen(true); text->setColor(osg::Vec4(1.0, 1.0, 0.0, 1.0)); text->setCharacterSize(0.1); text->getOrCreateStateSet()->setRenderBinDetails(10, "RenderBin"); text->getOrCreateStateSet()->setMode(GL_DEPTH_TEST, osg::StateAttribute::OFF); text->getOrCreateStateSet()->setMode(GL_LIGHTING, osg::StateAttribute::OFF); text->getOrCreateStateSet()->setDataVariance(osg::Object::DYNAMIC); text->setText("OSG"); sceneRoot->addChild(text); }