4

我正在为自己构建一个 API 来执行 2D 骨骼动画。

我有一个骨骼类和一个骨架类。

Skeleton 创建根骨骼,然后通过 Skeleton 的 add 方法通过提供父骨骼添加后续骨骼。

我现在要做的是添加动画和帧。

我在想的是一个可以加载和插入动画的类。所以它将是一个加载动画的对象。然后,它会在每一帧接收一个骨架并相应地修改骨架。

这是一个好的设计吗?动画应该采用骨架,还是骨架应该采用动画并将其应用于自身?

4

3 回答 3

7

最好创建一个使用骨架而不是相反的动画。这是因为,从逻辑上讲,对象 Skeleton 不需要 Animation 才能生存,但 Animation 强烈需要 Skeleton。所以你可以在动画本身中耦合这些元素。不要把太多的逻辑放在对象中,尽量把它放在需要的地方。

于 2011-05-23T15:48:18.317 回答
1

大概每个骨骼都有一个 2d 位置/角度,而动画是帧的集合,其中每一帧都是骨骼标识符和位置/角度的集合?

然后你可能会考虑类似

public class Skeleton
{
    public List<Bone> Bones {get;set;}
    public void Animate(Animation animation)
    {
        foreach(Bone bone in Bones)
        {
           bone.Displace(animation.Displacements.FirstOrDefault(o=>o.BoneId == bone.BoneID));
        }
    }
}
于 2011-05-23T15:50:44.167 回答
0

我将创建一个Animation包含std::vector<Skeleton>数据成员的类,您可以使用该数据成员来操作Skeleton每个帧上的单个对象或从关键帧插入向量中的多个Skeleton对象。然后,当您“播放”动画时,您只需遍历向量,调用每个Skeleton对象,并将其传递给将在屏幕上显示结果的其他函数或类(或执行其他任何Skeleton可能有用的操作) ,例如扭曲网格等)

拥有一个动画对象将使操作动画的帧变得更加容易,允许您删除/替换帧等。否则,如果您尝试将所有这些功能堆积到一个骨架对象中,那么您会发现有尝试与动画序列分开操作骨架的各个方面时会产生很多包袱(即假设您需要为一段帧更改骨架的层次结构等?...如果有的话,那将非常容易每帧都有一个骨架,但如果你有一个整体的骨架对象,则不是)。

于 2011-05-23T15:50:21.013 回答