最近工作十分紧张,闲暇时间比较小,今晚更新下博客,主要还是一些老旧的知识点,如有错误的地方,请多多指教!!!!
其实绘制草图可以不与opencasacde有关联,可以直接利用osg实现图形绘制即可,只需要将数据保存并传入opencasacde中,以实现二维图形向三维模型的转变(拉伸,扫掠等等),本文利用OSG实现了一些简单的二维图形动态绘制(圆,椭圆,线段,多线段,多边形,矩形),效果如视频和截图所示:
![](https://img.laitimes.com/img/9ZDMuAjOiMmIsIjOiQnIsIiZpdmL2kDO3MzNzMjMyAjNwEjMwIzLc52YucWbp5GZzNmLn9Gbi1yZtl2Lc9CX6MHc0RHaiojIsJye.gif)
标题
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