使用着色器为网格设置动画

Posted

技术标签:

【中文标题】使用着色器为网格设置动画【英文标题】:Using a Shader to animate a mesh 【发布时间】:2013-12-01 02:36:13 【问题描述】:

我一直在研究我对 OpenGL 的低级理解,我终于学会了如何为 3D 模型制作动画。我看不到任何地方告诉我如何做骨骼动画。大多数事情都使用某种 3D 引擎,只说“加载骨架”或“应用动画”,而不是如何加载骨架,或者如何实际移动顶点。

我假设每个骨骼都有一个 4x4 的平移/旋转/缩放矩阵,用于连接的顶点,这样当骨骼移动时,连接的顶点也会移动相同的量。

对于骨骼动画,我猜测您会将骨骼传递给着色器,这样在顶点着色器中我会在当前顶点进入片段着色器之前移动它。如果我有一个关键帧动画,我将当前骨骼和新骨骼连同帧之间的当前时间一起发送到着色器,并根据关键帧之间的时间插入骨骼之间的点。

这是为网格设置动画的正确方法吗?或者有没有更好的方法

【问题讨论】:

几乎是正确的,但是每个顶点通常会受到多个骨骼的一定程度的影响——比如每个骨骼的乘数,乘数之和等于 1。更多的是关于艺术家如何制作它。此外,最好将骨骼限制为仅旋转(无平移/缩放)并使用四元数进行平滑插值(但同样取决于实际数据)。 有道理,周围的顶点说肘部会受到上臂和下臂骨骼的影响。我的理解是,这与“权重”或特定骨骼对顶点的影响程度的某种修饰符有关。显然,只有在动画需要像模型的手臂这样的东西才能生长的特殊情况下,才需要平移和缩放。仍然需要完全学习四元数我已经研究了不到一周的时间。 【参考方案1】:

嗯 - 动画的方法取决于格式,以及写入其中的数据。有些格式以向量形式提供给您,有些则使用矩阵。我得承认我来这个网站问了一个类似的问题,但我已经指定了格式(使用 *.x 文件,你可以查看topic),我得到了答案。

您对主题的看法是正确的。如果您需要示例实现,可以在 OpenGL wiki 上找到。

【讨论】:

Ok 这很有道理,就像纹理一样,格式决定了存储的数据。我还没有格式,因为我不确定我需要从搅拌机中导出什么。 查看我在帖子中提供的链接,它们可以帮助您。关于格式:没有太多可以存储骨骼动画的开放格式。这就是我使用 *.x 格式的原因。 Blender 肯定可以导出到它。

以上是关于使用着色器为网格设置动画的主要内容,如果未能解决你的问题,请参考以下文章

尝试使用自定义渲染器为 JTable 的特定行着色,而不是我的所有行都着色

初识OpenGL 编译着色器

[译]网格着色器渲染数亿面片的模型

初识OpenGL 编译着色器

使用顶点着色器确定线的方向

unity 定点着色器输入值