查看: 2326|回复: 13

如何得到模型的各个点

[复制链接]

该用户从未签到

发表于 2009-5-7 14:14:59 | 显示全部楼层 |阅读模式
想得到模型的各个三维点坐标,用以下的程序出错了:

osg::Node* rootNode = osgDB::readNodeFile ("cow.osg");
osg::Geode* geode= dynamic_cast<osg::Geode*>(rootNode);
for( unsigned int i=0; i < geode.getNumDrawables(); ++i )
{
        osg::Geometry* geom = dynamic_cast<osg::Geometry*>( geode.getDrawable(i););
}

编译出现以下错误:
error C2682: 不能使用“dynamic_cast”从“const osg:rawable *”转换到“osg::Geometry *”

请教该如何调用???

该用户从未签到

发表于 2009-5-7 15:24:02 | 显示全部楼层
您可能是在一个const函数中执行这一转换操作,此时需要使用const Geometry*对象,或者使用const_cast转换。例如:
  1. const osg::Geometry* geom = dynamic_cast<const osg::Geometry*>( geode.getDrawable(i));
复制代码

该用户从未签到

 楼主| 发表于 2009-5-7 17:58:35 | 显示全部楼层
多谢!
但是还有新的问题。想通过NodeVisitor遍历所有的点,如下程序运行出错了。错误是在
extracted_verts->insert( extracted_verts->end(), verts->begin(), verts->end() );
这话一句,这是书上的例子啊,照抄下来的??
再次请教!

附上代码:
=====================================================================================
class VertexExtractor : public osg::NodeVisitor
{
public:
        //所有的顶点
        osg::ref_ptr<osg::Vec3Array> extracted_verts;
        //构造函数,选择向下遍历全孩子的方式
        VertexExtractor() : osg::NodeVisitor(osg::NodeVisitor::TRAVERSE_ALL_CHILDREN)
        {
                extracted_verts = new osg::Vec3Array;
        }

        //apply
        void apply( osg::Geode& geode )
        {
                //看看有多少可绘制结点
                int iii = geode.getNumDrawables();
                for( unsigned int i=0; i < geode.getNumDrawables(); ++i )
                {
                        osg::Geometry* geom = dynamic_cast<osg::Geometry*>( geode.getDrawable(i) );
                        if( !geom )
                                continue;
                       
                        //得到可绘制结点的顶点序列
                        osg::Vec3Array* verts = dynamic_cast<osg::Vec3Array*>( geom->getVertexArray() );
                        if( !verts )
                                continue;

                        extracted_verts->insert( extracted_verts->end(), verts->begin(), verts->end() );
                }
        }
};

int main(int argc, char** argv)
{
        osgViewer::Viewer viewer;
        osg::Node* rootNode = osgDB::readNodeFile ("cow.osg");

        VertexExtractor ivea ;

        rootNode ->accept (ivea) ;
        viewer.setSceneData(rootNode);
        viewer.realize();

        std:fstream out("C:\\test.vertexs") ;
        int size_t = ivea.extracted_verts .get () ->size () ;
        std::vector <osg::Vec3 > ::iterator iter = ivea.extracted_verts .get () ->begin () ;
        for (int i =0 ; i<size_t ; i++)
        {
                out << iter->x () <<" "<<iter ->y () <<" " << iter ->z () << std::endl; iter ++ ;
        } ;
       
        std::cout <<"输出所有结点完毕"<<std::endl;
        return 0;
}
======================================================================================================

该用户从未签到

发表于 2009-5-7 19:07:00 | 显示全部楼层
还有你出现的是什么错啊 描述一下吗

[ 本帖最后由 ghczhaolei 于 2009-5-7 19:10 编辑 ]

该用户从未签到

发表于 2009-5-7 19:22:16 | 显示全部楼层
正如ghczhaolei所说,麻烦楼主描述一下您出现的错误,编译错误还是运行时错误,错误内容是什么
程序本身我觉得应该没有问题

该用户从未签到

发表于 2009-5-7 19:24:02 | 显示全部楼层

回复 3楼 的帖子

你的代码看不出错误 我刚刚测试了一下 也是没错的 不知你出现的是什么错误

该用户从未签到

发表于 2009-5-7 22:04:27 | 显示全部楼层
这段代码我用过也没问题的。

借楼主的地问个类似的问题,我想通过鼠标点击物体顶点然后返回当前被点击的顶点信息,
问题在不知道怎么获取当前点击到的顶点,屏幕与场景相交结果级中貌似只能判断节点?
顶点怎么处理呢?

该用户从未签到

发表于 2009-5-7 22:23:22 | 显示全部楼层
如果您用的是LinesegmentIntersector,那么取得getIntersections,然后读取Intersection结构体的内容,您所需的顶点信息都包括在内。参看osgpick例子

该用户从未签到

 楼主| 发表于 2009-5-8 13:41:58 | 显示全部楼层
谢谢各路高人。
错误对话框提示是:应用程序发生异常 未知的软件异常(0xc0000417),位置为0x7858c955
点击取消跟踪进程序以后发现时verts->end()中的错误。
调用堆栈如附件图。
1.jpg
我的环境是VS2008+OSG2.2

该用户从未签到

发表于 2009-5-8 16:20:11 | 显示全部楼层
多半可能是工程环境配置的不对,例如在Release版本里引用了Debug的库,等等

另一种可能性是您的某个Geometry几何体在setVertexArray设置顶点数组的时候,没有设置Vec3Array类型的数组;因而verts指针为NULL,不过这通常不太可能

该用户从未签到

 楼主| 发表于 2009-5-8 17:20:56 | 显示全部楼层
这些我都检查了,我的工程是Release版的,引入的osg库也都是Release版的。
不过我的osg库都是在网上下载的别人编译好了的,是不是在自己机子上编译更好一些?

该用户从未签到

发表于 2009-5-8 17:31:27 | 显示全部楼层
可以尝试一下,还有您访问的Geometry模型也要检查一下,是否顶点数组的指针为空或者是野指针。毕竟别的朋友都没有遇到您的错误

该用户从未签到

 楼主| 发表于 2009-5-11 16:12:42 | 显示全部楼层
自己编译了一下OSG,再重新编译运行这个程序就没有问题了,看来还是不同环境的问题。
那么如果我最后做的程序要发布,是不是在别人的机子上也可能会出错吧?
感觉这是一个问题,有什么解决方法吗???

该用户从未签到

发表于 2009-5-11 16:31:22 | 显示全部楼层
您要找出自己的问题所在才对,发布osg程序通常不存在什么通用的问题,除非是显示卡的差异导致显示效果不一致。

我猜想您之前用的osg库和您的开发环境不匹配导致了错误,即,编译osg库用的编译器版本和编写用户程序用的编译器版本不同。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

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

联系我们

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