点云显示的问题(17楼已放出新的源代码)
请教一下高手:我使用osg显示大量的三维点云数据,发现在显示时,除了原有的点坐标数据外,总是出现3条类似坐标轴那样的很长的条形直线,是由相互平行的短线构成的。会是什么问题呢?
源代码在下面。
请帮忙看一下,先谢过了!
[ 本帖最后由 yuanyulei 于 2008-9-16 19:24 编辑 ] 我得到的结果如下图所示,似乎这个坐标系整个都是由您的点云组成的,拉进摄像机就可以看到它们都是点阵的集合。不知您所述的问题发生在哪里? 不应该是点云坐标的问题啊
我在Polyworks里面打开就没有这些多余点的
而且文件总共才300多K,没有这么多数据的 将上图放大很多倍后
就会发现里面真实的点云图
在上图中只是一个很小的点
刚开始我以为没有显示出来
后来才发现图中有数据的,只是增加了很多多余的数据
不知道怎么显示出来的 请版主帮忙分析一下
感激涕零 原帖由 yuanyulei 于 2008-9-4 10:33 发表 http://bbs.osgchina.org/images/common/back.gif
请版主帮忙分析一下
感激涕零
这个问题不是出在OSG,而是您的fscanf。
这样写取出的数据量才正确:
fscanf(pfData, "%f", &(pointdata.x));
fscanf(pfData, "%f", &(pointdata.y));
fscanf(pfData, "%f", &(pointdata.z));
//fscanf(pfData, "%c", &(pointdata.i));
fscanf(pfData, "%d", &(pointdata.i));
您原来的写法取不到最后一个数据i,导致后面读取数据的顺序全乱了。
建议使用C++时,尽量不要混用C的那些函数,比如printf,scanf什么的。虽说运行没什么影响,但从规范性上来说很不舒服,而且难免以后在兼容性上会出问题。 哦
谢谢版主
我回去试一下 不知道楼主有没有用记事本打开data.xyzi看过,里面的数据类似这样:
1.015000 0.643000 18.136000 170
1.016000 0.645000 18.118000 168
1.011000 0.647000 18.122999 174
1.014000 0.647000 18.122999 167
1.025000 0.650000 18.118000 169
所以,个人认为POINT4应该定义成这样:
struct POINT4
{
float x;
float y;
float z;
// chari;
inti;
};
最后一个值i应该为透明度。
楼主把程序完成后共享来看看啊~
[ 本帖最后由 Sailent 于 2008-9-5 12:07 编辑 ] 我已经试过了
将数据格式改过后就没有问题了
下次我把数据和代码贴上来 这是我编译好的程序和数据,在我机器上运行没有问题. 原帖由 yuanyulei 于 2008-9-11 19:45 发表 http://bbs.osgchina.org/images/common/back.gif
这是我编译好的程序和数据,在我机器上运行没有问题.
呵呵,看起来效果很不错啊~~支持一下。帮您修改了一下标题 楼主是在哪加LIB的呢?怎么我看见工程属性->properties->configuration properties->linker->Input标签下的Additional Dependencies里面什么都没有,但一编译又会出现找不到“osgIntrospectiond.lib”的错误呢? 链接器中的命令行里面~~~~~~
效果还不错,,,就是数据少了点,,,来一大片就好了~~~~~哈哈~~~~~~~~ 晕,为什么要把LIB放在那呢……看上去不错,应该贴一下纹理就有真实的云的效果了吧?
晕,为什么要把LIB放在那呢……看上去不错,应该贴一下纹理就有真实的云的效果了吧?
一样的啦,,,数据足够多的话,,直接设置点的颜色就可以真实的显示云的效果~~~~~
回复 14楼 的帖子
每个点都有灰度信息的不用纹理 按版主的指点,将光照关闭后
效果就出来了
这是新的代码 再问一个问题
为什么我用viewer.run();可以将场景显示出来
使用
while(!viewer->done())
{
osg->PreFrameUpdate();
viewer->frame();
osg->PostFrameUpdate();
Sleep(10);
}
怎么就不行呢? 原帖由 yuanyulei 于 2008-9-16 19:28 发表 http://bbs.osgchina.org/images/common/back.gif
再问一个问题
为什么我用viewer.run();可以将场景显示出来
使用
while(!viewer->done())
{
osg->PreFrameUpdate();
viewer->frame();
osg->PostFrameUpdate();
Sleep(10);
}
怎么就不 ...
恐怕是因为您没有设置场景漫游器。viewer.run函数已经自动为您加了缺省的漫游器,自己设置的话,至少需要:
setCameraManipulator(new osgGA::TrackballManipulator()); 好的
谢谢版主
我回去试以下 请问版主如果我要读取一亿以上的点云数据,应该怎嘛操作呢,能给个思路吗 刚从pcl显示点云转战osg显示点云,对osg刚编译过,搭建vs+qt+osg的点云处理框架
页:
[1]