【问题标题】:Is this a good OO design?这是一个好的OO设计吗?
【发布时间】:2014-09-01 12:56:14
【问题描述】:

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

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

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

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

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

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

【问题讨论】:

    标签: oop architecture skeletal-animation


    【解决方案1】:

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

    【讨论】:

    • 我明白了,所以我应该基于依赖关系。谢谢!
    • 好吧,我认为最好的实现对象之间的耦合可能更少。所以你应该尝试在必要的地方而不是到处链接它们。
    【解决方案2】:

    大概每个骨骼都有一个 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));
            }
        }
    }
    

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-02-10
        • 1970-01-01
        • 2011-09-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-01-10
        • 2010-09-24
        相关资源
        最近更新 更多