查看: 2788|回复: 12

OSG读取FBX很慢

[复制链接]

该用户从未签到

发表于 2013-9-24 11:39:04 | 显示全部楼层 |阅读模式
本帖最后由 wangys8363 于 2013-9-24 11:42 编辑

我是按照官方的那个animation例子程序用那个finder来控制FBX动画的播放的,我在程序初始化的时候就已经把FBX读入了,而且已经调用了accept函数,也就是finder已经对应上了FBX的动画,我只是用了nodemask把这个动画隐藏了起来,再我想要用的时候才再用nodemask把他显示出来,可就是这样,我在想显示fbx的时候,还是要等5秒左右才显示出来,这是什么情况啊,是本来就很卡么?还是我程序写的不对?


这是初始化的时候的代码:
  1. //  加入走路动作
  2.     group = new osg::Group();
  3.     osg::Group* node1 = dynamic_cast<osg::Group*>(osgDB::readNodeFile("E:/osg/OpenSceneGraph-3.0.1/build/bin/3.FBX")); //dynamic_cast<osgAnimation::AnimationManager*>(osgDB::readNodeFile(psr[1]));
  4.     osg::ref_ptr<osg::MatrixTransform> node = new osg::MatrixTransform;
  5.         node->addChild(node1);
  6.         osg::Matrix m = node->getMatrix();
  7.         node->setMatrix(m*osg::Matrix::scale(0.5,0.5,0.5));

  8. //        AnimationManagerFinder finder;
  9.     node->accept(finder);
  10.         if (finder._am.valid()) {
  11.                 node->setUpdateCallback(finder._am.get());
  12.                 AnimtkViewerModelController::setModel(finder._am.get());
  13.         } else {
  14.                 osg::notify(osg::WARN) << "no osgAnimation::AnimationManagerBase found in the subgraph, no animations available" << std::endl;
  15.         }
  16.         //        node->setNodeMask(0x0001);
  17. //        node->getOrCreateStateSet()->setMode( GL_LIGHTING, osg::StateAttribute::OFF);
  18.         group->addChild(node);
  19.         AnimtkViewerModelController& mc = AnimtkViewerModelController::instance();
  20.         mc.play();
  21.         group->setNodeMask(0);

  22.         osg::Vec3 center(0.0f,0.0f,0.0f);
  23.         float radius = 100.0f;

  24.         const osg::BoundingSphere& bs = group->getBound();

  25.         float size = radius/bs.radius()*0.4f;
  26.         positioned = new osg::MatrixTransform;
  27.         positioned->setDataVariance(osg::Object::STATIC);
  28.         positioned->setMatrix(osg::Matrix::translate(-bs.center())*
  29.                 osg::Matrix::scale(size,size,size)*
  30.                 osg::Matrix::rotate(osg::inDegrees(90.0f),1.0f,0.0f,0.0f));

  31.         positioned->addChild(group);

  32.         xform = new osg::PositionAttitudeTransform;   
  33.         xform->addChild(positioned);
  34. //        xform->setNodeMask(0);
  35. /*        osg::Vec3d position(0.0,0.0,27.0);
  36.         osg::Vec3 endPos(100.0,100.0,0.0);
  37.         double delta_x,delta_y;
  38.         delta_x = endPos.x()/4;
  39.         delta_y = endPos.y()/4;
  40.         double rot = atan2(delta_x, delta_y);

  41.         osg::Quat quat(rot,osg::Vec3d(0.0,0.0,1.0));

  42.         xform->setPosition(position);
  43.         xform->setAttitude(quat);*/
  44.         m_MainBody->addChild(xform);
复制代码

该用户从未签到

 楼主| 发表于 2013-9-24 11:44:01 | 显示全部楼层
这是需要动画动起来时候的代码
  1. void PersonnelUpdate::operator()( osg::Node* node, osg::NodeVisitor* nv )
  2. {
  3.         PersonnelCarrierVehicle * m = dynamic_cast<PersonnelCarrierVehicle*>(node);
  4.         if(!ifstart)
  5.         {
  6.                 ifstart=true;
  7.                 m_StartTime=nv->getFrameStamp()->getReferenceTime();
  8.                 m->group->setNodeMask(MAIN_CAMERA_MASK|MINI_CAMERA_MASK |MONITOR_CAMERA_MASK);

  9.         }
  10.         else
  11.         {
  12.                 m_CurrentTime=nv->getFrameStamp()->getReferenceTime();
  13.                 if (ifneedstop && m_CurrentTime-m_StartTime > 40)
  14.                 {
  15.                         ifneedstop = false;
  16.                         if (m->finder._am.valid())
  17.                         {
  18.                                 AnimtkViewerModelController::setModel(m->finder._am.get());
  19.                         }
  20.                         AnimtkViewerModelController& mc = AnimtkViewerModelController::instance();
  21.                         mc.stop();
  22.                         m->group->setNodeMask(0);
  23.                         m->group1->setNodeMask(MAIN_CAMERA_MASK|MINI_CAMERA_MASK |MONITOR_CAMERA_MASK);
  24.                 }
  25.                 if(ifneedstop1 && m_CurrentTime-m_StartTime > 50)
  26.                 {
  27.                         ifneedstop1=false;
  28.                         if (m->finder1._am.valid())
  29.                         {
  30.                                 AnimtkViewerModelController::setModel(m->finder1._am.get());
  31.                         }
  32.                         AnimtkViewerModelController& mc1 = AnimtkViewerModelController::instance();
  33.                         mc1.stop();

  34.                 }
  35.         }
  36.         traverse(node, nv);
  37. }
复制代码

该用户从未签到

 楼主| 发表于 2013-9-24 11:46:06 | 显示全部楼层
我只是在CALLBACK函数里面到了固定的时间的时候,想把已经读入的FBX显示出来而已,这样程序居然要卡5秒多,这怎么办啊

该用户从未签到

发表于 2013-9-25 14:14:22 | 显示全部楼层
您可以检查是否是读取fbx文件时花费了过长的时间,如果是的话,完全可以另存为osgb格式然后下次直接读取这种二进制数据

该用户从未签到

 楼主| 发表于 2013-9-26 17:07:07 | 显示全部楼层
array 发表于 2013-9-25 14:14
您可以检查是否是读取fbx文件时花费了过长的时间,如果是的话,完全可以另存为osgb格式然后下次直接读取这种 ...

好的,我试试。

该用户从未签到

 楼主| 发表于 2013-9-26 17:40:49 | 显示全部楼层
array 发表于 2013-9-25 14:14
您可以检查是否是读取fbx文件时花费了过长的时间,如果是的话,完全可以另存为osgb格式然后下次直接读取这种 ...

额。。我用MAX2012把MAX转成OSGB格式咋用OSG读不出来啊

该用户从未签到

发表于 2013-9-26 18:36:21 | 显示全部楼层
使用 自己使用的SDK writefile 一下 osgexp 导出的二代格式 要验证版本

该用户从未签到

发表于 2013-9-30 16:41:58 | 显示全部楼层
wangys8363 发表于 2013-9-26 17:40
额。。我用MAX2012把MAX转成OSGB格式咋用OSG读不出来啊

说明你osgexp的用的osg的版本要比你用的osg的版本高

该用户从未签到

发表于 2013-9-30 17:15:07 来自手机 | 显示全部楼层
貌似是需要显示的时候遍历需要时间~

该用户从未签到

 楼主| 发表于 2013-10-10 11:33:42 | 显示全部楼层
StackSnow 发表于 2013-9-30 16:41
说明你osgexp的用的osg的版本要比你用的osg的版本高

哦!这样啊

该用户从未签到

 楼主| 发表于 2013-10-10 11:34:21 | 显示全部楼层
abnerring 发表于 2013-9-30 17:15
貌似是需要显示的时候遍历需要时间~

我也这么想,所以看看能不能简化模型

该用户从未签到

 楼主| 发表于 2013-10-10 11:36:12 | 显示全部楼层
liuzhiyu123 发表于 2013-9-26 18:36
使用 自己使用的SDK writefile 一下 osgexp 导出的二代格式 要验证版本

哦,我试试

该用户从未签到

发表于 2015-1-13 20:45:18 | 显示全部楼层
最近在学些osg 和 fbx文件动画的播放显示,前辈能否帮忙发一份可用的代码给我,多谢,我的邮箱2397215846@qq.com。我目前的问题是,导入sdk提供的fbx文件能显示,但不能播放,或者能播放的文件,人物是畸形的,我在网上看到这个问题,不知道怎么解决
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

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

联系我们

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