问题标签 [skeletal-animation]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
2 回答
13427 浏览

opengl - OpenGL动画

如果我有一个人体 3d 模型,我想为行走设置动画,那么实现这一目标的最佳方法是什么?以下是我认为正在实施的可能方式:

  • 创建几个腿在不同位置的模型,然后在这些模型之间进行插值。
  • 将模型加载到 openGL 中,并以某种方式确定哪些顶点对应于腿并执行适当的转换。
  • 实现骨架或骨架(类似于:blender animation wiki)。
0 投票
2 回答
5876 浏览

opengl - OpenGL骨架动画

我正在尝试将动画添加到我的程序中。

我在 Blender 中创建了带有骨骼动画的人体模型,我可以跳过关键帧来查看模型行走。

现在我已经将模型导出为 XML (Ogre3D) 格式,在这个 XML 文件中,我可以看到在特定时间分配给每个骨骼的旋转、平移和缩放(t=0.00000,t=0.00040,...等.)

我所做的是找到每个骨骼分配了哪些顶点。现在我假设我需要做的就是将为骨骼定义的变换应用于这些顶点中的每一个。这是正确的方法吗?

在我的 OpenGL draw() 函数中(粗略的伪代码):

0 投票
2 回答
3296 浏览

c++ - OpenGL ES 是否适合执行骨骼动画?

我必须为移动平台启动一个 3D 项目。首先,我想概述一下主要目标——骨骼动画。至于解决方案,我正在考虑 OpenGL ES 和 C++。所以问题是:

  1. OpenGL ES 是否足够强大以处理骨骼动画(包括那些蒙皮着色器)
  2. OpenGL ES 是否在移动平台上得到广泛支持,最著名的有哪些?(例如,是否支持 iPad?)
  3. 无论如何这可能吗,我的意思是我有足够的计算能力吗?
  4. 是否值得使用 XNA 数学库,因为它的 SIMD 优化(虽然我真的不确定移动平台是否支持 SIMD,但谁知道......)。
  5. 用 C++ 来做这件事好吗?如果是,那么我应该选择哪个编译器进行开发和测试?此外,我不知道移动平台使用了哪些编译器?

你可能已经明白了——我还没有为移动平台编程过。因此,欢迎提出一些一般性建议。

0 投票
3 回答
258 浏览

oop - 这是一个好的OO设计吗?

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

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

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

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

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

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

0 投票
1 回答
1122 浏览

opengl-es - 在 OpenGL ES 中优化骨骼动画的顶点

所以我正在使用 2D 骨骼动画系统。

有 X 个骨骼,每个骨骼至少有 1 个部分(一个四边形,两个三角形)。平均而言,我大概有 20 块骨头和 30 个部分。大多数骨骼都依赖于父级,骨骼将在每一帧中移动。每个动画总共最多 1000 帧,我使用了大约 50 个动画。每次在内存中总共加载大约 50,000 帧。骨骼实例之间的零件不同。

我采用的第一种方法是计算每个骨骼的位置/旋转,并为每个部分构建一个顶点数组,其中包含以下内容:

并将其传递给每一帧的 glDrawElements。

看起来不错,涵盖了我需要的所有场景,不使用太多内存,但表现得像狗一样。在 iPod 4 上,渲染 10 个这样的骨骼可能会达到 15fps。

我发现大部分性能都被每帧复制这么多顶点数据消耗掉了。我决定走另一个极端,并“预先计算”动画,在开始时为每个角色建立一个顶点缓冲区,其中包含单个角色中每一帧、每一部分的 xyuv 坐标。然后,我计算应该在特定时间使用的帧的索引,并计算一个 delta 值,该值被传递到用于在当前帧和下一帧 XY 位置之间进行插值的着色器。

每帧的顶点看起来像这样

顶点着色器如下所示:

现在,性能很棒,屏幕上有 10 个,它以 50fps 的速度舒适地坐着。但是现在,它使用了一公吨的内存。我已经通过在 xyuv 上失去一些精度来优化它,现在是 ushorts。

还有一个问题是骨骼依赖性丢失了。如果有两个骨骼,一个父子,一个子子在0s和2s有一个关键帧,父子在0s,0.5s,1.5s,2s有一个关键帧,那么子子在0.5s和2s之间不会改变1.5s 应该的。

我想出了一个解决这个骨骼问题的解决方案——通过强迫孩子在与父母相同的点上拥有关键帧。但这使用更多的内存,并且基本上杀死了骨骼层次结构的点。

这就是我现在的位置。我试图在性能和内存使用之间找到平衡。我知道这里有很多冗余信息(特定部分的所有帧的 UV 坐标都是相同的,所以重复了大约 30 次)。并且必须为每组零件创建一个新的缓冲区(具有唯一的 XYUV 坐标——位置会发生变化,因为不同的零件尺寸不同)

现在,我将尝试为每个角色设置一个顶点数组,其中包含所有部分的 xyuv,并计算每个部分的矩阵,并在着色器中重新定位它们。我知道这会起作用,但我担心性能不会比我刚开始时为每一帧上传 XYUV 更好。

有没有更好的方法来做到这一点而不会失去我所获得的性能?

有什么疯狂的想法我可以尝试吗?

0 投票
3 回答
4996 浏览

three.js - 带有骨骼动画(搅拌机导出)的模型在三个.js 中动画不正确

我目前正在三个.js 中进行骨骼动画测试。我有一个简单的模型,可以在搅拌机中很好地制作动画。基本上它由三个堆叠的弯曲立方体组成。

当我使用 Blender V2.64 的 Blender 导出插件将 Blender 文件导出到 Three.js 时,webGl 上下文中的动画看起来不同,就好像皮肤权重错误一样。

WebGL 演示: http ://rainbowrangers.de/threejs/animation_test01/

搅拌机文件: http ://rainbowrangers.de/threejs/animation_test01/model/animation_test01.blend

我该怎么做才能在 three.js 中得到正确的结果?

0 投票
1 回答
4495 浏览

directx - Directx 11 骨骼动画

我迷失了骨骼动画。我读过一些关于这个的东西,但它们仍然是我不明白的一件事。这是我的结论。我看到了 3 种使用骨骼为网格设置动画的方法:

  • 我有一个 Mesh 类,其中包含顶点、顶点缓冲区、索引缓冲区和纹理着色器以及变换矩阵。我可以为每个骨骼使用类,增加重量,我可以很容易地为模型制作动画。但这意味着使用过多的内存,因为某些存储的东西有时会被使用,而它们只能使用一次。

  • 使用顶点着色器。在输入顶点参数中添加权重和骨骼索引,并使用矩阵数组作为全局变量,因此在着色器中我只需要使用骨骼的矩阵即可。这个解决方案对我来说似乎更有效,但我记得在 directx 11 教程(来自 Rastertek)他说 HLSL 应该很快,因为它使用了很多时间,我认为这太重了。无论如何,这是我会尝试的解决方案,至少要知道它是否有效。

  • 对每个骨骼使用矩阵和逆矩阵。就阅读而言,这是采取的方式。但这是我不明白的方式。为什么在这里使用矩阵逆,以及矩阵如何“链接”到顶点。我的意思是,如果我移动右手骨骼的矩阵,代码中只使用右手顶点是什么意思?

所以我的问题是:

  • 第二种方法可行吗?或者对于带有一些网格和动画的 GPU 来说太多了?
  • 有人可以解释矩阵链接到顶点的方式以及为什么使用矩阵逆吗?或者给我链接一些关于这个的东西。

我希望你能理解我,因为我不确定我解释得好不好。请原谅我的英语,我已经尽力了。提前致谢。

0 投票
1 回答
2299 浏览

c++ - 使用 ASSIMP 和 GLSL 的骨骼动画:骨骼统一数组大小

我正在开发一个 ASSIMP骨骼动画加载器和渲染器,现在所有数据都在其当前时间范围内正确加载和插值。但是,仍然有一个部分不能正常工作,那就是顶点着色器阶段。

通过VBO,我传入两个vec4s,其中包含每个顶点的骨骼 ID 和权重(每个顶点最多4 个骨骼/权重),并且顶点着色器具有100 个骨骼变换的矩阵数组(每帧预先计算) 通过骨骼 ID 进行索引。

但是,骨骼制服似乎不包含正确的转换。出于调试目的,我使用权重值和骨骼 ID 值为模型着色,它们包含颜色(因此包含有效值)。然而,当我通过骨骼变换来变换我的顶点并用结果为模型着色时,整个模型都是黑色的,这意味着变换矩阵都是0.0. 所以他们没有正确初始化。

我认为问题在于将矩阵传递给统一数组,或者可能是允许的最大统一大小(我还尝试将统一矩阵的数量设置为 32(当前模型上的骨骼数量)但没有效果)?

在将信息传递给着色器之前,转换矩阵确实是有效矩阵(不是恒等/空矩阵),因此故障可能出在 GLSL 着色器或制服的传递中。

以下代码来自顶点着色器:

以下代码片段将矩阵数据传递给 GLSL 着色器:

还有获取骨骼数组所有统一位置的代码:

0 投票
3 回答
2059 浏览

matrix - 将权重应用于矩阵和顶点(骨骼旋转)

我正在为低多边形 3D 图形旋转网格内的骨架骨骼。在顶点着色器上它是这样应用的。
gsl:

bone_matrix[index1]是一个骨骼的矩阵,是另一个骨骼bone_matrix[index2]的矩阵。 weight指定vertex_in这些骨骼的成员资格。问题是重量越接近 0.5,当应用旋转时,肘部的直径收缩得越多。我已经用大约 10,000 个顶点圆柱形状(具有权重梯度)对其进行了测试。结果看起来就像弯曲花园软管。

我从这些来源得到了我的加权方法。它实际上是我能找到的唯一方法:
http ://www.opengl.org/wiki/Skeletal_Animation
http://ogldev.atspace.co.uk/www/tutorial38/tutorial38.html
http://blenderecia.orgfree.com /blender/skinning_proposal.pdf

initial_ugly_good

左边是形状如何开始,中间是上面的方程如何旋转它,右边是我的目标。中间点是加权的0.5。它只会变得更糟,它越弯曲,在 180 度时它的直径为零。

  • 我尝试在着色器上组装矩阵,以便我可以将权重应用于旋转而不是生成的顶点。它看起来很完美,就像右图中的那个,但它需要为每个顶点组装矩阵(昂贵)
  • 我研究过四元数,但 glsl 本身并不支持它们(如果我错了,请纠正我)而且它们令人困惑。那是我需要做的吗?
  • 我考虑过每个关节有三块骨头,并在每块骨头之间添加一个“膝盖骨”。这不会消除问题,但会减轻它。
  • 我正在考虑在旋转后将顶点投影到与轴的原始距离。这会在 180 度时失败,但会(相对)便宜。

因此,考虑到这些选项,或者我可能没有考虑过的其他选项,其他人如何避免这种挤压效应?

编辑: 我已经让 SLERP 使用四元数工作,但我选择不使用它,因为 GLSL 本身并不支持它。我无法让几何 SLERP 像 Tom 所描述的那样工作。我让 NLERP 在前 90 度工作,所以我在每个关节之间添加了一个额外的“骨骼”。因此,为了将前臂弯曲 40 度,我将肘部和前臂分别弯曲 20 度。这以骨骼数量加倍为代价消除了挤压效应,这不是一个理想的解决方案。

0 投票
1 回答
1176 浏览

opengl - 有育儿问题的骨骼动画

tl;dr:为模型设置动画时,每个关节都正确移动,但不相对于其父关节。

在此处输入图像描述

我正在使用 Lua 中自定义构建的 IQE 加载器和渲染器开发骨骼动画系统。在这一点上几乎所有东西都在工作,除了骨骼在动画时似乎脱节。每个关节都可以正确平移、旋转和缩放,但没有考虑其父节点的位置,从而产生了一些可怕的问题。

在参考 IQM 规范和演示时,我无法终生找出问题所在。我的 Lua 代码(据我所知)与参考 C++ 相同。

计算基础联合矩阵:

计算动画帧矩阵

完整的代码在这里供进一步检查。相关代码在 /libs/iqe.lua 中,靠近函数 IQE:buffer() 和 IQE:send_frame() 的底部。此代码在 LOVE 游戏框架的自定义版本上运行,并包含一个 Windows 二进制文件(和批处理文件)。

最后说明:我们的矩阵代码已针对其他实现和多项测试进行了验证。