gpt4 book ai didi

c++ - 加载 Collada 动画关节?

转载 作者:太空狗 更新时间:2023-10-29 21:27:29 28 4
gpt4 key购买 nike

我在从 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>

一切顺利!

玛雅关节:

http://www.hostingpicture.fr/upload/c3eaf96247e99b90f9087b2d37fb509f.PNG

我的关节:

我想放一张照片,但作为新成员,我不能。在这种情况下,您必须相信我,在我的引擎中,关节与在 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>

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

http://www.hostingpicture.fr/image.php?nom=upload/b26b6f8ed80f2bcdb69645d400ac023d.png

这里有人可以帮忙吗?

谢谢。

(对不起,我没有超过10个声誉,我不能放图片。)

最佳答案

对于那些可能感兴趣的人,我终于找到了答案。

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

类似的东西:

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

Pose bind_pose;

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

Pose    anim_pose(bind_pose);

所以在构建之后,来自 visual_scene 和 anim_pose 的 bind_pose 是相同的。

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

  • 源数据,告诉在哪里可以找到 union 动画信息(“n”个动画的“n”个 float :))
  • 和目标关节。

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

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

如果在 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 正确加载动画关节所需要做的全部工作。

如果你发现这里有什么问题,请告诉我。

希望这会有所帮助。

关于c++ - 加载 Collada 动画关节?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9016892/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com