转换带深度的点云数据 成 osg中的一个叶子节点

由于代码不能冗余,又怕找不到,备份到这里

在这里插#include <osg/LineWidth>
#include <osg/Point>

osg::Geode *PCL_MainWindow::TransformOsgData_1(PointCloud_rgb cloud1)
{
    size_t cloudnum = cloud1->size();
    osg::ref_ptr<osg::Geometry> geometry = new osg::Geometry();
    osg::ref_ptr<osg::Vec3Array> coord = new osg::Vec3Array(); /**创建顶点容器**/
    osg::ref_ptr<osg::Vec4Array> colors = new osg::Vec4Array();/**创建颜色容器**/

    //----------------将距离值存入容器中,判定容器中的最小值 和 最大值,作为rgb 的基础色值-------
    for (size_t v = 0; v < cloudnum; v++)
    {
        if (max < cloud1->points[v].intensity)
            max = cloud1->points[v].intensity;
        if (min > cloud1->points[v].intensity)
            min = cloud1->points[v].intensity;
    }
    median = (max-min)/2; //中间值,绿色

    //--------------------------------------------------------------------------------

    /**将点云数据存至 osg 容器中**/
    for (size_t i = 0; i < cloudnum; i++)
    {
        coord->push_back(osg::Vec3(cloud1->points[i].x, cloud1->points[i].y, cloud1->points[i].z));
        colors->push_back(computeColor(int(cloud1->points[i].intensity))); //写个内联判定范围着色
    }
    geometry->setVertexArray(coord.get()); /**设置坐标顶点**/
    geometry->setColorArray(colors.get()); /**设置绑定颜色**/
    geometry->setColorBinding(osg::Geometry::BIND_PER_VERTEX); /**绑定顶点颜色**/
    geometry->addPrimitiveSet(new osg::DrawArrays(osg::PrimitiveSet::POINTS, 0, int(cloudnum)));/**设置顶点的关联方式**/

    osg::ref_ptr<osg::Point> point = new osg::Point;
    point->setSize(2);

    //    添加颜色关键点,必须设置 geode 这个叶子节点属性
    osg::ref_ptr<osg::Geode> geode = new osg::Geode;
    geode->getOrCreateStateSet()->setMode(GL_LIGHTING, osg::StateAttribute::OFF);
    geode->getOrCreateStateSet()->setAttribute(point,  osg::StateAttribute::ON);

    geode->addDrawable(geometry);
    //    PCL_THROW_EXCEPTION()  抛出异常的宏
    return geode.release();
}

/*!
     * \brief computeColor 用点云库随机生成颜色
     * \param intensity  如果需要指定颜色,调用 OSG_PCLVisualizer类中的 pclDataTransformOsgData
     * \return
     */
    inline osg::Vec4 computeColor(const int intensity)
    {
        osg::Vec4 color;
        double r, g, b;
        pcl::visualization::getRandomColors (r, g, b);
        color = osg::Vec4(float(r), float(g), float(b), 1);
        return color;
    }
    /*!
     * \brief computeColor_2 根据距离分配颜色
     * \param intensity  距离值
     * \return
     */
    inline osg::Vec4 computeColor_2(const float intensity)
    {
        osg::Vec4 color;
        float r=1.0f;
        float g=1.0f;
        float b=1.0f;

        float ddd = max/4;
        float dd = max/2;
        float d = dd+ddd;

        if(int(intensity) == 0)
        {
              color = osg::Vec4(r, 0.0f, 0.0f, 1.0f);
        }
        if(intensity > 0 && intensity < ddd )
        {
              g = intensity/ddd;
              color = osg::Vec4(1, g, 0.0f, 1.0f);
        }
        if(intensity > ddd && intensity < dd )
        {
            g = intensity/dd;
           color = osg::Vec4(0.0f, g, 1.0f, 1.0f);
        }
        if(intensity > dd && intensity < d )
        {
            b = intensity/d;
           color = osg::Vec4(0.0f, 1.0f, b, 1.0f);
        }
        else if(intensity > d && intensity < max)
        {
            b = intensity/max;
            color = osg::Vec4(0.0f, 0.0f, b, 1.0f);
        };
       return color;
    }
入代码片
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在OpenSceneGraph (OSG),要修改或删除节点的部分顶点数据并进行可视化更新,可以按照以下步骤进行操作: 1. 获取节点:首先,需要获取包含要修改的顶点数据节点。可以使用场景图遍历或根据节点名称等方式获取到要操作的节点。 2. 获取顶点数据:使用节点的getOrCreateStateSet()方法获取节点的状态集。然后,通过getStateAttribute()方法和类型标识(如osg::Geometry)获取到几何体属性节点osg::Geometry)。再通过osg::Geometry的getVertexArray()方法获取到顶点数据数组osg::Vec3Array。 3. 修改顶点数据:根据需要,可以直接通过osg::Vec3Array的方法修改顶点数据。例如,可以使用set()方法修改指定索引处的顶点坐标,或使用push_back()方法添加新的顶点。 4. 更新可视化:修改完顶点数据后,需要更新场景图以进行可视化更新。可以调用osg::NodeVisitor类的traverse()方法遍历整个场景图,并调用osg::Geometry的dirtyDisplayList()和dirtyBound()方法标记几何体属性需要更新。之后,调用osgViewer::Viewer类的frame()方法更新视图。 下面是一个简单的示例代码片段,展示了如何修改节点的顶点数据并进行可视化更新: ```cpp // 获取节点 osg::ref_ptr<osg::Node> node = ...; // 获取顶点数据 osg::Geometry* geometry = dynamic_cast<osg::Geometry*>(node->getOrCreateStateSet()->getAttribute(osg::StateAttribute::Type::GEOMETRY)); osg::Vec3Array* vertices = dynamic_cast<osg::Vec3Array*>(geometry->getVertexArray()); // 修改顶点数据 (*vertices)[0] = osg::Vec3(1.0, 2.0, 3.0); // 修改第一个顶点坐标 // 更新可视化 geometry->dirtyDisplayList(); geometry->dirtyBound(); osg::ref_ptr<osgViewer::Viewer> viewer = new osgViewer::Viewer; viewer->setSceneData(node); viewer->frame(); ``` 请注意,这只是一个简单的示例,实际操作可能会涉及更多的步骤和细节,具体根据你的场景和需求进行相应的修改和扩展。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值