Fix T51703: Rigid body with delta transform jumps when transforming
When doing any transformation on a rigid body object that has delta transforms, the object would be offset by the amount of the delta transform.
This commit is contained in:
parent
b87d10d4fe
commit
d1dfd5fa26
Notes:
blender-bot
2023-02-14 06:54:35 +01:00
Referenced by issue #51703, Animated rigid body objects with deta transform can't be manipulated correctly
|
@ -1486,24 +1486,60 @@ void BKE_rigidbody_sync_transforms(RigidBodyWorld *rbw, Object *ob, float ctime)
|
|||
void BKE_rigidbody_aftertrans_update(Object *ob, float loc[3], float rot[3], float quat[4], float rotAxis[3], float rotAngle)
|
||||
{
|
||||
RigidBodyOb *rbo = ob->rigidbody_object;
|
||||
bool correct_delta = !(rbo->flag & RBO_FLAG_KINEMATIC || rbo->type == RBO_TYPE_PASSIVE);
|
||||
|
||||
/* return rigid body and object to their initial states */
|
||||
copy_v3_v3(rbo->pos, ob->loc);
|
||||
copy_v3_v3(ob->loc, loc);
|
||||
|
||||
if (correct_delta) {
|
||||
add_v3_v3(rbo->pos, ob->dloc);
|
||||
}
|
||||
|
||||
if (ob->rotmode > 0) {
|
||||
eulO_to_quat(rbo->orn, ob->rot, ob->rotmode);
|
||||
float qt[4];
|
||||
eulO_to_quat(qt, ob->rot, ob->rotmode);
|
||||
|
||||
if (correct_delta) {
|
||||
float dquat[4];
|
||||
eulO_to_quat(dquat, ob->drot, ob->rotmode);
|
||||
|
||||
mul_qt_qtqt(rbo->orn, dquat, qt);
|
||||
}
|
||||
else {
|
||||
copy_qt_qt(rbo->orn, qt);
|
||||
}
|
||||
|
||||
copy_v3_v3(ob->rot, rot);
|
||||
}
|
||||
else if (ob->rotmode == ROT_MODE_AXISANGLE) {
|
||||
axis_angle_to_quat(rbo->orn, ob->rotAxis, ob->rotAngle);
|
||||
float qt[4];
|
||||
axis_angle_to_quat(qt, ob->rotAxis, ob->rotAngle);
|
||||
|
||||
if (correct_delta) {
|
||||
float dquat[4];
|
||||
axis_angle_to_quat(dquat, ob->drotAxis, ob->drotAngle);
|
||||
|
||||
mul_qt_qtqt(rbo->orn, dquat, qt);
|
||||
}
|
||||
else {
|
||||
copy_qt_qt(rbo->orn, qt);
|
||||
}
|
||||
|
||||
copy_v3_v3(ob->rotAxis, rotAxis);
|
||||
ob->rotAngle = rotAngle;
|
||||
}
|
||||
else {
|
||||
copy_qt_qt(rbo->orn, ob->quat);
|
||||
if (correct_delta) {
|
||||
mul_qt_qtqt(rbo->orn, ob->dquat, ob->quat);
|
||||
}
|
||||
else {
|
||||
copy_qt_qt(rbo->orn, ob->quat);
|
||||
}
|
||||
|
||||
copy_qt_qt(ob->quat, quat);
|
||||
}
|
||||
|
||||
if (rbo->physics_object) {
|
||||
/* allow passive objects to return to original transform */
|
||||
if (rbo->type == RBO_TYPE_PASSIVE)
|
||||
|
|
|
@ -5349,7 +5349,8 @@ static void ObjectToTransData(TransInfo *t, TransData *td, Object *ob)
|
|||
}
|
||||
/* update object's loc/rot to get current rigid body transform */
|
||||
mat4_to_loc_rot_size(ob->loc, rot, scale, ob->obmat);
|
||||
BKE_object_mat3_to_rot(ob, rot, false);
|
||||
sub_v3_v3(ob->loc, ob->dloc);
|
||||
BKE_object_mat3_to_rot(ob, rot, false); /* drot is already corrected here */
|
||||
}
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in New Issue