-
Notifications
You must be signed in to change notification settings - Fork 18
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
pose Jacobian on translation in get3DLocalTransformJac_ #4
Comments
Yep, this part is necessary. If I remember correctly, that's what happens if you take an analytical derivative of the Forward Kinematics. The derivation is a bit lengthy, so forgive me for not putting it here. Intuitively, we could think that every model vertex that is transformed by a particular joint is transformed w.r.t. to that joint rotation AND global position. A derivative of the vertex w.r.t. to joint angles essentially describes how this vertex position will change when the joint is rotated a bit. And this change will be notably different for different locations of the joint even if the amount of rotation is the same. Thus derivative has to reflect the joint location somehow. If you put zeros in this Hope this helps =) |
@maria-korosteleva , rotation theta for joint i should only cause translation change to child joints of joint i, but not for joint i, if we look into the formula T(i) = R(global) * (Resting(i) - Resting(i_parent)) + T(global), local rotation didn't appear in the formula. Could you help look into this part again, because I seem to be pretty sure to the formula. |
@yang2640, let me extend my attempt of "intuitive" explanation Here the dynamic programming thing also comes into play. The derivative for the local transformation of each joint is computed once per full-pose jacobian computation and then is reused to compute derivatives of global transformation matrices for all the subsequent joints. lines 928-929 of SMPLWrapper.cpp:
Here we update lines 939-940 of SMPLWrapper.cpp:
we reuse the Regarding the formula you are giving, I can comment, however, on the note "local rotation didn't appear in the formula". Whenever we are talking about pose parameters for this model, we are talking about specifying the local transform of each joint w.r.t. its a parent (this is actually a common practice). Skinning ( in our case, LBS) requires global transformation, so in order to get a global transformation for the joint w.r.t. to the world, one needs to perform Forward Kinematics. FK formula derivative thus requires getting a derivative of local transform at some point =)) |
In "void SMPLWrapper::get3DLocalTransformJac_(const E::Vector3d & jointAxisAngleRotation,
const E::MatrixXd & transform_mat, E::MatrixXd* local_transform_jac_out)"
"
for (int i = 0; i < SPACE_DIM; ++i)
{
local_transform_jac_out[i].setZero(4, 4);
local_transform_jac_out[i].col(SPACE_DIM) = transform_mat.col(SPACE_DIM);
}
"
Is " local_transform_jac_out[i].col(SPACE_DIM) = transform_mat.col(SPACE_DIM); " necessary ?
I am thinking this column on translation should be all 0s, because the axis-angle rotation on current jointID will have not any influence on the current translation, though it should be have influence on the translation of the child.
The text was updated successfully, but these errors were encountered: