zoukankan      html  css  js  c++  java
  • 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 "osgViewerCompositeViewer"
    #include "osgDBReadFile"
    #include "osgQtGraphicsWindowQt"
    
    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 "osgViewerViewerEventHandlers"
    #include "osgGATrackballManipulator"
    
    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);
    }
  • 相关阅读:
    python 函数
    谷歌浏览器安装POSTMAN
    Django提示Unknown database处理方法
    Django 连接Mysql异常处理
    Django输入 中文参数保存异常解决方法
    vscode过滤pyc文件
    Jenkins启动和停止服务
    执行robot framework 的测试用例 命令行pybot使用方式
    Jenkins定时任务
    Jenkins构建Python项目失败
  • 原文地址:https://www.cnblogs.com/coolbear/p/7149555.html
Copyright © 2011-2022 走看看