[Bf-blender-cvs] [94de2bf12cc] soc-2021-simulation-display: Physics: Changed hinge constraint visualisation so that it uses the transform matrices in the format obtained from bullet, created functions to get transforms from bullet

soumya pochiraju noreply at git.blender.org
Fri Aug 13 14:55:27 CEST 2021


Commit: 94de2bf12cca16b6b21794ff3a9d186cc588be59
Author: soumya pochiraju
Date:   Fri Aug 13 18:23:39 2021 +0530
Branches: soc-2021-simulation-display
https://developer.blender.org/rB94de2bf12cca16b6b21794ff3a9d186cc588be59

Physics: Changed hinge constraint visualisation so that it uses the transform matrices in the format obtained from bullet, created functions to get transforms from bullet

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

M	intern/rigidbody/RBI_api.h
M	intern/rigidbody/rb_bullet_api.cpp
M	source/blender/draw/engines/overlay/overlay_extra.c

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

diff --git a/intern/rigidbody/RBI_api.h b/intern/rigidbody/RBI_api.h
index 19b05b849ea..45029c32e50 100644
--- a/intern/rigidbody/RBI_api.h
+++ b/intern/rigidbody/RBI_api.h
@@ -371,6 +371,9 @@ void RB_constraint_set_target_velocity_motor(rbConstraint *con,
                                              float velocity_lin,
                                              float velocity_ang);
 
+/* Get object transforms */
+void RB_constraint_get_transforms_hinge(rbConstraint *con, float r_ob1_transform[4][4], float r_ob2_transform[4][4]);
+
 /* Set number of constraint solver iterations made per step, this overrided world setting
  * To use default set it to -1 */
 void RB_constraint_set_solver_iterations(rbConstraint *con, int num_solver_iterations);
diff --git a/intern/rigidbody/rb_bullet_api.cpp b/intern/rigidbody/rb_bullet_api.cpp
index c9ac3d9f2d3..92fd935e8ba 100644
--- a/intern/rigidbody/rb_bullet_api.cpp
+++ b/intern/rigidbody/rb_bullet_api.cpp
@@ -1395,4 +1395,16 @@ void RB_constraint_set_target_velocity_motor(rbConstraint *con,
   constraint->getRotationalLimitMotor(0)->m_targetVelocity = velocity_ang;
 }
 
+void RB_constraint_get_transforms_hinge(rbConstraint *con, float r_ob1_transform[4][4], float r_ob2_transform[4][4]) {
+    btHingeConstraint *constraint = reinterpret_cast<btHingeConstraint *>(con);
+    btTransform transform1;
+    btTransform transform2;
+
+    transform1 = constraint->getAFrame();
+    transform2 = constraint->getBFrame();
+
+    transform1.getOpenGLMatrix((btScalar *)r_ob1_transform);
+    transform2.getOpenGLMatrix((btScalar *)r_ob2_transform);
+}
+
 /* ********************************** */
diff --git a/source/blender/draw/engines/overlay/overlay_extra.c b/source/blender/draw/engines/overlay/overlay_extra.c
index ae3bf319cb0..a6aba422013 100644
--- a/source/blender/draw/engines/overlay/overlay_extra.c
+++ b/source/blender/draw/engines/overlay/overlay_extra.c
@@ -2291,7 +2291,6 @@ static void OVERLAY_linear_limits_rod(RigidBodyCon *rbc,
 
 static void OVERLAY_angular_limits_rods( OVERLAY_ExtraCallBuffers *cb,
                                      Object *ob,
-                                     const float axis_in_w[3],
                                      const float pivot[3],
                                      const float ob_offset_vec[3],
                                      const float coupled_ob_offset_vec[3],
@@ -2301,9 +2300,6 @@ static void OVERLAY_angular_limits_rods( OVERLAY_ExtraCallBuffers *cb,
 
     float mid[3];
 
-    float axis[3];
-    copy_v3_v3(axis, axis_in_w);
-
     float ob_pivot_dist_vec[3];
     sub_v3_v3v3(ob_pivot_dist_vec, ob->rigidbody_object->pos, pivot);
 
@@ -2335,25 +2331,26 @@ static void OVERLAY_angular_limits_arc(OVERLAY_Data *data,
                                      const float transform_mat[3][3],
                                      const float angle,
                                      float angular_offset,
+                                     const float delta_angle,
                                      const float axis_in_w[3],
                                      const float offset_vec[3],
                                      const float real_pivot[3],
                                      const float color[4]) {
 
     float ob1_pivot_dist_initial[3];
-    sub_v3_v3v3(ob1_pivot_dist_initial, constraint_ob->loc, ob->loc);
+    sub_v3_v3v3(ob1_pivot_dist_initial, real_pivot, ob->rigidbody_object->pos);
 
     /* Rotate the arc about constrained axis by required amount.
      * The arc should lie along the object-pivot distance vector. */
     float constrained_axis_rot;
 
     if(ob == rbc->ob1) {
-        float arc_start[3] = {cosf(0.0f), sinf(0.0f), 0.0f};
+        float arc_start[3] = {cosf(0.0f+delta_angle), sinf(0.0f+delta_angle), 0.0f};
         mul_m3_v3(transform_mat, arc_start);
         constrained_axis_rot = angle_signed_on_axis_v3v3_v3(arc_start, ob1_pivot_dist_initial, axis_in_w);
     }
     else {
-        float arc_start1[3] = {cosf(angle + (2*angular_offset)), sinf(angle + (2*angular_offset)), 0.0f};
+        float arc_start1[3] = {cosf(angle + (2*angular_offset)-delta_angle), sinf(angle + (2*angular_offset)-delta_angle), 0.0f};
         mul_m3_v3(transform_mat, arc_start1);
         constrained_axis_rot = angle_signed_on_axis_v3v3_v3(arc_start1, ob1_pivot_dist_initial, axis_in_w);
     }
@@ -2365,22 +2362,11 @@ static void OVERLAY_angular_limits_arc(OVERLAY_Data *data,
 
     float final_mat[4][4] = {{0.0f}};
 
-    float coupled_ob_initial_rot_inv[3][3];
-    float coupled_ob_transform[4][4];
-
-    BKE_object_rot_to_mat3(coupled_ob, coupled_ob_initial_rot_inv, false);
-    invert_m3(coupled_ob_initial_rot_inv);
-    copy_m4_m4(coupled_ob_transform, coupled_ob->obmat);
-    zero_v4(coupled_ob_transform[3]);
-
-    mul_m4_m4m3(final_mat, coupled_ob_transform, coupled_ob_initial_rot_inv);
-    mul_m4_m4m3(final_mat, final_mat, transform_mat);
+    copy_m4_m3(final_mat, transform_mat);
 
     copy_v3_v3(final_mat[3], disk_pos);
     final_mat[3][3] = 1.0f;
 
-    normalize_m4(final_mat);
-
     float segment_width = M_PI*10/180;
     int n_segments = (int)(angle/segment_width) + 2;
 
@@ -2406,6 +2392,38 @@ static void OVERLAY_angular_limits(OVERLAY_Data *data,
     float angle = 0.0f;
     float angular_offset = 0.0f;
 
+    float t1[3][3] = {{0.0f}};
+    float t2[3][3] = {{0.0f}};
+    float ob_init[3][3] = {{0.0f}};
+    float ob_curr[3][3] = {{0.0f}};
+
+    float ob1_transform[4][4];
+    float ob2_transform[4][4];
+
+    if(rbc->physics_constraint != NULL) {
+      printf("yes ");
+      RB_constraint_get_transforms_hinge(rbc->physics_constraint, ob1_transform, ob2_transform);
+      copy_m3_m4(t1, ob1_transform);
+      copy_m3_m4(t2, ob2_transform);
+    }
+
+    else {
+      printf("No ");
+      BKE_object_rot_to_mat3(constraint_ob, t1, false);
+      BKE_object_rot_to_mat3(ob1, ob_init, false);
+      invert_m3(ob_init);
+      copy_m3_m4(ob_curr, ob1->obmat);
+      mul_m3_m3m3(t1, ob_init, t1);
+      mul_m3_m3m3(t1, ob_curr, t1);
+
+      BKE_object_rot_to_mat3(constraint_ob, t2, false);
+      BKE_object_rot_to_mat3(ob2, ob_init, false);
+      invert_m3(ob_init);
+      copy_m3_m4(ob_curr, ob2->obmat);
+      mul_m3_m3m3(t2, ob_init, t2);
+      mul_m3_m3m3(t2, ob_curr, t2);
+    }
+
     float ob1_pivot_dist_initial[3];
     sub_v3_v3v3(ob1_pivot_dist_initial, constraint_ob->loc, ob1->loc);
     float real_pivot[3] = {0.0f};
@@ -2421,6 +2439,7 @@ static void OVERLAY_angular_limits(OVERLAY_Data *data,
         copy_v3_v3(real_pivot, ob2->rigidbody_object->pos);
     }
     else{
+
       mul_v3_m3v3(real_pivot, ob1_initial_rot_inv, ob1_pivot_dist_initial);
       mul_v3_m4v3(real_pivot, ob1->obmat, real_pivot);
     }
@@ -2429,11 +2448,9 @@ static void OVERLAY_angular_limits(OVERLAY_Data *data,
     /* Constraint axis transform. */
     float constrained_axis_transoform[3][3] = {{0}};
 
-    float constrained_axis_local[3] = {0.0f};
     float constrained_axis_w_initial[3] = {0.0f};
     float constrained_axis_w[3] = {0.0f};
 
-    constrained_axis_local[axis] = 1.0f;
     constrained_axis_w_initial[axis] = 1.0f;
 
     /* Get constrained axis rotation from constraint object. */
@@ -2444,11 +2461,6 @@ static void OVERLAY_angular_limits(OVERLAY_Data *data,
     mul_m3_v3(ob1_initial_rot_inv, constrained_axis_w);
     mul_m3_v3(ob1_rot, constrained_axis_w);
 
-    float rot_axis[3];
-    cross_v3_v3v3(rot_axis, constrained_axis_local, constrained_axis_w_initial);
-    float rot_angle = angle_on_axis_v3v3_v3(constrained_axis_local, constrained_axis_w_initial, rot_axis);
-    axis_angle_to_mat3(constrained_axis_transoform, rot_axis, rot_angle);
-
     float ax[3] = {0.0f};
 
     switch(axis){
@@ -2467,10 +2479,11 @@ static void OVERLAY_angular_limits(OVERLAY_Data *data,
        case 2:
         angle = (rbc->limit_ang_z_upper - rbc->limit_ang_z_lower);
         angular_offset = rbc->limit_ang_z_lower;
+        ax[0] = 1.0f;
         unit_m3(corr_rot);
         break;
     }
-    mul_m3_m3m3(constrained_axis_transoform, constrained_axis_transoform, corr_rot);
+
 
     float ob1_pivot_dist[3];
     float ob2_pivot_dist[3];
@@ -2495,16 +2508,24 @@ static void OVERLAY_angular_limits(OVERLAY_Data *data,
     mul_v3_fl(ob1_offset_vec, ob1_offset);
     mul_v3_fl(ob2_offset_vec, ob2_offset);
 
+    float axis_ob1[3];
+    float axis_ob2[3];
+    copy_v3_v3(axis_ob1, ax);
+    copy_v3_v3(axis_ob2, ax);
+    mul_m3_v3(t1, axis_ob1);
+    mul_m3_v3(t2, axis_ob2);
+    float delta_angle = angle_signed_on_axis_v3v3_v3(axis_ob1, axis_ob2, constrained_axis_w);
+
     OVERLAY_PrivateData *pd = data->stl->pd;
     cb = &pd->extra_call_buffers[1];
 
     if(ob1->rigidbody_object->type == RBO_TYPE_ACTIVE) {
-      OVERLAY_angular_limits_arc(data, rbc, ob1, ob2, constraint_ob, constrained_axis_transoform, angle, angular_offset, constrained_axis_w_initial, ob1_offset_vec, real_pivot, color1);
-      OVERLAY_angular_limits_rods(cb, ob1, constrained_axis_w_initial, real_pivot, ob1_offset_vec, ob2_offset_vec, color2);
+      OVERLAY_angular_limits_arc(data, rbc, ob1, ob2, constraint_ob, t2, angle, angular_offset, delta_angle, constrained_axis_w, ob1_offset_vec, real_pivot, color1);
+      OVERLAY_angular_limits_rods(cb, ob1, real_pivot, ob1_offset_vec, ob2_offset_vec, color2);
     }
     if(ob2->rigidbody_object->type == RBO_TYPE_ACTIVE) {
-      OVERLAY_angular_limits_arc(data, rbc, ob2, ob1, constraint_ob, constrained_axis_transoform, angle, angular_offset, constrained_axis_w_initial, ob2_offset_vec, real_pivot, color2);
-      OVERLAY_angular_limits_rods(cb, ob2, constrained_axis_w_initial, real_pivot, ob2_offset_vec, ob1_offset_vec, color1);
+      OVERLAY_angular_limits_arc(data, rbc, ob2, ob1, constraint_ob, t1, angle, angular_offset, delta_angle, constrained_axis_w, ob2_offset_vec, real_pivot, color2);
+      OVERLAY_angular_limits_rods(cb, ob2, real_pivot, ob2_offset_vec, ob1_offset_vec, color1);
     }
 
 }



More information about the Bf-blender-cvs mailing list