<div dir="ltr">If you're just updating an existing array, you don't need to call setVertexArray (etc); but you need to mark it dirty by calling<div><br></div><div>  m_vertices->dirty();</div><div><br></div><div>That applies also to your other buffer objects (color array, elements, etc.)</div><div><br></div></div><div class="gmail_extra"><br clear="all"><div><div class="gmail_signature"><div dir="ltr"><div>Glenn Waldron</div></div></div></div>
<br><div class="gmail_quote">On Thu, Apr 28, 2016 at 3:51 PM, Daniel Neos <span dir="ltr"><<a href="mailto:daniel.rd@hotmail.de" target="_blank">daniel.rd@hotmail.de</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Greetings everyone,<br>
<br>
I am trying to display a point cloud, consisting of vertices and color with OpenSceneGraph. A static point cloud to display is rather easy with this guide.<br>
But I am not capable of updating such a point cloud. My intention is to create a geometry and attach it to my viewer class once.<br>
This is the mentioned method which is called once in the beginning.<br>
<br>
The OSGWidget strongly depends on this OpenGLWidget based approach.<br>
<br>
<br>
Code:<br>
<br>
void OSGWidget::attachGeometry(osg::ref_ptr<osg::Geometry> geom)<br>
{<br>
osg::Geode* geode = new osg::Geode;<br>
<br>
geom->setDataVariance(osg::Object::DYNAMIC);<br>
geom->setUseDisplayList(false);<br>
geom->setUseVertexBufferObjects(true);<br>
bool addDrawSuccess = geode->addDrawable(geom.get()); // Adding Drawable Shape to the geometry node<br>
<br>
<br>
if (!addDrawSuccess)<br>
{<br>
throw "Adding Drawable failed!";<br>
}<br>
<br>
osg::StateSet* stateSet = geode->getOrCreateStateSet();<br>
stateSet->setMode(GL_LIGHTING, osg::StateAttribute::OFF);<br>
<br>
<br>
float aspectRatio = static_cast<float>(this->width()) / static_cast<float>(this->height());<br>
<br>
// Setting up the camera<br>
osg::Camera* camera = new osg::Camera;<br>
camera->setViewport(0, 0, this->width(), this->height());<br>
camera->setClearColor(osg::Vec4(0.f, 0.f, 0.f, 1.f)); // Kind of Backgroundcolor, clears the buffer and sets the default color (RGBA)<br>
camera->setProjectionMatrixAsPerspective(30.f, aspectRatio, 1.f, 1000.f); // Create perspective projection<br>
camera->setGraphicsContext(graphicsWindow_); // embed<br>
<br>
osgViewer::View* view = new osgViewer::View;<br>
view->setCamera(camera); // Set the defined camera<br>
view->setSceneData(geode); // Set the geometry<br>
view->addEventHandler(new osgViewer::StatsHandler);<br>
<br>
<br>
osgGA::TrackballManipulator* manipulator = new osgGA::TrackballManipulator;<br>
manipulator->setAllowThrow(false);<br>
<br>
view->setCameraManipulator(manipulator);<br>
<br>
///////////////////////////////////////////////////<br>
// Set the viewer<br>
//////////////////////////////////////////////////<br>
viewer_->addView(view);<br>
viewer_->setThreadingModel(osgViewer::CompositeViewer::SingleThreaded);<br>
viewer_->realize();<br>
<br>
this->setFocusPolicy(Qt::StrongFocus);<br>
this->setMinimumSize(100, 100);<br>
<br>
this->setMouseTracking(true);<br>
}<br>
<br>
<br>
<br>
<br>
<br>
This method gets set once and shall set up the camera, interactor settings and the overall scene which only consists of one geode containing the geometry which shall be updated continiously.<br>
And after I have 'attached' the geometry, I am trying to update the geometry like this<br>
<br>
<br>
Code:<br>
<br>
void PointCloudViewOSG::processData(DepthDataSet depthData)<br>
{<br>
if (depthData.points()->empty())<br>
{<br>
return; // empty cloud, cannot do anything<br>
}<br>
<br>
const DepthDataSet::IndexPtr::element_type& index = *depthData.index();<br>
const size_t nPixel = depthData.points().get()->points.size();<br>
<br>
if (depthData.intensity().isValid() && !index.empty() )<br>
{<br>
    for (int i = 0; i < nPixel; i++)<br>
    {<br>
        float x = depthData.points().get()->points[i].x;<br>
        float y = depthData.points().get()->points[i].y;<br>
        float z = depthData.points().get()->points[i].z;<br>
        m_vertices->push_back(osg::Vec3(x<br>
            , y<br>
            , z));<br>
<br>
        // 32 bit integer variable containing the rgb (8 bit per channel) value<br>
        uint32_t rgb_val_;<br>
        memcpy(&rgb_val_, &(depthData.points().get()->points[i].rgb), sizeof(uint32_t));<br>
<br>
        uint32_t red, green, blue;<br>
        blue = rgb_val_ & 0x000000ff;<br>
<br>
        rgb_val_ = rgb_val_ >> 8;<br>
        green = rgb_val_ & 0x000000ff;<br>
<br>
        rgb_val_ = rgb_val_ >> 8;<br>
        red = rgb_val_ & 0x000000ff;<br>
<br>
        m_colors->push_back(<br>
            osg::Vec4f((float)red / 255.0f,<br>
            (float)green / 255.0f,<br>
                (float)blue / 255.0f,<br>
                1.0f)<br>
        );<br>
    }<br>
<br>
    m_geometry->setVertexArray(m_vertices.get());<br>
<br>
    m_geometry->setColorArray(m_colors.get());<br>
<br>
    m_geometry->setColorBinding(osg::Geometry::BIND_PER_VERTEX);<br>
<br>
    m_geometry->addPrimitiveSet(new osg::DrawArrays(osg::PrimitiveSet::POINTS, 0, m_vertices->size()));<br>
    }<br>
}<br>
<br>
<br>
<br>
<br>
(Apperantly the code tag can somehow not handle the whitespaces but i will let it be since it is more readable than if everything is aligned)<br>
<br>
So my guess is that the  addPrimitiveSet(...)  shall not be called everytime I update the geometry, since it will push_back<br>
the primitive set everytime the geometry gets updated?<br>
<br>
Do I have to reattach my geometry after every update? Or do I have to rewrite my update method?<br>
So it boils down to the question  What steps are necessary to update my underlying geometry with new vertices and colors<br>
<br>
I have read the basic tutorials and looked for similar questions in this forum<br>
and the only thing that I could adapt is the use of VBO for performance gain<br>
<br>
PointCloudlibrary (PCL) is unfortunately not an alternative since of some incompatibilities with my application.<br>
<br>
<br>
<br>
<br>
Thank you!<br>
<br>
Cheers,<br>
Daniel<br>
<br>
------------------<br>
Read this topic online here:<br>
<a href="http://forum.openscenegraph.org/viewtopic.php?p=67011#67011" rel="noreferrer" target="_blank">http://forum.openscenegraph.org/viewtopic.php?p=67011#67011</a><br>
<br>
<br>
<br>
<br>
<br>
_______________________________________________<br>
osg-users mailing list<br>
<a href="mailto:osg-users@lists.openscenegraph.org">osg-users@lists.openscenegraph.org</a><br>
<a href="http://lists.openscenegraph.org/listinfo.cgi/osg-users-openscenegraph.org" rel="noreferrer" target="_blank">http://lists.openscenegraph.org/listinfo.cgi/osg-users-openscenegraph.org</a><br>
</blockquote></div><br></div>