查看: 2759|回复: 12

求助:点的显示问题

[复制链接]

该用户从未签到

发表于 2008-7-14 12:36:41 | 显示全部楼层 |阅读模式
问题:
我想显示一些点,不同的点对应不同的Geode。代码如下:

osgViewer::Viewer viewer;
osg::ref_ptr<osg::Group> root=new osg::Group;
while (mysqlpp::Row row = res.fetch_row())//总共有2089个点
{
  string str=row["astext(pts)"];
  std::vector<pointSQL> pointvec;//存点的容器vector
  pointstringtopoint(str,pointvec);//类型转换(字符串转换为double)
  std::vector<pointSQL>::iterator it,itend=pointvec.end();
  for(it=pointvec.begin();it<itend;it++)
{
  osg::ref_ptr<osg::Geode> pointGeode=new osg::Geode();
  osg::ref_ptr<osg::Geometry> pointGeometry=new osg::Geometry();

  osg::ref_ptr<osg::Vec3Array> pointVer=new osg::Vec3Array;
  pointVer->push_back(osg::Vec3(it->x,it->y,0));
  pointGeometry->setVertexArray(pointVer.get());

  osg::ref_ptr<osg::Vec4Array> color=new osg::Vec4Array;
  pointGeometry->setColorArray(color.get());
  pointGeometry->setColorBinding(osg::Geometry::BIND_PER_VERTEX);
  color->push_back(osg::Vec4(1.,0.,0.,1.));
                                       
  pointGeometry->addPrimitiveSet(new osg:: DrawArrays(osg:: PrimitiveSet:: POINTS,0,1));
                                       
  pointGeode->addDrawable(pointGeometry.get());
  root->addChild(pointGeode.get());
                                       
}
}
   bool success = osgDB::writeNodeFile(*(root.get()),"test.osg");         
   viewer.setSceneData(root.get());
   viewer.run();
               
经过调试发现root确实有2089个孩子结点。但运行程序后,点不显示。生成的文本文件test.osg见附件。
将该程序稍做改动:把所有的点都放到一个Geode,运行程序后,点能正常显示。
请大家指点一下,谢谢。

[ 本帖最后由 csu_zjh 于 2008-7-14 12:39 编辑 ]

test.rar

19.21 KB, 下载次数: 104, 下载积分: 威望 1

该用户从未签到

 楼主| 发表于 2008-7-14 12:38:14 | 显示全部楼层
pointGeometry->addPrimitiveSet(new osg:: DrawArrays(osg:: PrimitiveSet:: POINTS,0,1));

[ 本帖最后由 csu_zjh 于 2008-7-14 12:39 编辑 ]

该用户从未签到

发表于 2008-7-14 13:48:43 | 显示全部楼层
把所有点放在同一个Geode里面是正确的方法。
每个点占用一个Geode的话实在太耗费系统资源了,无法预料后果;还有就是所有的几何体都被初始化到原点上了,这样可能确实显示不出点的正确位置。

该用户从未签到

 楼主| 发表于 2008-7-14 15:31:25 | 显示全部楼层
谢谢
我的目的是利用鼠标进行查询(点查询和框选查询).利用查询结果从数据库里读取对象的属性信息.换句话说,就是想对不同的几何体进行操作.于是我就想把不同的点存放到不同的Geode里.也许我的思路有问题,请指教.

该用户从未签到

发表于 2008-7-14 18:38:14 | 显示全部楼层
如果只有点数据的话,根据鼠标选择的坐标范围,遍历点的链表并找出符合条件的就可以了。如果对象是各式样的三维物体,那么使用大量Geode的方法是没有什么问题的,注意每个Geode都应该有一个Transform父节点,用于设置其位置

该用户从未签到

 楼主| 发表于 2008-7-14 19:26:42 | 显示全部楼层
非常感谢.....

该用户从未签到

发表于 2009-4-14 18:02:35 | 显示全部楼层
使用osg:rimitiveSet::POINTS绘制点的时候,如何设置点的大小呢?

该用户从未签到

发表于 2009-4-14 19:06:11 | 显示全部楼层
osg:: PointSize

该用户从未签到

发表于 2009-4-14 21:22:24 | 显示全部楼层
code]        osg::ref_ptr<osg:oint> point=new osg::Point();
    point->setSize(1);
        geom3->getOrCreateStateSet()->setAttributeAndModes(point.get(),osg::StateAttribute::ON);[/code]

该用户从未签到

发表于 2011-8-11 10:19:36 | 显示全部楼层
我也发现在osg3.0下有此问题,如果一个geode下只有一个点,此点不能显示;如果在此点一定距离处再增加一个点(要离开一定距离),这两个点都能显示出来。没明白其中原因。希望大家给点提示。多谢!

该用户从未签到

发表于 2011-8-11 10:40:22 | 显示全部楼层
回复 11# blackriver

    osg的CullSettings里面默认的CullingMode会把单个的点裁剪掉,所以你需要设置细节裁剪不属于其中。

    // 设置细节裁剪,否则一个点将被裁剪
    getCamera()->setCullingMode( getCamera()->getCullingMode() & ~osg::CullStack::SMALL_FEATURE_CULLING );

该用户从未签到

发表于 2011-8-12 08:56:33 | 显示全部楼层
回复 12# 476080276

我按照你的方法试了一下,果然可以。

这个问题费了我不少时间,终于解决了。谢谢你!
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

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

联系我们

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