== Constraints - Important Bugfix ==
I've finally fixed the bug with the Constraint Space Conversion. It was a single matrix multiplication in the wrong order (for local->pose). Also, there is more code added for the space conversion process when bones have 'hinge' on. (NOTE: this stuff for hinge bones may still not work really nice yet)
This commit is contained in:
parent
e7ad09f8b5
commit
65f4cb14c1
|
@ -25,7 +25,7 @@
|
||||||
*
|
*
|
||||||
* The Original Code is: all of this file.
|
* The Original Code is: all of this file.
|
||||||
*
|
*
|
||||||
* Contributor(s): none yet.
|
* Contributor(s): 2007 - Joshua Leung (major recode)
|
||||||
*
|
*
|
||||||
* ***** END GPL/BL DUAL LICENSE BLOCK *****
|
* ***** END GPL/BL DUAL LICENSE BLOCK *****
|
||||||
*/
|
*/
|
||||||
|
|
|
@ -1017,9 +1017,30 @@ static void constraint_mat_convertspace (Object *ob, bPoseChannel *pchan, float
|
||||||
VECCOPY(offs_bone[3], pchan->bone->head);
|
VECCOPY(offs_bone[3], pchan->bone->head);
|
||||||
offs_bone[3][1]+= pchan->parent->bone->length;
|
offs_bone[3][1]+= pchan->parent->bone->length;
|
||||||
|
|
||||||
Mat4MulMat4(diff_mat, offs_bone, pchan->parent->pose_mat);
|
if (pchan->bone->flag & BONE_HINGE) {
|
||||||
Mat4CpyMat4(tempmat, mat);
|
/* pose_mat = par_pose-space_location * chan_mat */
|
||||||
Mat4MulMat4(mat, tempmat, diff_mat);
|
float tmat[4][4];
|
||||||
|
|
||||||
|
/* the rotation of the parent restposition */
|
||||||
|
Mat4CpyMat4(tmat, pchan->parent->bone->arm_mat);
|
||||||
|
|
||||||
|
/* the location of actual parent transform */
|
||||||
|
VECCOPY(tmat[3], offs_bone[3]);
|
||||||
|
offs_bone[3][0]= offs_bone[3][1]= offs_bone[3][2]= 0.0f;
|
||||||
|
Mat4MulVecfl(pchan->parent->pose_mat, tmat[3]);
|
||||||
|
|
||||||
|
Mat4MulMat4(diff_mat, offs_bone, tmat);
|
||||||
|
|
||||||
|
Mat4MulMat4(diff_mat, pchan->parent->pose_mat, offs_bone);
|
||||||
|
Mat4CpyMat4(tempmat, mat);
|
||||||
|
Mat4MulMat4(mat, tempmat, diff_mat);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
/* pose_mat = par_pose_mat * bone_mat * chan_mat */
|
||||||
|
Mat4MulMat4(diff_mat, pchan->parent->pose_mat, offs_bone);
|
||||||
|
Mat4CpyMat4(tempmat, mat);
|
||||||
|
Mat4MulMat4(mat, tempmat, diff_mat);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
Mat4CpyMat4(diff_mat, pchan->bone->arm_mat);
|
Mat4CpyMat4(diff_mat, pchan->bone->arm_mat);
|
||||||
|
|
Loading…
Reference in New Issue