I want to change object parent form Cube to Suzane, so that it won't move (matrix_basis, and matrix_world should be the same).
We search for new obj.matrix_parent_inverse2, in code below. It should work (proof on bottom), but last line clears new obj.matrix_parent_inverse
def set_new_parent_bug(obj, new_parent):
new_m_p_inv = new_parent.matrix_world.inverted() * obj.parent.matrix_world * obj.matrix_parent_inverse
obj.matrix_parent_inverse = new_m_p_inv
obj.parent = new_parent # this clears m_parent_inv !! BUG?In blend file I have script with broken function set_new_parent_bug(), and workaround function set_new_parent() that backups obj.matrix_parent_inverse, so that after changing parent and it being cleared to Identity Matrix, we can still use backup for calculation of new matrix_parent_inverse (for new parent)
But affects both blender 2.8 and 2.79
In short using obj.parent = xxx, should not clear obj.matrix_parent_inverse
And below proof that the math is valid (we search for new matrix_parent_inverse so that objects stays in place).
mat_world should be same with old parent and new parent
old_m_w == new_m_w old_parent_m_w @ obj.m_p_inv1 @ obj.m_basis == new_parent_m_w @ **obj.m_p_inv2** @ obj.m_basis new_parent_m_w.inv() @ old_parent_m_w @ obj.m_p_inv1 @ obj.m_basis == new_parent_m_w.inv() @ new_parent_m_w @ **obj.m_p_inv2** @ obj.m_basis new_parent_m_w.inv() @ old_parent_m_w @ obj.m_p_inv1 == **obj.m_p_inv2**