查看: 3312|回复: 5

osgUtil::SmoothingVisitor::smooth计算几何体的法向量出错

[复制链接]

该用户从未签到

发表于 2014-3-31 16:37:21 | 显示全部楼层 |阅读模式
本帖最后由 zhaohsww 于 2014-3-31 16:39 编辑

计算几何体的法向量:osgUtil::SmoothingVisitor::smooth(*(geom.get()));
没成功,不知哪里出错了?
代码中倒数4-6行为调试时array的num错误。
  1. osg::ref_ptr<osg::Node> creatPoints(string fPath)
  2. {
  3.         //首先定义点
  4.         osg::ref_ptr<osg::Vec3Array> v = new osg::Vec3Array;
  5.         //定义法线数组
  6.         //osg::ref_ptr<osg::Vec3Array> n = new osg::Vec3Array;
  7.         //定义颜色数组
  8.         //osg::ref_ptr<osg::Vec4Array> c = new osg::Vec4Array;
  9.         int count = 0;
  10.         FILE* pfData = fopen(fPath.c_str(), "r");
  11.         if (pfData == NULL)
  12.         {
  13.                 cout<<"DataFile does not exist!!!"<<endl;
  14.                 return NULL;
  15.         }
  16.         else
  17.         {
  18.                 while (!feof(pfData))
  19.                 {
  20.                         float fx, fy, fz;
  21.                         char temp;
  22.                         fscanf(pfData, "%f", &fx);
  23.                         fscanf(pfData, "%c", &temp);
  24.                         fscanf(pfData, "%f", &fy);
  25.                         fscanf(pfData, "%c", &temp);
  26.                         fscanf(pfData, "%f", &fz);
  27.                         v->push_back(osg::Vec3(fx, fy, fz));
  28.                         //n->push_back(osg::Vec3(0, 0, 1));
  29.                         //c->push_back(osg::Vec4(0.804,0.498,0.196,0.5));//金色
  30.                         //c->push_back(osg::Vec4(0.902,0.910,0.980,0.5));//银色
  31.                         //c->push_back(osg::Vec4(0.6,0.196,0.804,0.5));//紫色
  32.                         //c->push_back(osg::Vec4(0.851,0.851,0.098,0.5));//金黄色
  33.                         c->push_back(osg::Vec4(1.0,1.0,1.0,1.0));
  34.                         count++;
  35.                 }
  36.                 fclose(pfData);
  37.         }

  38.         osg::ref_ptr<osg::Geometry> geom = new osg::Geometry();
  39.         geom->setDataVariance( osg::Object::DYNAMIC );
  40.         geom->setUseDisplayList( false );
  41.         geom->setUseVertexBufferObjects( true );
  42.         geom->setVertexArray(v.get());
  43.         /*geom->setColorArray(c.get());
  44.         geom->setColorBinding(osg::Geometry::BIND_PER_VERTEX);*/
  45.         //geom->setNormalArray(n.get());
  46.         //geom->setNormalBinding(osg::Geometry::BIND_PER_VERTEX

  47.         //设置关联方式
  48.         geom->addPrimitiveSet(new osg::DrawArrays(osg::PrimitiveSet::POINTS, 0, count));

  49.         osgUtil::SmoothingVisitor::smooth(*(geom.get()));       
  50.         //geom->normal
  51.         osg::Array *array = geom->getNormalArray;
  52.         unsigned AAA = array->getNumElements();

  53.         //几何组结点
  54.         osg::ref_ptr<osg::Geode> geode = new osg::Geode;
  55.         geode->addDrawable(geom.get());
  56.         return geode.get();
  57. }
复制代码

该用户从未签到

发表于 2014-4-2 21:24:26 | 显示全部楼层
您给出的信息不足以帮助判断什么

该用户从未签到

 楼主| 发表于 2014-4-3 21:57:40 | 显示全部楼层
array 发表于 2014-4-2 21:24
您给出的信息不足以帮助判断什么

array老师,请问一般计算点云数据的法向量怎么计算?我是为了方便打光照

该用户从未签到

发表于 2014-4-20 19:48:54 | 显示全部楼层
点云数据的法线?我认为这应该是原始数据中就存在的

该用户从未签到

 楼主| 发表于 2014-5-5 16:16:02 | 显示全部楼层
array 发表于 2014-4-20 19:48
点云数据的法线?我认为这应该是原始数据中就存在的

数据来源是测量所得,不存在法线数据。现在是想把测量所得的点云数据进行显示,需加上光照便于显示。
对于一个Geometry使用osgUtil::SmoothingVisitor::smooth(*(geom.get()))来计算法向量应该是对的吧?但是结果确没有,所以不解,不知能不能解决或者有其他的计算法线的方法。   

该用户从未签到

发表于 2014-5-16 17:05:01 | 显示全部楼层
只是一个点的话,显然不可能计算得到它的唯一法线,因为我们可以认为全方向都是它的法线。因此除非给出其它的辅助条件,例如拓扑关系等,否则谁也无法计算
您需要登录后才可以回帖 登录 | 注册

本版积分规则

OSG中国官方论坛-有您OSG在中国才更好

网站简介:osgChina是国内首个三维相关技术开源社区,旨在为国内更多的技术开发人员提供最前沿的技术资讯,为更多的三维从业者提供一个学习、交流的技术平台。

联系我们

  • 工作时间:09:00--18:00
  • 反馈邮箱:1315785073@qq.com
快速回复 返回顶部 返回列表