我正在为低多边形 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 度。这以骨骼数量加倍为代价消除了挤压效应,这不是一个理想的解决方案。