Commit: d1dfd5fa26d89e40ecbf39b9ac921d341f8fdc41
Author: Luca Rood
Date:   Tue Jul 4 10:12:09 2017 +0200
Branches: master
https://developer.blender.org/rBd1dfd5fa26d89e40ecbf39b9ac921d341f8fdc41

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.

===================================================================

M       source/blender/blenkernel/intern/rigidbody.c
M       source/blender/editors/transform/transform_conversions.c

===================================================================

diff --git a/source/blender/blenkernel/intern/rigidbody.c 
b/source/blender/blenkernel/intern/rigidbody.c
index c18366d1b8a..e8c0cf53d0b 100644
--- a/source/blender/blenkernel/intern/rigidbody.c
+++ b/source/blender/blenkernel/intern/rigidbody.c
@@ -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)
diff --git a/source/blender/editors/transform/transform_conversions.c 
b/source/blender/editors/transform/transform_conversions.c
index ba474e93b70..1eb9b3caa3e 100644
--- a/source/blender/editors/transform/transform_conversions.c
+++ b/source/blender/editors/transform/transform_conversions.c
@@ -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 */
                }
        }

_______________________________________________
Bf-blender-cvs mailing list
[email protected]
https://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to