[Bf-blender-cvs] [337eb4306cb] soc-2021-simulation-display: Physics: Added visualisation for frictional forces, plus some clean-ups to previous commit
soumya pochiraju
noreply at git.blender.org
Mon Jun 14 13:21:25 CEST 2021
Commit: 337eb4306cb24b066e86dd70f0d6e25672dbaada
Author: soumya pochiraju
Date: Sat Jun 12 17:24:17 2021 +0530
Branches: soc-2021-simulation-display
https://developer.blender.org/rB337eb4306cb24b066e86dd70f0d6e25672dbaada
Physics: Added visualisation for frictional forces, plus some clean-ups to previous commit
===================================================================
M intern/rigidbody/RBI_api.h
M intern/rigidbody/rb_bullet_api.cpp
M source/blender/blenkernel/BKE_pointcache.h
M source/blender/blenkernel/intern/pointcache.c
M source/blender/blenkernel/intern/rigidbody.c
M source/blender/draw/engines/overlay/overlay_extra.c
M source/blender/makesdna/DNA_pointcache_types.h
M source/blender/makesdna/DNA_rigidbody_types.h
===================================================================
diff --git a/intern/rigidbody/RBI_api.h b/intern/rigidbody/RBI_api.h
index 81c7c442706..cde25ec8991 100644
--- a/intern/rigidbody/RBI_api.h
+++ b/intern/rigidbody/RBI_api.h
@@ -87,7 +87,10 @@ void RB_dworld_get_impulse(rbDynamicsWorld *world,
rbRigidBody *rbo,
float timeSubStep,
float norm_forces[3][3],
- float vec_locations[3][3]);
+ float fric_forces[3][3],
+ float vec_locations[3][3],
+ int norm_flag,
+ int fric_flag);
/* Simulation ----------------------- */
diff --git a/intern/rigidbody/rb_bullet_api.cpp b/intern/rigidbody/rb_bullet_api.cpp
index 639c4a13c79..20e104b4b49 100644
--- a/intern/rigidbody/rb_bullet_api.cpp
+++ b/intern/rigidbody/rb_bullet_api.cpp
@@ -210,26 +210,31 @@ void RB_dworld_get_impulse(rbDynamicsWorld *world,
rbRigidBody *rbo,
float timeSubStep,
float norm_forces[3][3],
- float vec_locations[3][3])
+ float fric_forces[3][3],
+ float vec_locations[3][3],
+ int norm_flag,
+ int fric_flag)
{
int numManifolds = world->dispatcher->getNumManifolds();
- int num_forces = 0;
+ int num_norm_forces = 0;
+ int num_fric_forces = 0;
for (int i = 0; i < numManifolds; i++)
{
btPersistentManifold* contactManifold = world->dispatcher->getManifoldByIndexInternal(i);
const void *obA = contactManifold->getBody0();
const void *obB = contactManifold->getBody1();
- if(num_forces>2)
+ if(num_norm_forces>2)
break;
if(obA != rbo->body && obB != rbo->body)
{
- printf("%p,%p,\n",rbo,obA);
continue;
}
else
{
btVector3 tot_impulse = btVector3(0.0,0.0,0.0);
btVector3 final_loc = btVector3(0.0,0.0,0.0);
+ btScalar tot_impulse_magnitude=0.f;
+ btVector3 tot_lat_impulse = btVector3(0.0,0.0,0.0);
int numContacts = contactManifold->getNumContacts();
int num_impulse_points = 0;
for (int j = 0; j < numContacts; j++)
@@ -245,19 +250,33 @@ void RB_dworld_get_impulse(rbDynamicsWorld *world,
btManifoldPoint& pt = contactManifold->getContactPoint(j);
if (pt.getAppliedImpulse() > 0.f)
{
- const btVector3& loc = pt.getPositionWorldOnB();
- const btVector3 lat_imp1 = pt.m_appliedImpulseLateral1 * pt.m_lateralFrictionDir1;
- const btVector3 lat_imp2 = pt.m_appliedImpulseLateral2 * pt.m_lateralFrictionDir2;
- printf("%f,%f,%f %f,%f,%f\n",lat_imp1.getX(),lat_imp1.getY(),lat_imp1.getZ(),lat_imp2.getX(), lat_imp2.getY(),lat_imp2.getZ());
- const btVector3 imp = (rbo->body == obB)? -pt.m_normalWorldOnB * pt.getAppliedImpulse()/timeSubStep:pt.m_normalWorldOnB * pt.getAppliedImpulse()/timeSubStep;
-
- tot_impulse += imp;
- final_loc += num_impulse_points>1 ? loc * pt.getAppliedImpulse() / numContacts : loc;
+ const btVector3& loc = pt.getPositionWorldOnB();
+ const btVector3 imp = (rbo->body == obB)? -pt.m_normalWorldOnB * pt.getAppliedImpulse()/timeSubStep:pt.m_normalWorldOnB * pt.getAppliedImpulse()/timeSubStep;
+ tot_impulse_magnitude += pt.getAppliedImpulse();
+ tot_impulse += imp;
+ final_loc += num_impulse_points>1 ? loc * pt.getAppliedImpulse() : loc;
+ if (fric_flag)
+ {
+ const btVector3 lat_imp1 = (rbo->body == obB)? -pt.m_appliedImpulseLateral1 * pt.m_lateralFrictionDir1/timeSubStep : pt.m_appliedImpulseLateral1 * pt.m_lateralFrictionDir1/timeSubStep;
+ const btVector3 lat_imp2 = (rbo->body == obB)? -pt.m_appliedImpulseLateral2 * pt.m_lateralFrictionDir2/timeSubStep : pt.m_appliedImpulseLateral2 * pt.m_lateralFrictionDir2/timeSubStep;
+ tot_lat_impulse += lat_imp1 + lat_imp2;
+ }
}
}
- copy_v3_btvec3(norm_forces[num_forces],tot_impulse);
- copy_v3_btvec3(vec_locations[num_forces],final_loc);
- num_forces++;
+
+ if(num_impulse_points >1) final_loc = final_loc / tot_impulse_magnitude;
+ copy_v3_btvec3(vec_locations[num_norm_forces],final_loc);
+ if(norm_flag)
+ {
+ copy_v3_btvec3(norm_forces[num_norm_forces],tot_impulse);
+ num_norm_forces++;
+ }
+ if(fric_flag)
+ {
+ copy_v3_btvec3(fric_forces[num_fric_forces], tot_lat_impulse);
+ printf("%f %f %f\n", tot_lat_impulse.getX(), tot_lat_impulse.getY(),tot_lat_impulse.getZ());
+ num_fric_forces++;
+ }
}
}
diff --git a/source/blender/blenkernel/BKE_pointcache.h b/source/blender/blenkernel/BKE_pointcache.h
index bb3e5710582..4e5939e0337 100644
--- a/source/blender/blenkernel/BKE_pointcache.h
+++ b/source/blender/blenkernel/BKE_pointcache.h
@@ -104,8 +104,10 @@ typedef struct PTCacheData {
float size;
float times[3];
struct BoidData boids;
- struct force_vec eff_forces[3];
- struct force_vec norm_forces[3];
+ struct sim_data_vec eff_forces[3];
+ struct sim_data_vec norm_forces[3];
+ struct sim_data_vec fric_forces[3];
+ struct sim_data_vec vec_locations[3];
} PTCacheData;
typedef struct PTCacheFile {
diff --git a/source/blender/blenkernel/intern/pointcache.c b/source/blender/blenkernel/intern/pointcache.c
index 27a6773a8a7..8ba6958f08f 100644
--- a/source/blender/blenkernel/intern/pointcache.c
+++ b/source/blender/blenkernel/intern/pointcache.c
@@ -127,8 +127,10 @@ static int ptcache_data_size[] = {
sizeof(float), /* BPHYS_DATA_SIZE */
sizeof(float[3]), /* BPHYS_DATA_TIMES */
sizeof(BoidData), /* case BPHYS_DATA_BOIDS */
- sizeof(force_vec[3]), /* BPHYS_DATA_EFF_FORCES */
- sizeof(force_vec[3]), /* BPHYS_DATA_NORM_FORCES */
+ sizeof(sim_data_vec[3]), /* BPHYS_DATA_EFF_FORCES */
+ sizeof(sim_data_vec[3]), /* BPHYS_DATA_NORM_FORCES */
+ sizeof(sim_data_vec[3]), /* BPHYS_DATA_FRIC_FORCES */
+ sizeof(sim_data_vec[3]), /* BPHYS_DATA_VEC_LOCATIONS */
};
static int ptcache_extra_datasize[] = {
@@ -784,6 +786,8 @@ static int ptcache_rigidbody_write(int index, void *rb_v, void **data, int UNUSE
PTCACHE_DATA_FROM(data, BPHYS_DATA_ROTATION, rbo->orn);
PTCACHE_DATA_FROM(data, BPHYS_DATA_EFF_FORCES, rbo->eff_forces);
PTCACHE_DATA_FROM(data, BPHYS_DATA_NORM_FORCES, rbo->norm_forces);
+ PTCACHE_DATA_FROM(data, BPHYS_DATA_FRIC_FORCES, rbo->fric_forces);
+ PTCACHE_DATA_FROM(data, BPHYS_DATA_VEC_LOCATIONS, rbo->vec_locations);
}
}
@@ -813,6 +817,8 @@ static void ptcache_rigidbody_read(
PTCACHE_DATA_TO(data, BPHYS_DATA_ROTATION, 0, rbo->orn);
PTCACHE_DATA_TO(data, BPHYS_DATA_EFF_FORCES, 0 ,rbo->eff_forces);
PTCACHE_DATA_TO(data, BPHYS_DATA_NORM_FORCES, 0 ,rbo->norm_forces);
+ PTCACHE_DATA_TO(data, BPHYS_DATA_FRIC_FORCES, 0 ,rbo->fric_forces);
+ PTCACHE_DATA_TO(data, BPHYS_DATA_VEC_LOCATIONS, 0 ,rbo->vec_locations);
}
}
}
@@ -1100,7 +1106,7 @@ void BKE_ptcache_id_from_rigidbody(PTCacheID *pid, Object *ob, RigidBodyWorld *r
pid->write_header = ptcache_basic_header_write;
pid->read_header = ptcache_basic_header_read;
- pid->data_types = (1 << BPHYS_DATA_LOCATION) | (1 << BPHYS_DATA_ROTATION) | (1 << BPHYS_DATA_EFF_FORCES) | (1 << BPHYS_DATA_NORM_FORCES);
+ pid->data_types = (1 << BPHYS_DATA_LOCATION) | (1 << BPHYS_DATA_ROTATION) | (1 << BPHYS_DATA_EFF_FORCES) | (1 << BPHYS_DATA_NORM_FORCES) | (1 << BPHYS_DATA_FRIC_FORCES) | (1 << BPHYS_DATA_VEC_LOCATIONS);
pid->info_types = 0;
pid->stack_index = pid->cache->index;
@@ -1739,7 +1745,9 @@ static void ptcache_file_pointers_init(PTCacheFile *pf)
pf->cur[BPHYS_DATA_TIMES] = (data_types & (1 << BPHYS_DATA_TIMES)) ? &pf->data.times : NULL;
pf->cur[BPHYS_DATA_BOIDS] = (data_types & (1 << BPHYS_DATA_BOIDS)) ? &pf->data.boids : NULL;
pf->cur[BPHYS_DATA_EFF_FORCES] = (data_types & (1 << BPHYS_DATA_EFF_FORCES)) ? &pf->data.eff_forces : NULL;
- pf->cur[BPHYS_DATA_NORM_FORCES] = (data_types & (1 << BPHYS_DATA_NORM_FORCES)) ? &pf->data.eff_forces : NULL;
+ pf->cur[BPHYS_DATA_NORM_FORCES] = (data_types & (1 << BPHYS_DATA_NORM_FORCES)) ? &pf->data.norm_forces : NULL;
+ pf->cur[BPHYS_DATA_FRIC_FORCES] = (data_types & (1 << BPHYS_DATA_FRIC_FORCES)) ? &pf->data.fric_forces : NULL;
+ pf->cur[BPHYS_DATA_VEC_LOCATIONS] = (data_types & (1 << BPHYS_DATA_VEC_LOCATIONS)) ? &pf->data.vec_locations : NULL;
}
/* Check to see if point number "index" is in pm, uses binary search for index data. */
diff --git a/source/blender/blenkernel/intern/rigidbody.c b/source/blender/blenkernel/intern/rigidbody.c
index ad736d9e16c..634df6aee35 100644
--- a/source/blender/blenkernel/intern/rigidbody.c
+++ b/source/blender/blenkernel/intern/rigidbody.c
@@ -1286,15 +1286,18 @@ RigidBodyOb *BKE_rigidbody_create_object(Scene *scene, Object *ob, short type)
rbo->col_groups = 1;
- zero_v3(rbo->eff_forces[0].force);
- zero_v3(rbo->eff_forces[1].force);
- zero_v3(rbo->eff_forces[2].force);
- zero_v3(rbo->norm_forces[0].force);
- zero_v3(rbo->norm_forces[1].force);
- zero_v3(rbo->norm_forces[2].force);
- zero_v3(rbo->norm_forces[0].loc);
- zero_v3(rbo->norm_forces[1].loc);
- zero_v3(rbo->norm_forces[2].loc);
+ zero_v3(rbo->eff_forces[0].vector);
+ zero_v3(rbo->eff_forces[1].vector);
+ zero_v3(rbo->eff_forces[2].vector);
+ zero_v3(rbo->norm_forces[0].vector);
+ zero_v3(rbo->norm_forces[1].vector);
+ zero_v3(rbo->norm_forces[2].vector);
+ zero_v3(rbo->fric_forces[0].vector);
+ zero_v3(rbo->fric_forces[1].vector);
+ zero_v3(rbo->fric_forces[2].vector);
+ zero_v3(rbo->vec_locations[0].vector);
+ zero_v3(rbo->vec_locations[1].vector);
+ zero_v3(rbo->vec_locations[2].vector);
/* us
@@ Diff output truncated at 10240 characters. @@
More information about the Bf-blender-cvs
mailing list