查看: 4187|回复: 13

osg的data里面有的数据(fountain.osgt)读不出来

[复制链接]

该用户从未签到

发表于 2012-10-15 23:42:31 | 显示全部楼层 |阅读模式
本帖最后由 xiacanni 于 2012-10-15 23:45 编辑

今天跑到了《osg程序设计教程》的第18个例子。
程序运行的时候不对,一直不显示图像,也不报错。
调试的时候发现,程序是到了这一句就不动了(不报错,也不能完成这一句)。
osg::Node* fountain = osgDB::readNodeFile("fountain.osgt");
(其实程序原文是osg::Node* fountain = osgDB::readNodeFile("fountain.osg");但是我的data里面没有fountain.osg,只有fountain.osgt,所以我就把fountain.osg改成了fountain.osgt)
我把fountain.osgt改成cow.osg就可以正常执行。
我又试了dumptruck.osg、dumptruck.osgt、glider.osg、glider.osgt、cessnafire.osgt等文件。
其中dumptruck.osgt也不能正确读取。
dumptruck.osgt和fountain.osgt的共同特点是相对其他的.osgt文件都大一些(2183kb、1066kb)。
难道是大些的.osgt文件不能正常读取?(大些的.osg是可以的,比如dumptruck.osg)

该用户从未签到

发表于 2012-10-16 07:59:42 | 显示全部楼层
osgt里面有version验证,可能不符合所以就不读取了

该用户从未签到

 楼主| 发表于 2012-10-16 20:23:55 | 显示全部楼层
liuzhiyu123 发表于 2012-10-16 07:59
osgt里面有version验证,可能不符合所以就不读取了

喔。但还是有点怀疑,因为程序到那里就卡住了了,也不说数据读不了,程序后续的句子也不再走,很奇怪啊。

该用户从未签到

 楼主| 发表于 2012-10-18 18:39:25 | 显示全部楼层
liuzhiyu123 发表于 2012-10-16 07:59
osgt里面有version验证,可能不符合所以就不读取了

版主不理我了...如何看version信息呢?

该用户从未签到

发表于 2012-10-19 07:40:32 | 显示全部楼层
xiacanni 发表于 2012-10-18 18:39
版主不理我了...如何看version信息呢?

请给出具体的信息

该用户从未签到

 楼主| 发表于 2012-10-20 22:13:55 | 显示全部楼层
liuzhiyu123 发表于 2012-10-19 07:40
请给出具体的信息

osg版本是3.0

程序没法给出具体信息,程序跑到那里也不报错,就停了...

该用户从未签到

发表于 2012-10-22 08:35:37 | 显示全部楼层
您说的程序停了是什么意思?给出截图,堆栈信息等等,或者您读取的代码

该用户从未签到

 楼主| 发表于 2012-10-22 08:51:36 | 显示全部楼层
liuzhiyu123 发表于 2012-10-22 08:35
您说的程序停了是什么意思?给出截图,堆栈信息等等,或者您读取的代码

源码是这样的

#include <osg/MatrixTransform>
#include <osg/PositionAttitudeTransform>
#include <osg/Geode>

#include <osgDB/Registry>
#include <osgDB/ReadFile>
#include <osgGA/TrackballManipulator>
#include <osgViewer/Viewer>


osg::AnimationPath* createAnimationPath(const osg::Vec3& center,float radius,double looptime)
{
    osg::AnimationPath* animationPath = new osg::AnimationPath;
    animationPath->setLoopMode(osg::AnimationPath:OOP);
   
    int numSamples = 40;
    float yaw = 0.0f;
    float yaw_delta = 2.0f*osg:I/((float)numSamples-1.0f);
    float roll = osg::inDegrees(30.0f);
   
    double time=0.0f;
    double time_delta = looptime/(double)numSamples;
    for(int i=0;i<numSamples;++i)
    {
        osg::Vec3 position(0,0,0);
        osg:uat rotation(osg::Quat(roll,osg::Vec3(0.0,1.0,0.0))*osg::Quat(-(yaw+osg::inDegrees(90.0f)),osg::Vec3(0.0,0.0,1.0)));
        animationPath->insert(time,osg::AnimationPath::ControlPoint(position,rotation));
        yaw += yaw_delta;
        time += time_delta;
    }
    return animationPath;   
}

osg::Node* createMovingModel(const osg::Vec3& center, float radius)
{
    float animationLength = 10.0f;
    osg::AnimationPath* animationPath = createAnimationPath(center,radius,animationLength);
    osg::Group* model = new osg::Group;
    osg::Node* fountain = osgDB::readNodeFile("fountain.osgt");
        fountain ->asGroup() ->getChild(0) ->setNodeMask(0) ;

    if (fountain)
    {
        osg::PositionAttitudeTransform* xform = new osg::PositionAttitudeTransform;   
        xform->setUpdateCallback(new osg::AnimationPathCallback(animationPath,0.0,1.0));
        xform->addChild(fountain);
        model->addChild(xform);
    }
   
    return model;
}

osg::Node* createModel()
{
    osg::Vec3 center(0.0f,0.0f,0.0f);
    float radius = 1.0f;
    osg::Group* root = new osg::Group;
        osg::Node* movingModel = createMovingModel(center,radius*0.8f);
    root->addChild(movingModel);
    return root;
}

int main( int argc, char **argv )
{
    osgViewer::Viewer viewer;
    osg::Node* model = createModel();
    viewer.setSceneData(model);
    viewer.setCameraManipulator(new osgGA::TrackballManipulator());
        viewer.realize() ;
    return viewer.run();
}


程序听了的意思是:
程序运行本来应该出现一个命令行窗口和显示图像的窗口,但是程序只出现命令行窗口,图像一直不显示。
如果调试的话效果也是一样的,没有报错。
如果设置断点可以发现是到osg::Node* fountain = osgDB::readNodeFile("fountain.osgt");这句停住了,后面的句子都没有运行到。

该用户从未签到

发表于 2012-10-22 09:00:37 | 显示全部楼层
xiacanni 发表于 2012-10-22 08:51
源码是这样的

#include

用了您的代码,我这里完全没有出现您说的问题,就是一个粒子喷射的场景,osg3.1.2

该用户从未签到

 楼主| 发表于 2012-10-22 09:09:05 | 显示全部楼层
liuzhiyu123 发表于 2012-10-22 09:00
用了您的代码,我这里完全没有出现您说的问题,就是一个粒子喷射的场景,osg3.1.2

知道了。
我是3.0,那也许是哪里设置不当之类奇怪的问题吧。

“osgt里面有version验证,可能不符合所以就不读取了”这个有什么办法获取吗,version验证信息?

该用户从未签到

发表于 2012-10-22 09:33:00 | 显示全部楼层
打开您的osgt文件 最开始
#Version 78
#Generator OpenSceneGraph 2.9.17

version 如果当前序列化的版本 低于这个 就不在往下读取了 也是考虑到了兼容性

该用户从未签到

 楼主| 发表于 2012-10-24 19:09:47 | 显示全部楼层
liuzhiyu123 发表于 2012-10-22 09:33
打开您的osgt文件 最开始
#Version 78
#Generator OpenSceneGraph 2.9.17

谢谢。
我的fountain.osgt也是
#Version 78
#Generator OpenSceneGraph 2.9.17

读不出来的问题就先不管了,有时间再试试高版本的osg吧。

该用户从未签到

发表于 2013-11-25 15:16:58 | 显示全部楼层
请问。osg文件和.osgt文件有什么不一样吗?是osg文件在更高版本中就成osgt了吗?

该用户从未签到

发表于 2013-12-2 10:36:23 | 显示全部楼层
osgt是序列化存储的格式,更适合扩展和未来用于内省与脚本语言
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

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

联系我们

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