计算机图形学:在动画树中继承旋转的策略
Computer Graphics: Strategy for inheriting rotations in an animation tree
当动画被组织成树时,子形状从父形状继承旋转和平移,是否有继承旋转的通用策略?
考虑一个可以围绕肩膀、肘部和手腕旋转的手臂。手臂的每个部分都从其上方的部分继承了一些旋转,并且每个部分也可能有一些独立的旋转。好像判断手的位置的步骤顺序是这样的:
1) 将手放在原点,并围绕手腕执行仅适用于手的任何旋转。
2) 将手腕放置在前臂上,将肘部定位在原点,然后围绕肘部执行仅适用于前臂的任何旋转。
3) 将生成的手放置在肘部连接到上臂的位置,将肩部定位在原点,然后围绕肩部执行仅适用于上臂的任何旋转。
4) 将生成的手相对于肩膀的实际位置进行平移。
有没有更高效的策略?如果没有,在树中实现它的最佳方法是什么?
这也称为场景图,有许多 API 可以简单地实现此范例。
通常,您可以在所述图形的变换节点处插入网格(甚至对其进行动画处理)。
在设计一个时,您不必达到那种复杂程度(例如,您可能认为没有理由以编程方式移动手腕、手或手指,因此您可以简单地将它们附加到前臂组(或者使用动画网格并为手指和手的移动设置单独的动画,可以根据某种形式的事件触发。
这个策略实际上非常有效,因为它允许您以统一和分组的方式对大量不同的形状执行极其复杂的操作。
将游戏放在一起时,通常会创建一个角色网格并包含所有相关动画,而这些动画又可以被视为场景图中的单个对象(内部没有较小的对象)。
这正是经典的 OpenGL 固定管线矩阵堆栈所能达到的效果。渲染将按以下方式进行:
- 肩部推矩阵;
- 画肩;
- 呼吁画肘;
- 肩部弹出矩阵。
肘部将推动其矩阵、绘制、调用以绘制其子项、弹出其矩阵和 return。等等,沿着你的局部空间树。
这有效地在调用堆栈上重现了您的树。因此,如果您愿意,可以通过从根推送身份转换并让每个节点根据它接收到的转换进行绘制、添加其转换并传递给子节点来做同样的事情。
简而言之,答案是:不,没有比绕着构成变换的树走动更有效的组合变换的方法了。
当动画被组织成树时,子形状从父形状继承旋转和平移,是否有继承旋转的通用策略?
考虑一个可以围绕肩膀、肘部和手腕旋转的手臂。手臂的每个部分都从其上方的部分继承了一些旋转,并且每个部分也可能有一些独立的旋转。好像判断手的位置的步骤顺序是这样的:
1) 将手放在原点,并围绕手腕执行仅适用于手的任何旋转。
2) 将手腕放置在前臂上,将肘部定位在原点,然后围绕肘部执行仅适用于前臂的任何旋转。
3) 将生成的手放置在肘部连接到上臂的位置,将肩部定位在原点,然后围绕肩部执行仅适用于上臂的任何旋转。
4) 将生成的手相对于肩膀的实际位置进行平移。
有没有更高效的策略?如果没有,在树中实现它的最佳方法是什么?
这也称为场景图,有许多 API 可以简单地实现此范例。
通常,您可以在所述图形的变换节点处插入网格(甚至对其进行动画处理)。
在设计一个时,您不必达到那种复杂程度(例如,您可能认为没有理由以编程方式移动手腕、手或手指,因此您可以简单地将它们附加到前臂组(或者使用动画网格并为手指和手的移动设置单独的动画,可以根据某种形式的事件触发。
这个策略实际上非常有效,因为它允许您以统一和分组的方式对大量不同的形状执行极其复杂的操作。
将游戏放在一起时,通常会创建一个角色网格并包含所有相关动画,而这些动画又可以被视为场景图中的单个对象(内部没有较小的对象)。
这正是经典的 OpenGL 固定管线矩阵堆栈所能达到的效果。渲染将按以下方式进行:
- 肩部推矩阵;
- 画肩;
- 呼吁画肘;
- 肩部弹出矩阵。
肘部将推动其矩阵、绘制、调用以绘制其子项、弹出其矩阵和 return。等等,沿着你的局部空间树。
这有效地在调用堆栈上重现了您的树。因此,如果您愿意,可以通过从根推送身份转换并让每个节点根据它接收到的转换进行绘制、添加其转换并传递给子节点来做同样的事情。
简而言之,答案是:不,没有比绕着构成变换的树走动更有效的组合变换的方法了。