【问题标题】:Loading Collada animation joints?加载 Collada 动画关节?
【发布时间】:2012-02-19 11:22:37
【问题描述】:

我在从 collada 文件的“动画”节点加载关节数据信息时遇到问题。

首先,我尝试从“library_visual_scenes”加载关节:

前两个关节是这样的:

<visual_scene id="" name="">
    <node name="joint1" id="joint1" sid="joint1" type="JOINT">
        <translate sid="translate">0.000000 -2.000000 0.000000</translate>
        <rotate sid="jointOrientZ">0 0 1 90.000000</rotate>
        <rotate sid="rotateZ">0 0 1 0.000000</rotate>
        <rotate sid="rotateY">0 1 0 0.000000</rotate>
        <rotate sid="rotateX">1 0 0 0.000000</rotate>
        <scale sid="scale">1.000000 1.000000 1.000000</scale>
        <extra>
        <node name="joint2" id="joint2" sid="joint2" type="JOINT">
            <translate sid="translate">2.000000 0.000000 0.000000</translate>
            <rotate sid="rotateZ">0 0 1 0.000000</rotate>
            <rotate sid="rotateY">0 1 0 0.000000</rotate>
            <rotate sid="rotateX">1 0 0 0.000000</rotate>
            <scale sid="scale">1.000000 1.000000 1.000000</scale>
            <extra>

进展顺利!

玛雅关节:

我的关节:

我想放一张照片,但作为新成员,我不允许。在这种情况下,您必须相信我,在我的引擎中,关节与在 Maya 中的位置相同。

然后,我尝试从“动画”节点加载关节。这就是问题所在,我找不到任何jointOrient。

<animation id="joint1-anim" name="joint1">
<animation>
    <source id="joint1-translate.Y-output">
        <float_array id="joint1-translate.Y-output-array" count="2">-2.000000 -2.000000</float_array>
<animation>
    <source id="joint1-rotateZ.ANGLE-output">
        <float_array id="joint1-rotateZ.ANGLE-output-array" count="2">0.000000 0.000000</float_array>

<animation id="joint2-anim" name="joint2">
<animation>
    <source id="joint2-translate.X-output">
        <float_array id="joint2-translate.X-output-array" count="2">2.000000 2.000000</float_array>

所以在加载关节后,它们看起来像这样:

这里有人可以帮忙吗?

谢谢。

(对不起,我的声望不超过10个,我不能放图片。)

【问题讨论】:

    标签: c++ collada


    【解决方案1】:

    我终于想出了答案,给那些可能感兴趣的人。

    collada 的 visual_scene 节点将为您提供关节的绑定姿势。 所以,我要在结构中加载visual_scene关节坐标:

    类似的东西:

    struct Pose
    {
        vec3    translation,
                orientation,
                rotation,
                scale;
    };
    
    Pose    bind_pose;
    

    然后我将创建另一个“Pose”结构的实例,使用一个以 Pose 作为参数的构造函数:

    Pose    anim_pose(bind_pose);
    

    所以构造后,visual_scene 中的bind_pose 和anim_pose 是一样的。

    然后我将遍历 library_animations 中的所有动画节点,找到频道并感兴趣:

    • 源数据,它告诉在哪里可以找到关节动画信息(“n”个浮点数代表“n”个动画:))
    • 和目标关节。

      <channel source="#joint1-translate.X" target="joint1/translate.X"></channel>
      

    这告诉我们(这就是我有点迷茫的地方)我们将用源值替换目标值。

    如果在通道节点中找到的源数据与目标数据相同,即。 :

    加载visual_scene数据后,bind_pose.translation.x的值为-3.0,并且

    <source id="joint1-translate.X-output">
        <float_array id="joint1-translate.X-output-array" count="1">-3.000000</float_array>
    

    我什么都不做。

    如果源数据与目标数据不同,我只是简单地将 anim_pose 中的值替换为好的值。

    这就是从 collada 正确加载动画关节所需要做的几乎所有事情。

    如果您在这里发现任何问题,请告诉我。

    希望这会有所帮助。

    【讨论】:

      猜你喜欢
      • 2011-05-11
      • 2018-05-15
      • 2015-08-30
      • 2011-06-13
      • 2011-04-02
      • 2016-12-01
      • 2012-01-30
      • 2011-02-18
      • 2013-02-02
      相关资源
      最近更新 更多