天天看點

初探OSG+OpenCascade(簡稱:OCC)在QT上的實踐之繪制草圖探索

最近工作十分緊張,閑暇時間比較小,今晚更新下部落格,主要還是一些老舊的知識點,如有錯誤的地方,請多多指教!!!!

其實繪制草圖可以不與opencasacde有關聯,可以直接利用osg實作圖形繪制即可,隻需要将資料儲存并傳入opencasacde中,以實作二維圖形向三維模型的轉變(拉伸,掃掠等等),本文利用OSG實作了一些簡單的二維圖形動态繪制(圓,橢圓,線段,多線段,多邊形,矩形),效果如視訊和截圖所示:

初探OSG+OpenCascade(簡稱:OCC)在QT上的實踐之繪制草圖探索

标題

初探OSG+OpenCascade(簡稱:OCC)在QT上的實踐之繪制草圖探索

C++代碼舉例如下:

//繪制動态矩形

bool drawRectTool::handle(const osgGA::GUIEventAdapter& ea, osgGA::GUIActionAdapter& aa)

{

    osgViewer::View* view = dynamic_cast<osgViewer::View*>(&aa);

    if (!view)

    {

        return false;

    }

    osg::Vec3d world = window2World(view, ea.getX(), ea.getY());

    if (m_plane == PLANE_XY || m_plane == PLANE_XYR)

    {

        world[2] = 0;

    }

    else if (m_plane == PLANE_XZ || m_plane == PLANE_XZR)

    {

        world[1] = 0;

    }

    else if (m_plane == PLANE_YZ || m_plane == PLANE_YZR)

    {

        world[0] = 0;

    }

    if (ea.getEventType() == osgGA::GUIEventAdapter::PUSH)

    {

        if (ea.getButton() == 1) 

        {

            if (m_drawing == false)

            {

                // 開始作圖

                m_geomDrawing = setupRectangle(view, m_plane);

                osg::ref_ptr<osg::Geode> geode = new osg::Geode;

                geode->addDrawable(m_geomDrawing.get());

                view->getSceneData()->asGroup()->addChild(geode);

                m_startWorldPoint = world;

                m_drawing = true;

            }

        }

        if (ea.getButton() == 4) 

        {

            if (m_drawing == true)

            {

                m_drawing = false;

                // 添加四個點

                osg::Vec3Array* vertexes = dynamic_cast<osg::Vec3Array*>(m_geomDrawing->getVertexArray());

                drawPoint(view, (*vertexes)[0], 1.0);

                drawPoint(view, (*vertexes)[1], 1.0);

                drawPoint(view, (*vertexes)[2], 1.0);

                drawPoint(view, (*vertexes)[3], 1.0);

            }

        }

    }

    if (ea.getEventType() == osgGA::GUIEventAdapter::MOVE)

    {

        if (m_drawing == true) // 正在作圖

        {

            osg::Vec3Array* vertex = new osg::Vec3Array(4);

            if (m_plane == PLANE_XY || m_plane == PLANE_XYR)

            {

                (*vertex)[0] = osg::Vec3(m_startWorldPoint.x(), m_startWorldPoint.y(), 0);

                (*vertex)[1] = osg::Vec3(m_startWorldPoint.x(), world.y(), 0);

                (*vertex)[2] = osg::Vec3(world.x(), world.y(), 0);

                (*vertex)[3] = osg::Vec3(world.x(), m_startWorldPoint.y(), 0);

            }

            else if (m_plane == PLANE_XZ || m_plane == PLANE_XZR)

            {

                (*vertex)[0] = osg::Vec3(m_startWorldPoint.x(), 0, m_startWorldPoint.z());

                (*vertex)[1] = osg::Vec3(m_startWorldPoint.x(), 0, world.z());

                (*vertex)[2] = osg::Vec3(world.x(), 0, world.z());

                (*vertex)[3] = osg::Vec3(world.x(), 0, m_startWorldPoint.z());

            }

            else if (m_plane == PLANE_YZ || m_plane == PLANE_YZR)

            {

                (*vertex)[0] = osg::Vec3(0.0, m_startWorldPoint.y(), m_startWorldPoint.z());

                (*vertex)[1] = osg::Vec3(0.0, m_startWorldPoint.y(), world.z());

                (*vertex)[2] = osg::Vec3(0.0, world.y(), world.z());

                (*vertex)[3] = osg::Vec3(0.0, world.y(), m_startWorldPoint.z());

            }

            m_geomDrawing->setVertexArray(vertex);

            m_geomDrawing->dirtyDisplayList();

        }

    }

    return false;

}

//繪制動态矩形結束 

其他圖形繪制類似,也可以參考這段代碼進行仿寫實作!!1