天天看点

初探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