计算机图形:在动画树中继承旋转的策略

时间:2015-02-10 03:54:16

标签: opengl graphics

当动画组织为树时,子形状继承父形状的旋转和平移,是否存在继承旋转的常用策略?

考虑一个可以围绕肩膀,肘部和手腕旋转的手臂。臂的每个部分从其上方的部分继承一些旋转,并且每个部分也可以具有一些独立的旋转。似乎确定手位置的步骤顺序如下:

1)将手定位在手腕位于原点的位置,然后围绕仅适用于手部的手腕进行任何旋转。

2)将所得到的手定位,好像手腕连接到前臂,将肘部放在原点,然后围绕仅适用于前臂的肘部进行任何旋转。

3)将所得到的手定位,好像肘部连接到上臂,将肩部定位在原点,并围绕肩部进行任何仅适用于上臂的旋转。

4)将得到的手相对于肩膀的实际位置进行平移。

是否有更有效的策略?如果没有,在树中实现这个的最佳方法是什么?

2 个答案:

答案 0 :(得分:2)

这也称为场景图,有很多API可以简单地实现这个范例。

通常,您可以在所述图形中的变换节点处插入网格(甚至将其设置为动画)。

在设计一个时,您不必达到复杂程度(例如,您可能认为没有理由以编程方式移动手腕,手或手指,因此您可以简单地将它们连接到前臂组(或者可选地)使用动画网格并为手指和手移动设置单独的动画,可以根据某种形式的事件触发。

这种策略实际上非常有效,因为它允许您以统一和分组的方式对各种形状执行极其复杂的操作。

当组合游戏时,通常会创建一个角色网格并包含所有相关的动画,而这些动画又可以被视为场景图中的单个对象(内部没有较小的对象)。

答案 1 :(得分:1)

这正是经典的OpenGL固定管道矩阵堆栈所能实现的。渲染将按以下方式进行:

  • 推肩的肩膀;
  • 画肩;
  • 打电话画肘;
  • 肩膀的pop矩阵。

肘部将推动其矩阵,绘制,调用以绘制其子项,弹出其矩阵并返回。等等,沿着你的当地空间树。

有效地在调用堆栈上重现您的树。因此,如果您愿意,您可以通过从根中推送身份转换并让每个节点根据其接收的转换进行绘制,添加其转换并传递给子节点来执行相同的操作。

所以答案是,简而言之:不,没有比组成转换的树更有效的方式来组成转换。