Matrix 在双四元数之间插值时出现严重伪影
我在实现双四元数蒙皮时遇到问题。我还在学习这个主题,所以现在我正在从骨骼矩阵转换到双四元数CPU端,然后再转换回着色器中的矩阵 转换显然对单骨骼有效,但如果我尝试在双四元数之间线性混合,我会得到以下工件: 我不知道是什么原因造成的。也许这和我如何规范化对偶四元数有关,也许这和我如何将对偶四元数转换成矩阵有关。我试图搜索实际的双四元数代码,但我发现的只是一堆难以理解的数学定义 我包括了一些着色器代码,因为我很确定这就是问题所在。希望精通四元数数学的人能看穿它 混合双四元数。Boneweight2=(1.0-boneweight1),因此它们的总和总是为1Matrix 在双四元数之间插值时出现严重伪影,matrix,quaternions,glsles,gml,Matrix,Quaternions,Glsles,Gml,我在实现双四元数蒙皮时遇到问题。我还在学习这个主题,所以现在我正在从骨骼矩阵转换到双四元数CPU端,然后再转换回着色器中的矩阵 转换显然对单骨骼有效,但如果我尝试在双四元数之间线性混合,我会得到以下工件: 我不知道是什么原因造成的。也许这和我如何规范化对偶四元数有关,也许这和我如何将对偶四元数转换成矩阵有关。我试图搜索实际的双四元数代码,但我发现的只是一堆难以理解的数学定义 我包括了一些着色器代码,因为我很确定这就是问题所在。希望精通四元数数学的人能看穿它 混合双四元数。Boneweight2=
vec4 blendReal = boneReal[bone1] * boneWeight1 + boneReal[bone2] * boneWeight2;
vec4 blendDual = boneDual[bone1] * boneWeight1 + boneDual[bone2] * boneWeight2;
float blend_norm_real = length(blendReal);
blendReal /= blend_norm_real;
blendDual /= blend_norm_real;
从双四元数创建矩阵:
mat4 MatFromDualQuat(vec4 rq, vec4 dq)
{
//Source: Section 3.4 http://www.seas.upenn.edu/~ladislav/papers/sdq-i3d07/sdq-i3d07.pdf
//rq = real quaternion
//dq = dual quaternion
mat4 M;
M[0][0] = 1.0 - 2.0 * (rq.y * rq.y + rq.z * rq.z); //
M[1][0] = 2.0 * (rq.x * rq.y + rq.w * rq.z);//
M[2][0] = 2.0 * (rq.w * rq.y - rq.x * rq.z);//
M[3][0] = 0.0;
M[0][1] = 2.0 * (rq.x * rq.y - rq.w * rq.z);
M[1][1] = 1.0 - 2.0 * (rq.x * rq.x + rq.z * rq.z);
M[2][1] = 2.0 * (rq.y * rq.z + rq.w * rq.x);
M[3][1] = 0.0;
M[0][2] = - 2.0 * (rq.x * rq.z + rq.w * rq.y);
M[1][2] = 2.0 * (rq.y * rq.z - rq.w * rq.x);
M[2][2] = 1.0 - 2.0 * (rq.x * rq.x + rq.y * rq.y);
M[3][2] = 0.0;
M[0][3] = 2.0 * (-dq.w * rq.x + dq.x * rq.w + dq.z * rq.y - dq.y * rq.z);
M[1][3] = 2.0 * (-dq.w * rq.y + dq.y * rq.w + dq.x * rq.z - dq.z * rq.x);
M[2][3] = 2.0 * (-dq.w * rq.z + dq.z * rq.w + dq.y * rq.x - dq.x * rq.y);
M[3][3] = 1.0;
return M;
}
然后我将其与绑定姿势顶点位置相乘。blendDual/=blend\u norm\u real;应该用实部标准化还是双长度标准化?我不确定。在我找到的唯一一个代码示例中,它们除以实际长度