查看: 4985|回复: 21

点云显示的问题(17楼已放出新的源代码)

[复制链接]

该用户从未签到

发表于 2008-9-2 19:20:53 | 显示全部楼层 |阅读模式
请教一下高手:
我使用osg显示大量的三维点云数据,发现在显示时,除了原有的点坐标数据外,总是出现3条类似坐标轴那样的很长的条形直线,是由相互平行的短线构成的。会是什么问题呢?
源代码在下面。
请帮忙看一下,先谢过了!


[ 本帖最后由 yuanyulei 于 2008-9-16 19:24 编辑 ]

osg.rar

86.99 KB, 下载次数: 321, 下载积分: 威望 1

该用户从未签到

发表于 2008-9-2 20:20:09 | 显示全部楼层
我得到的结果如下图所示,似乎这个坐标系整个都是由您的点云组成的,拉进摄像机就可以看到它们都是点阵的集合。不知您所述的问题发生在哪里?
points.PNG

该用户从未签到

 楼主| 发表于 2008-9-4 10:30:32 | 显示全部楼层
不应该是点云坐标的问题啊
我在Polyworks里面打开就没有这些多余点的
而且文件总共才300多K,没有这么多数据的

该用户从未签到

 楼主| 发表于 2008-9-4 10:32:16 | 显示全部楼层
将上图放大很多倍后
就会发现里面真实的点云图
在上图中只是一个很小的点
刚开始我以为没有显示出来
后来才发现图中有数据的,只是增加了很多多余的数据
不知道怎么显示出来的

该用户从未签到

 楼主| 发表于 2008-9-4 10:33:29 | 显示全部楼层
请版主帮忙分析一下
感激涕零

该用户从未签到

发表于 2008-9-4 11:39:11 | 显示全部楼层
原帖由 yuanyulei 于 2008-9-4 10:33 发表
请版主帮忙分析一下
感激涕零


这个问题不是出在OSG,而是您的fscanf。
这样写取出的数据量才正确:
fscanf(pfData, "%f", &(pointdata[iNum].x));
fscanf(pfData, "%f", &(pointdata[iNum].y));
fscanf(pfData, "%f", &(pointdata[iNum].z));
//fscanf(pfData, "%c", &(pointdata[iNum].i));
fscanf(pfData, "%d", &(pointdata[iNum].i));

您原来的写法取不到最后一个数据i,导致后面读取数据的顺序全乱了。
建议使用C++时,尽量不要混用C的那些函数,比如printf,scanf什么的。虽说运行没什么影响,但从规范性上来说很不舒服,而且难免以后在兼容性上会出问题。

该用户从未签到

 楼主| 发表于 2008-9-5 10:36:58 | 显示全部楼层

谢谢版主
我回去试一下

该用户从未签到

发表于 2008-9-5 12:04:25 | 显示全部楼层
不知道楼主有没有用记事本打开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;
//       char  i;
        int  i;
};
最后一个值i应该为透明度。
楼主把程序完成后共享来看看啊~

[ 本帖最后由 Sailent 于 2008-9-5 12:07 编辑 ]

该用户从未签到

 楼主| 发表于 2008-9-10 12:46:14 | 显示全部楼层
我已经试过了
将数据格式改过后就没有问题了
下次我把数据和代码贴上来

该用户从未签到

 楼主| 发表于 2008-9-11 19:45:11 | 显示全部楼层
这是我编译好的程序和数据,在我机器上运行没有问题.

osg.rar

883.42 KB, 下载次数: 3035, 下载积分: 威望 1

该用户从未签到

发表于 2008-9-11 20:19:33 | 显示全部楼层
原帖由 yuanyulei 于 2008-9-11 19:45 发表
这是我编译好的程序和数据,在我机器上运行没有问题.


呵呵,看起来效果很不错啊~~支持一下。帮您修改了一下标题

该用户从未签到

发表于 2008-9-12 09:30:52 | 显示全部楼层
楼主是在哪加LIB的呢?怎么我看见工程属性->properties->configuration properties->linker->Input标签下的Additional Dependencies里面什么都没有,但一编译又会出现找不到“osgIntrospectiond.lib”的错误呢?

该用户从未签到

发表于 2008-9-13 22:09:47 | 显示全部楼层
链接器中的命令行里面~~~~~~


效果还不错,,,就是数据少了点,,,来一大片就好了~~~~~哈哈~~~~~~~~

该用户从未签到

发表于 2008-9-16 09:52:35 | 显示全部楼层
晕,为什么要把LIB放在那呢……看上去不错,应该贴一下纹理就有真实的云的效果了吧?

该用户从未签到

发表于 2008-9-16 12:20:21 | 显示全部楼层
晕,为什么要把LIB放在那呢……看上去不错,应该贴一下纹理就有真实的云的效果了吧?


一样的啦,,,数据足够多的话,,直接设置点的颜色就可以真实的显示云的效果~~~~~

该用户从未签到

 楼主| 发表于 2008-9-16 19:17:56 | 显示全部楼层

回复 14楼 的帖子

每个点都有灰度信息的
不用纹理

该用户从未签到

 楼主| 发表于 2008-9-16 19:23:52 | 显示全部楼层
按版主的指点,将光照关闭后
效果就出来了
这是新的代码

osg.rar

887.26 KB, 下载次数: 6346, 下载积分: 威望 1

该用户从未签到

 楼主| 发表于 2008-9-16 19:28:59 | 显示全部楼层
再问一个问题
为什么我用viewer.run();可以将场景显示出来
使用
while(!viewer->done())               
{
                osg->PreFrameUpdate();
                viewer->frame();
                osg->PostFrameUpdate();
                Sleep(10);                
}
怎么就不行呢?

该用户从未签到

发表于 2008-9-16 21:17:56 | 显示全部楼层
原帖由 yuanyulei 于 2008-9-16 19:28 发表
再问一个问题
为什么我用viewer.run();可以将场景显示出来
使用
while(!viewer->done())               
{
                osg->PreFrameUpdate();
                viewer->frame();
                osg->PostFrameUpdate();
                Sleep(10);                
}
怎么就不 ...


恐怕是因为您没有设置场景漫游器。viewer.run函数已经自动为您加了缺省的漫游器,自己设置的话,至少需要:
setCameraManipulator(new osgGA::TrackballManipulator());

该用户从未签到

 楼主| 发表于 2008-9-19 19:25:10 | 显示全部楼层
好的
谢谢版主
我回去试以下

该用户从未签到

发表于 2018-12-29 17:56:46 | 显示全部楼层
请问版主如果我要读取一亿以上的点云数据,应该怎嘛操作呢,能给个思路吗

该用户从未签到

发表于 2018-12-29 17:58:40 | 显示全部楼层
刚从pcl显示点云转战osg显示点云,对osg刚编译过,搭建vs+qt+osg的点云处理框架
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

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

联系我们

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