查看: 1360|回复: 3

StateSetManipulator 不起作用

[复制链接]

该用户从未签到

发表于 2012-3-19 11:40:13 | 显示全部楼层 |阅读模式
本帖最后由 xuganggm 于 2012-3-19 16:12 编辑

大家好,我有个很奇怪的问题,就是运行下面一段代码之后导致 StateSetManipulator 不起作用了。
就是不能按 t 键来 启用/关闭纹理(还有光照,线框、点显示模式切换等)。
我试了 geom->addPrimitiveSet 只能添加 前两个中的一个 POLYGON, 其他的 PrimitiveSet 都不能添加,
Tessellator 那一段也注释掉,StateSetManipulator 才能起作用。
非常奇怪,不知道为什么,有人知道这个问题原因吗?
我用的 OSG 2.9.15。无论 windows linux,32位, 还有 linux 64位 的 release ,都有这个问题。
但是在 windows 32 debug 模式下是好的,没有这个问题。后来 windows  64位 也好了。
  1. osg::ref_ptr<osg::Vec3Array> new3DPolygonVertexArray = new osg::Vec3Array;
  2. ...  get new3DPolygonVertexArray ...
  3. osg::Geode *new3dGeode = create3dShapeFrom2dPolygon(new3DPolygonVertexArray, m_ZThreshold3d, m_baseShapeColor, m_shapeFileDepthTest);

  4. destSwitch->addChild(new3dGeode);


  5. osg::Geode *create3dShapeFrom2dPolygon (osg::Vec3Array *new3DPolygonVertexArray, float zThreshold3d, osg::Vec4 colour, bool depthTest)
  6. {
  7.         osg::Geode* boxGeode = new osg::Geode();

  8.         osg::ref_ptr<osg::Geometry> geom = new osg::Geometry();
  9.         geom->setUseVertexBufferObjects( true );

  10.         float min = 0.0;
  11.         float max = 0.0;

  12.         // Some times begin = end.
  13.         if (*(new3DPolygonVertexArray->begin()) != *(new3DPolygonVertexArray->end() -1))
  14.         {
  15.                 new3DPolygonVertexArray->push_back(*(new3DPolygonVertexArray->begin()));
  16.         }


  17.         osg::ref_ptr<osg::Vec3Array> tmpArray = new osg::Vec3Array;
  18.         geom->setVertexArray(tmpArray.get());

  19.         //  Ignore the last point.
  20.         for (osg::Vec3Array::iterator iter = new3DPolygonVertexArray->begin(); iter < new3DPolygonVertexArray->end() -1; iter++)
  21.         {
  22.                 tmpArray->push_back(osg::Vec3(iter->x(), iter->y(), min));        // Top
  23.         }
  24.         for (osg::Vec3Array::iterator iter = new3DPolygonVertexArray->begin(); iter < new3DPolygonVertexArray->end() -1; iter++)
  25.         {
  26.                 tmpArray->push_back(osg::Vec3(iter->x(), iter->y(), max));        // Bottom
  27.         }


  28.         unsigned int numTopPoints = (tmpArray->size())/2;
  29.         geom->addPrimitiveSet(new osg::DrawArrays(osg::PrimitiveSet::POLYGON, 0, numTopPoints));                                // Top
  30.         //geom->addPrimitiveSet(new osg::DrawArrays(osg::PrimitiveSet::POLYGON, numTopPoints, numTopPoints));                // Bottom

  31.         {
  32.                 osg::ref_ptr<osgUtil::Tessellator> tscx=new osgUtil::Tessellator;
  33.                 tscx->setTessellationType(osgUtil::Tessellator::TESS_TYPE_POLYGONS);
  34.                 tscx->setBoundaryOnly(false);
  35.                 tscx->setWindingType( osgUtil::Tessellator::TESS_WINDING_ODD);
  36.                 tscx->retessellatePolygons(*(geom.get()));
  37.         }

  38.         numTopPoints = (tmpArray->size())/2;
  39.         unsigned int numQUAD_STRIP = new3DPolygonVertexArray->size() -1;//(numPointsAfterTessellate - numPoints*2)/2;
  40.         for (osg::Vec3Array::iterator iter = new3DPolygonVertexArray->begin(); iter < new3DPolygonVertexArray->end(); iter++)
  41.         {
  42.                 tmpArray->push_back(osg::Vec3(iter->x(), iter->y(), min));        // Sides
  43.                 tmpArray->push_back(osg::Vec3(iter->x(), iter->y(), max));
  44.         }

  45.         for (unsigned int i = 0; i< numQUAD_STRIP; i++)
  46.         {
  47.                 geom->addPrimitiveSet(new osg::DrawArrays(osg::PrimitiveSet::QUAD_STRIP, numTopPoints *2 + 2*i, 4));// Sides
  48.         }

  49.         geom->addPrimitiveSet(new osg::DrawArrays(osg::PrimitiveSet::LINE_LOOP, 0, numTopPoints));
  50.         geom->addPrimitiveSet(new osg::DrawArrays(osg::PrimitiveSet::LINE_LOOP, numTopPoints, numTopPoints));
  51.         geom->addPrimitiveSet(new osg::DrawArrays(osg::PrimitiveSet::LINES, numTopPoints*2, numQUAD_STRIP*2));

  52.         boxGeode->addDrawable(geom.get());
  53.         return boxGeode;
  54. }
复制代码

该用户从未签到

发表于 2012-3-19 15:00:05 | 显示全部楼层
看不出有啥问题

该用户从未签到

 楼主| 发表于 2012-3-29 17:35:59 | 显示全部楼层
附件中这个模型是程序中 create3dShapeFrom2dPolygon  函数所生产的节点。

一般按 w 键,可以在 点 线 填充三种模式之间转换。
在某台机器上,我用 osgviewer 浏览附件中这个模型的时候,为什么不能出现点的方式呢?
还有在某些机器上面根本不能转换模式。

我觉得这个模型可能有问题,请问哪位知道哪里不对吗?

shape3d.zip

1.66 KB, 下载次数: 69, 下载积分: 威望 1

该用户从未签到

 楼主| 发表于 2012-4-9 14:57:44 | 显示全部楼层
这个好像是 osgWidget 的问题,因为我把代码里面 osgWidget  部分注释掉,然后就正常了。 看起来不能用 osgWidget 了。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

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

联系我们

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