一般动画问题

时间:2010-11-05 10:13:38

标签: iphone animation opengl-es 3d

我不熟悉在图形环境中制作动画的想法,所以我想澄清一下正确的方法是什么。

(只是设置场景,虽然它与问题不是特别相关:我在iphone上使用opengl es)

如果我去看一位艺术家并告诉他们为我创建一个动态矮人的三维模型动画,他们不会动态,他们会如何给我数据? 他们会吗: a)创建一个3d骨骼模型,在路径列表中为骨骼路径设置动画以及时间戳和插值类型,然后简单地定义每个骨骼的三维模型?一个行走的矮人将是一个脊椎,手,手臂,腿,脚,脖子,头部,然后模型师为每个骨骼创建部分,并给我动画路径......?

或 b)建模者创建一个完整的模型,然后对其进行变形并以某种方式保存变形

!c)我假设没有人会实际存储相同对象的30个模型,然后只是呈现那些,除非它是一个非常低的多聚数模型?还是我错了? 3d动画的最佳对象格式是什么?

有关技术,机制等的任何其他建议/提示将不胜感激!

1 个答案:

答案 0 :(得分:6)

你基本上有正确的想法。有两种主要方法,骨架和非骨架,这两种方法都倾向于提供关键帧。

使用非骨骼动画时,您可能会提供十行动画,以便在行走时绘制,以及从一帧到下一帧所需的时间。所以它是2d像素精灵用来工作的精确三维模拟。您可以确定当前可见的帧或应用补间。如果您知道您位于顶点位于V1的帧和相同顶点位于V2的帧之间,则可以将其定位在V1和V2之间的中间位置。因此,您可以线性插值帧之间的所有顶点位置。这看起来比仅仅轻弹框架更平滑,但确实会使几何体扭曲一点,所以你仍然需要框架相当密集。

使用骨骼动画时,动画由骨架描述,骨架是一系列连接的骨骼。每个关键帧都是骨骼的特定方向。通常这是一个分层的东西,所以描述手臂你可以通过给出上臂相对于肩膀的方向开始,然后相对于上臂的下臂,相对于下臂的手,每个手指相对于这样做的好处是你可以在没有失真的情况下进行非常好的补间。中间框架是旋转的一半,沿着骨骼树向下传播。如果你坚持使用四元数来描述方向,那么用“旋转一半”进行插值相对容易,结果很好。

要将实际几何体放在骨骼上,每个顶点都与一个或多个骨骼相关联。您为每个骨骼赋予一个加权附件,例如下臂上的顶点可能100%附着在下臂骨上,朝向肘部的顶点可能80%附着在下臂骨上,20%附着在上臂上。您可以使用每个相关骨骼将顶点转换到的位置的加权和来获得实际的顶点位置。通过这种方式,您可以获得非常好的关节(尽管通常使用比我简化的解释更复杂的骨架)。

在iPhone术语中,在ES 1.x下你很可能不得不在CPU上进行非骨架补间,这不像你猜测的那样会出现性能问题,因为PowerVR MBX没有实际上将顶点缓冲区对象保留在视频RAM中。只要您以PowerVR友好格式累积缓冲区(对齐很重要,大多数情况下,按照规定的顺序交错位置/纹理坐标/法线/等也是有益的)那么提交给OpenGL的成本并不高得多而不是使用顶点缓冲对象。

Apple支持GL_OES_matrix_palette扩展以进行骨架式动画。对于每组顶点,您可以提供多个模型视图矩阵,并且对于每个顶点,您可以设置每个输入矩阵的权重。对矩阵数量有一些实现限制可能会阻止您将整个模型作为单个集合进行,但您可以根据需要进行细分。好处是您可以将所有顶点数据放入顶点缓冲区对象中,并将驱动程序和GPU保留在其中。

在支持ES 2.x的设备上,您可以使用顶点着色器更好地完成非骨架补间。这将允许您使用顶点缓冲区对象并计算出GPU上的位置。由于ES 2.x硬件支持将顶点缓冲区对象推送到完整的GPU管理,这是一个巨大的胜利。

使用ES 1.x管道通过GL_OES_matrix_palette进行骨架补间可能与使用可编程管道一样好,因为您已经能够使用顶点缓冲区对象。