最近工作十分緊張,閑暇時間比較小,今晚更新下部落格,主要還是一些老舊的知識點,如有錯誤的地方,請多多指教!!!!
其實繪制草圖可以不與opencasacde有關聯,可以直接利用osg實作圖形繪制即可,隻需要将資料儲存并傳入opencasacde中,以實作二維圖形向三維模型的轉變(拉伸,掃掠等等),本文利用OSG實作了一些簡單的二維圖形動态繪制(圓,橢圓,線段,多線段,多邊形,矩形),效果如視訊和截圖所示:
标題
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