查看: 2968|回复: 7

关于OSG在MFC中对象创建问题

[复制链接]

该用户从未签到

发表于 2008-9-9 10:31:44 | 显示全部楼层 |阅读模式
为什么我创建10000个四边形可以,但是创建大于100个六面体对象错误?
  1. // 四边形
  2. osg::ref_ptr<osg::Node> createQuad()
  3. {
  4.         osg::ref_ptr<osg::Geometry> geom = new osg::Geometry;

  5.         osg::ref_ptr<osg::Vec3Array> v = new osg::Vec3Array;
  6.         geom->setVertexArray( v.get() );
  7.         v->push_back( osg::Vec3( -1.f, 0.f, -1.f ) );
  8.         v->push_back( osg::Vec3( 1.f, 0.f, -1.f ) );
  9.         v->push_back( osg::Vec3( 1.f, 0.f, 1.f ) );
  10.         v->push_back( osg::Vec3( -1.f, 0.f, 1.f ) );

  11.         osg::ref_ptr<osg::Vec4Array> c = new osg::Vec4Array;
  12.         geom->setColorArray( c.get() );
  13.         //geom->setColorBinding( osg::Geometry::BIND_PER_VERTEX );
  14.         c->push_back( osg::Vec4( 1.f, 0.f, 0.f, 1.f ) );
  15.         c->push_back( osg::Vec4( 0.f, 1.f, 1.f, 1.f ) );
  16.         c->push_back( osg::Vec4( 0.f, 0.f, 1.f, 1.f ) );
  17.         c->push_back( osg::Vec4( 1.f, 1.f, 1.f, 1.f ) );

  18.         osg::ref_ptr<osg::Vec3Array> n = new osg::Vec3Array;
  19.         geom->setNormalArray( n.get() );
  20.         geom->setNormalBinding( osg::Geometry::BIND_OVERALL );
  21.         n->push_back( osg::Vec3( 0.f, -1.f, 0.f ) );

  22.         geom->addPrimitiveSet(new osg::DrawArrays( osg::PrimitiveSet::QUADS, 0, 4 ) );

  23.         osg::ref_ptr<osg::Geode> geode = new osg::Geode;
  24.         geode->addDrawable( geom.get() );
  25.         return geode.get();
  26. }
  27. // 六面体
  28. osg::ref_ptr<osg::Node> createBox()
  29. {
  30.         osg::ref_ptr<osg::Geode> box = new osg::Geode;

  31.         osg::StateSet* state = box->getOrCreateStateSet();
  32.         osg::PolygonMode* pm = new osg::PolygonMode(
  33.                 osg::PolygonMode::FRONT_AND_BACK, osg::PolygonMode::FILL );
  34.         state->setAttributeAndModes( pm,
  35.                 osg::StateAttribute::ON | osg::StateAttribute::PROTECTED );

  36.         osg::ref_ptr<osg::Geometry> geom = new osg::Geometry;
  37.         osg::ref_ptr<osg::Vec3Array> v = new osg::Vec3Array;
  38.         geom->setVertexArray( v.get() );

  39.         {
  40.                 const float x( 0.f );
  41.                 const float y( 0.f );
  42.                 const float z( 0.f );
  43.                 const float r( 0.1f );

  44.                 v->push_back( osg::Vec3( x-r, y-r, z-r ) ); //left -X
  45.                 v->push_back( osg::Vec3( x-r, y-r, z+r ) );
  46.                 v->push_back( osg::Vec3( x-r, y+r, z+r ) );
  47.                 v->push_back( osg::Vec3( x-r, y+r, z-r ) );

  48.                 。。。 。。。//right +X 同上
  49.                
  50.                 。。。 。。。// bottom -Z 同上
  51.        
  52.                 。。。 。。。// top +Z  同上
  53.                
  54.                 。。。 。。。// back +Y 同上
  55.         }

  56.         osg::ref_ptr<osg::Vec4Array> c = new osg::Vec4Array;
  57.         geom->setColorArray( c.get() );
  58.         geom->setColorBinding( osg::Geometry::BIND_OVERALL );
  59.         c->push_back( osg::Vec4( 0.f, 1.f, 1.f, 1.f ) );

  60.         osg::ref_ptr<osg::Vec3Array> n = new osg::Vec3Array;
  61.         geom->setNormalArray( n.get() );
  62.         geom->setNormalBinding( osg::Geometry::BIND_PER_PRIMITIVE );
  63.         n->push_back( osg::Vec3( -1.f, 0.f, 0.f ) );
  64.         ... ... // push多个法线

  65.         geom->addPrimitiveSet( new osg::DrawArrays( GL_QUADS, 0, 20 ) );
  66.         box->addDrawable( geom.get() );

  67.         return box.get();
  68. }

  69. void  creatObj()
  70. {
  71.          for (int nIndex = 0;nIndex < 480;nIndex++)
  72.         {
  73.                 //创建正方形
  74.                 //osg::ref_ptr<osg::Node> nodeQuad = createQuad();   // OK
  75.                   osg::ref_ptr<osg::Node> nodeQuad = createBox();      // Error
  76.                 // 优化模型
  77.                 osgUtil::Optimizer optimizer;
  78.                 optimizer.optimize(nodeQuad.get());
  79.                 optimizer.reset();
  80.                 getGroupRoot()->addChild(nodeQuad.get());
  81.         }
  82. }
复制代码

[ 本帖最后由 xubin 于 2008-9-9 10:51 编辑 ]

该用户从未签到

 楼主| 发表于 2008-9-9 10:34:45 | 显示全部楼层
郁闷。忘了选择插入代码了。不过各位大虾肯定知道含义了。还望多多赐教````````

该用户从未签到

发表于 2008-9-9 10:44:42 | 显示全部楼层
创建一个Box是可以的吗?那么把Optimizer去掉试一试。
还有这个结构很浪费系统内存和遍历时间。如果所有四边形都是一样或者有所放缩的话,只用一个Geode就够了,建立足够多的PAT父节点。

该用户从未签到

发表于 2008-9-9 10:58:08 | 显示全部楼层
的确是有这个问题,难道是 BUG??

该用户从未签到

 楼主| 发表于 2008-9-9 11:01:21 | 显示全部楼层
创建少于100个BOX是正确的。我把Optimizer去掉,没有优化还是错误。
请教下attay。我现在存在几个问题。
1、写上述测试程序的目的是为了根据实际数据来创建地形。地形是由8个点控制的角点网格。我现在可以得到每个网格的8个点的大地坐标(如:81000.000000   16000.016602   2323.798096)。用什么样的方法创建网格对象比较好?我的网格一般都是百万级的。
2、我的大地坐标如何与OSG的坐标对应上?一般OSG中测试程序都是1,-1等坐标?
希望attay能给点建议。在线等待中。

该用户从未签到

发表于 2008-9-9 11:39:14 | 显示全部楼层
原帖由 xubin 于 2008-9-9 11:01 发表
创建少于100个BOX是正确的。我把Optimizer去掉,没有优化还是错误。
请教下attay。我现在存在几个问题。
1、写上述测试程序的目的是为了根据实际数据来创建地形。地形是由8个点控制的角点网格。我现在可以得到每个 ...


抱歉我不是从事地形和地理信息处理工作的,这方面不妨请教FlySky和zhougis。

不过我想您的测试程序也许没有起到测试的作用,因为OSG的强项之一就是地理信息的处理(这也是其他3D库无法比拟的,大量的OSG成功案例都是GIS相关),我想没有必要自己构建大规模的地形。

osgTerrain库提供了针对地形输入和处理的解决方案,可以参考osgterrain例子;也可以使用VPB来实现地形的读入和分页处理。OSG应该也提供了各种地理坐标的转换方案。

该用户从未签到

 楼主| 发表于 2008-9-9 11:56:02 | 显示全部楼层
三Q。我在好好看看````````

该用户从未签到

发表于 2008-9-9 12:58:37 | 显示全部楼层
应该是没有做好调度的,,,内存不可能一下子容纳那么多的数据的~~~~~~
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

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

联系我们

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