【发布时间】:2014-08-25 07:41:46
【问题描述】:
我正在为低多边形 3D 图形旋转网格内的骨架骨骼。在顶点着色器上它是这样应用的。
gsl:
vec4 vert1 = (bone_matrix[index1]*vertex_in)*weight;
vec4 vert2 = (bone_matrix[index2]*vertex_in)*(1-weight);
gl_Position = vert1+vert2;
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
左边是形状如何开始,中间是上面的方程如何旋转它,右边是我的目标。中点加权0.5。它只会越弯曲越严重,在 180 度时它的直径为零。
- 我尝试在着色器上组装矩阵,这样我就可以将权重应用于旋转而不是生成的顶点。它看起来像右图一样完美,但它需要为每个顶点组装矩阵(昂贵)
- 我研究过四元数,但 glsl 本身并不支持它们(如果我错了,请纠正我),而且它们令人困惑。这是我需要做的吗?
- 我考虑过每个关节有三块骨头,并在每块骨头之间添加一个“膝盖骨”。这不会消除问题,但会减轻问题。
- 我正在考虑将顶点投影到旋转后与轴的原始距离。这会在 180 度时失败,但会(相对)便宜。
所以考虑到这些选项,或者我可能没有考虑过的其他选项,其他人如何避免这种挤压效应?
编辑:我已经让 SLERP 使用四元数工作,但我选择不使用它,因为 GLSL 本身并不支持它。我无法让几何 SLERP 像 Tom 所描述的那样工作。我让 NLERP 在前 90 度工作,所以我在每个关节之间添加了一个额外的“骨骼”。因此,为了将前臂弯曲 40 度,我将肘部和前臂分别弯曲 20 度。这以骨骼数量翻倍为代价消除了挤压效应,这不是一个理想的解决方案。
【问题讨论】:
-
我喜欢你的编辑。当我阅读这个问题时,我觉得我可以遵循它(模域特定行话)。有些人可能会认为这个问题太宽泛了,但在我看来,主要问题是这个主题的知识渊博的 Stack Overflow 读者太少了。 (如果有人想知道我为什么发表这个看似出乎意料的评论,那是因为我在meta 上发现了这个问题。)
-
感谢 meta 给予我的所有兴趣和支持。编辑后我故意将问题保持广泛,因为我对没有此问题且已在其他地方成功使用的任何替代解决方案感兴趣。
-
这里的社区非常棒,我们非常感谢这个网站的成员。
标签: matrix glsl skeletal-animation