查看: 6841|回复: 13

怎么实时画线

[复制链接]

该用户从未签到

发表于 2011-1-27 17:24:01 | 显示全部楼层 |阅读模式
以下是我的代码,没画出来,拜托帮帮忙放在handle()方法里的代码
case osgGA::GUIEventAdapter:USH
   if(ea.getButton() == 1)
   {
        mViewer->setSceneData(createLine(ea.getX(), ea.getY()));
    }
    break;

//============================================
//另一部分,createLine()方法
osg::ref_ptr<osg::Node> createLine(float x, float y)
{
    osg::ref_ptr<osg::Geometry> geom = new osg::Geometry;

    osg::ref_ptr<osg::Vec3Array> v = new osg::Vec3Array;

    geom->setVertexArray( v.get() );

    v->push_back( osg::Vec3( x, y, -1.f ) );

    osg::ref_ptr<osg::Vec4Array> c = new osg::Vec4Array;

   geom->setColorArray( c.get() ); geom->setColorBinding(    osg::Geometry::BIND_PER_VERTEX );

   c->push_back( osg::Vec4( 1.f, 0.f, 0.f, 1.f ) );

   geom->addPrimitiveSet( new osg:rawArrays( osg::PrimitiveSet:INE_LOOP ) );

   osg::ref_ptr<osg::Geode> geode = new osg::Geode;

   geode->addDrawable( geom.get() );

   return geode.get();

}

该用户从未签到

发表于 2011-1-28 08:15:05 | 显示全部楼层
您的代码看起来非常不合理……OSG三维渲染引擎设计与实践 的资源网站上有一个动态划线的例子,可以免费下载,您可以看一看其中的作法

该用户从未签到

 楼主| 发表于 2011-1-28 08:46:50 | 显示全部楼层
了解,我是个菜鸟选手

该用户从未签到

 楼主| 发表于 2011-1-28 11:09:22 | 显示全部楼层
我看了,似乎没有什么想通之处,不挨边,能指点下我这个出在什么问题上吗~

该用户从未签到

发表于 2011-1-28 12:03:43 | 显示全部楼层
:L核心就是你更新完之后dirty,,怎么不挨边~~~~~~~~~~~~

该用户从未签到

发表于 2011-1-28 14:08:09 | 显示全部楼层
我觉得lz程序的问题有2:一是线的顶点只有一点,二是错在
  1. osg::DrawArrays( osg::PrimitiveSet::LINE_LOOP)
复制代码
,这样是是画不出东西的。看一下osg自带的例子osggeometry吧。
如果你需要动态更新线的位置的话,array说的的例子是个非常好的参考。

该用户从未签到

 楼主| 发表于 2011-2-10 16:12:50 | 显示全部楼层
多谢各位,画出来了,但是画了一顶数量的线后画面就特别卡,一顿一顿的,我把要建立的对象通通放到构造函数里去了,以下是一部分代码。

  1. virtual bool handle(const osgGA::GUIEventAdapter&, osgGA::GUIActionAdapter& aa)
  2. {
  3.     viewer = dynamic_cast<osgViewer::Viewer*>(&&aa);
  4.      switch(....)
  5.      {
  6.      case......
  7.      {
  8.           va->push_back(osg::Vec3(ea.getX(), 1.0f, ea.getY()));
  9.           va->dirty();
  10.           geom->addPrimitiveSet(new osg::DrawArrays(osg::PrimitiveSet::LINE_STRIP, 0, va->size());//我怀疑问题出在这,但还没想好怎么改
  11.           geode->addDrawable(geom.get());
  12.           group->addChild(geode.get());
  13.           viewer->setSceneData(group.get());
  14.      }
  15.      break;
  16.      ...
  17.      }
  18. }
复制代码
劳烦各位帮忙看看是怎么回事

该用户从未签到

发表于 2011-2-11 01:13:21 | 显示全部楼层
很明显您的代码是有问题的,,怎么能够每次都添加到根节点呢,,同时又设置场景数据呢,,这样您的场景迟早会崩溃的~~~~~~~~~~

该用户从未签到

 楼主| 发表于 2011-2-12 11:33:19 | 显示全部楼层
谢谢福来斯钙兄的提示,,我改动了其中两句,

  1. group->addChild(geode.get());//去掉了这一句
  2. viewer->setSceneData(group.get());//将group改为geode
复制代码
效果就出来了,可是问题又出来了,画出的线就在一个方块中,无法全屏,我估计是包围体的问题,可改来改去也没跳出这个方块,能帮忙再提示下吗,这里先谢谢了

该用户从未签到

发表于 2011-2-12 13:03:24 | 显示全部楼层
dirtyBound()

该用户从未签到

 楼主| 发表于 2011-2-12 17:06:01 | 显示全部楼层
上面我说错了,其实是视点一直在变

该用户从未签到

发表于 2011-2-16 19:59:37 | 显示全部楼层
请问,动态划线的例子是什么名字的,在哪下载呢

该用户从未签到

 楼主| 发表于 2011-2-17 09:43:57 | 显示全部楼层

该用户从未签到

 楼主| 发表于 2011-2-18 11:07:08 | 显示全部楼层
这是效果,无法全屏绘制,是什么问题,视点吗?
1.jpg
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

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

联系我们

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