查看: 2351|回复: 13

OSGExp导出的Sequence动画的问题?(此区比较活跃)

[复制链接]

该用户从未签到

发表于 2010-8-12 10:56:26 | 显示全部楼层 |阅读模式
在3DS MAX中做好的 纹理坐标变换动画 用OSGExp导出成 .osg 文件(此文件中含有 Sequence 节点),那么 如何写个程序来控制他的 起停和加速 等状态呢??
是否可以这样,先加载这个 .osg文件,再用 FindNodeVisitor 找到 此Sequence后,把其传给 预先定义好的一个 osg::Sequence 节点 ,接着在进行 动画事件控制代码!!

此区比较活跃,望大家给出更好的办法!!

该用户从未签到

发表于 2010-8-12 11:22:05 | 显示全部楼层
先加载这个 .osg文件,再用 FindNodeVisitor 找到 此Sequence后,把其传给 预先定义好的一个 osg::Sequence 节点 ,接着在进行 动画事件控制代码
找到此Sequence后,就可以对它进行控制了,何必再新建别的Sequence呢

该用户从未签到

 楼主| 发表于 2010-8-12 14:25:46 | 显示全部楼层
出错了!

在最后一步,添加 动画控制事件 “viewer->addEventHandler(new SequenceEventHandler(seq01.getFirst()));”时 编译出错,如下 错误  “error C2664: “SequenceEventHandler::SequenceEventHandler(osg::ref_ptr<T>)”: 不能将参数 1 从“osg::Node *”转换为“osg::ref_ptr<T>”         ”

这,问题出在哪儿呢??

该用户从未签到

发表于 2010-8-12 14:49:18 | 显示全部楼层
我不知道您的SequenceEventHandler是如何实现的,因此也就无法判断什么,不过我不建议把ref_ptr作为传入参数

该用户从未签到

 楼主| 发表于 2010-8-12 15:01:27 | 显示全部楼层
谢谢!
那我把“ref_ptr”去掉,再试试!

该用户从未签到

 楼主| 发表于 2010-8-12 15:13:03 | 显示全部楼层
本帖最后由 Phoenix 于 2010-8-12 16:22 编辑

麻烦你给看一下!还是报这个错误!

代码如下:
class SequenceEventHandler : public osgGA::GUIEventHandler
{
public:
SequenceEventHandler(osg::Sequence* seq)
{
  _seq = seq;
}
virtual bool handle(const osgGA::GUIEventAdapter& ea, osgGA::GUIActionAdapter&)
{
  osg::Sequence::SequenceMode mode = _seq->getMode();
  if (ea.getEventType() == osgGA::GUIEventAdapter::KEYDOWN)
  {
   switch (ea.getKey())
   {
   case 'p':
    {
     mode = osg::SequenceAUSE ;
     _seq->setMode(mode);
    }
    break ;
   case 's':
    {
     mode = osg::Sequence::START ;
     _seq->setMode(mode);
    }
    break ;
default:
    break;
            }
        }
        return false;
    }
private:
    osg::ref_ptr<osg::Sequence> _seq;
};

int main()
{
osg::ref_ptr<osgViewer::Viewer> viewer = new osgViewer::Viewer();
osg::ref_ptr<osg::Group> root = new osg::Group();
osg::ref_ptr<osg::Node> node = osgDB::readNodeFile("_T_An24.osg");
FindNodeVisitor seq("OSG_Sequence01");
node->accept(seq);

root->addChild(seq.getFirst());
viewer->addEventHandler(new SequenceEventHandler(seq.getFirst()));
osgUtil::Optimizer optimizer;
optimizer.optimize(root.get());
viewer->setSceneData(root.get());
viewer->realize();
viewer->run();
   return 0;
}

该用户从未签到

发表于 2010-8-12 16:32:28 | 显示全部楼层
如果seq.getFirst()的返回值为osg::Sequence*的话,那么您的代码应当没有太大问题,否则您需要作动态转换

该用户从未签到

 楼主| 发表于 2010-8-12 16:48:30 | 显示全部楼层
按理说 在 “P_T_An24.osg” 找到的的 “OSG_Sequence01”  应该是 osg::Sequence*   

.OSG文件的内容里有这段描述:
“MatrixTransform {
  DataVariance STATIC
  name "场景根"
  nodeMask 0xff
  cullingActive TRUE
  StateSet {
    UniqueID StateSet_0
    DataVariance STATIC
    rendering_hint DEFAULT_BIN
    renderBinMode INHERIT
    GL_LIGHTING ON
  }
  referenceFrame RELATIVE
  Matrix {
    1 0 0 0
    0 1 0 0
    0 0 1 0
    0 0 0 1
  }
  num_children 1
  Sequence {
    DataVariance STATIC
    name "OSG_Sequence01"

    nodeMask 0xff
    cullingActive TRUE
    frameTime {
      0.04
      0.04
    }
    interval LOOP 0 -1
    duration 1 -1
    mode START
    num_children 60
    Group {
      DataVariance STATIC
      name "Box02"
      nodeMask 0xff
      cullingActive TRUE
      num_children 1
      Geode {
        UniqueID Geode_1
        DataVariance STATIC
        name "Box02-GEODE"
        nodeMask 0xff
        cullingActive TRUE
        num_drawables 1
        Geometry {
          DataVariance DYNAMIC
          name "P_T_02"
          StateSet {
            UniqueID StateSet_2
            DataVariance STATIC
            rendering_hint DEFAULT_BIN
            renderBinMode INHERIT
            GL_CULL_FACE ON
            GL_LIGHTING ON
            0xba1 ON
            Material {
              DataVariance STATIC
              ColorMode OFF
              ambientColor 0.588 0.588 0.588 1
              diffuseColor 1 1 1 1
              specularColor 0 0 0 1
              emissionColor 0 0 0 1
              shininess 0
            }
            textureUnit 0 {
              GL_TEXTURE_2D ON
              Texture2D {
                DataVariance STATIC
                file "images\road.tga"
                wrap_s CLAMP_TO_EDGE
                wrap_t REPEAT
                wrap_r CLAMP_TO_EDGE
                min_filter LINEAR_MIPMAP_LINEAR
                mag_filter LINEAR
                maxAnisotropy 1
                borderColor 0 0 0 0
                borderWidth 0
                useHardwareMipMapGeneration TRUE
                unRefImageDataAfterApply FALSE
                internalFormatMode USE_IMAGE_DATA_FORMAT
                resizeNonPowerOfTwo TRUE
              }
            }
          } ”


可是经过这几次的尝试 总是抱这样的错——“  error C2440: “=”: 无法从“osg::Node *”转换为“osg::Sequence *”        ” !!

该用户从未签到

 楼主| 发表于 2010-8-12 16:51:30 | 显示全部楼层
本帖最后由 Phoenix 于 2010-8-12 16:53 编辑

可是经过这几次的尝试 总是抱这样的错——   error C2440: “=”: 无法从“osg::Node *”转换为“osg::Sequence *”  

估计是 返回节点类型不符!!

那样的话,请问 这个“动态转换” 如何处理呢??

该用户从未签到

发表于 2010-8-12 17:15:06 | 显示全部楼层
dynamic_cast<osg::Sequence*>(你的 node)

该用户从未签到

 楼主| 发表于 2010-8-12 18:05:45 | 显示全部楼层
还是 出同样的错误!!

是我的 代码写的不对吗??

麻烦 帮我看看!!!


        osg::Sequence* sq = new osg::Sequence;
        sq = dynamic_cast<osg::Sequence*>(seq.getFirst());
        root->addChild(sq);

        viewer->addEventHandler(new SequenceEventHandler(seq.getFirst()));

       
只要注释掉 红字这行 就能 编译通过,加上他 还是报 同样的错误 ——   error C2664: “SequenceEventHandler::SequenceEventHandler(osg::Sequence *)”: 不能将参数 1 从“osg::Node *”转换为“osg::Sequence *”       

这是为什么呢??

该用户从未签到

发表于 2010-8-12 18:37:45 | 显示全部楼层
FindNodeVisitor得到的seq.getFirst()是 osg::Node*,而不是osg::Sequence *.所以需要你动态转换成osg:sequence* 才能进行sequence的操作。也就是说,在你的代码中,“viewer->addEventHandler(new SequenceEventHandler(seq.getFirst()));”你还是把一个node*传递给了SequenceEventHandler。解决办法就是SequenceEventHandler(sq)。

还有你不需要 osg::Sequence* sq = new osg::Sequence;因为像array说的
“找到此Sequence后,就可以对它进行控制了,何必再新建别的Sequence呢”
所以,你只需要一个sequence类型的指针指向你找到的sequence  node就好了,osg::Sequence* sq = dynamic_cast<osg::Sequence*>(seq.getFirst());就好了。

该用户从未签到

发表于 2010-8-13 08:18:15 | 显示全部楼层

  1. osg::Sequence* sq = new osg::Sequence;
  2. sq = dynamic_cast<osg::Sequence*>(seq.getFirst());
  3. root->addChild(sq);
  4. viewer->addEventHandler(new SequenceEventHandler(seq.getFirst()));
复制代码
这里太显然应该是:
  1. viewer->addEventHandler(new SequenceEventHandler(sq));
复制代码
呵呵,我想您是因为疲劳而犯下了低级错误吧~~

此外:

  1. osg::Sequence* sq = new osg::Sequence;
  2. sq = dynamic_cast<osg::Sequence*>(seq.getFirst());
复制代码
这种重复赋值也让人不能理解~~

该用户从未签到

 楼主| 发表于 2010-8-13 09:20:16 | 显示全部楼层
多谢二位的解答!!

呵呵 !!

那时候,是有些烦躁了!!

谢谢!!

哎!!

这得静下心来才行!!
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

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

联系我们

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