[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [29895] branches/soc-2010-aligorith-2: Bullet SoC - Exposing some more collision parameters:

Joshua Leung aligorith at gmail.com
Sat Jul 3 11:10:56 CEST 2010


Revision: 29895
          http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=29895
Author:   aligorith
Date:     2010-07-03 11:10:56 +0200 (Sat, 03 Jul 2010)

Log Message:
-----------
Bullet SoC - Exposing some more collision parameters:

* 'Bounciness' of object - this is known in Bullet terms as 'Restitution' (http://en.wikipedia.org/wiki/Coefficient_of_restitution). However, since I had to look this up to understand it, I'm guessing that choosing a more common name may be more suitable.

* Collision Margin - threshold for sensitivity of collision detection. This should be left on its default value for spheres.

Modified Paths:
--------------
    branches/soc-2010-aligorith-2/release/scripts/ui/properties_physics_rigidbody.py
    branches/soc-2010-aligorith-2/source/blender/blenkernel/intern/rigidbody.c
    branches/soc-2010-aligorith-2/source/blender/makesdna/DNA_rigidbody_types.h
    branches/soc-2010-aligorith-2/source/blender/makesrna/intern/rna_rigidbody.c
    branches/soc-2010-aligorith-2/source/blender/rigidbody/RBI_api.h
    branches/soc-2010-aligorith-2/source/blender/rigidbody/rb_bullet_api.cpp

Modified: branches/soc-2010-aligorith-2/release/scripts/ui/properties_physics_rigidbody.py
===================================================================
--- branches/soc-2010-aligorith-2/release/scripts/ui/properties_physics_rigidbody.py	2010-07-03 09:06:09 UTC (rev 29894)
+++ branches/soc-2010-aligorith-2/release/scripts/ui/properties_physics_rigidbody.py	2010-07-03 09:10:56 UTC (rev 29895)
@@ -54,7 +54,7 @@
             split.prop(rbo, "type", text="")
 
             if wide_ui:
-                split = layout.split(percentage=0.2)
+                split = layout.split(percentage=0.3)
                 split.label(text="Collision Shape:")
             else:
                 split = layout.split()
@@ -65,6 +65,8 @@
             col = split.column()
             col.prop(rbo, "mass")
             col.prop(rbo, "friction")
+            col.prop(rbo, "bounciness")
+            col.prop(rbo, "collision_margin")
             
 
 

Modified: branches/soc-2010-aligorith-2/source/blender/blenkernel/intern/rigidbody.c
===================================================================
--- branches/soc-2010-aligorith-2/source/blender/blenkernel/intern/rigidbody.c	2010-07-03 09:06:09 UTC (rev 29894)
+++ branches/soc-2010-aligorith-2/source/blender/blenkernel/intern/rigidbody.c	2010-07-03 09:10:56 UTC (rev 29895)
@@ -352,8 +352,12 @@
 	rbo->type = type;
 	
 	rbo->mass = 1.0f;
+	
 	rbo->friction = 0.5f; // best when non-zero. 0.5 is Bullet default
+	rbo->bounciness = 0.0f; // best when zero. 0.0 is Bullet default
 	
+	rbo->margin = 0.04; // 0.04 (in meters) is Bullet default
+	
 	rbo->shape = get_shape_from_boundbox(ob);
 	
 	/* return this object */

Modified: branches/soc-2010-aligorith-2/source/blender/makesdna/DNA_rigidbody_types.h
===================================================================
--- branches/soc-2010-aligorith-2/source/blender/makesdna/DNA_rigidbody_types.h	2010-07-03 09:06:09 UTC (rev 29894)
+++ branches/soc-2010-aligorith-2/source/blender/makesdna/DNA_rigidbody_types.h	2010-07-03 09:10:56 UTC (rev 29895)
@@ -101,8 +101,12 @@
 	int flag;				/* (eRigidBodyOb_Flag) */
 	
 	/* Physics Parameters */
-	float mass;				
-	float friction;
+	float mass;				/* how much object 'weighs' (i.e. absolute 'amount of stuff' it holds) */
+	
+	float friction;			/* resistance of object to movement */
+	float bounciness;		/* how 'bouncy' object is when it collides. also known as restitution */
+	
+	float margin;			/* tolerance for detecting collisions */ 
 } RigidBodyOb;
 
 

Modified: branches/soc-2010-aligorith-2/source/blender/makesrna/intern/rna_rigidbody.c
===================================================================
--- branches/soc-2010-aligorith-2/source/blender/makesrna/intern/rna_rigidbody.c	2010-07-03 09:06:09 UTC (rev 29894)
+++ branches/soc-2010-aligorith-2/source/blender/makesrna/intern/rna_rigidbody.c	2010-07-03 09:10:56 UTC (rev 29895)
@@ -119,6 +119,11 @@
 	/* set new shape type */
 	rbo->shape = value;
 	
+	/* hack: collision margin for sphere's should not be altered from the default, 
+	 * so reset it to Bullet's default 
+	 */
+	rbo->margin = 0.04;
+	
 	/* force creation of new collision shape reflecting this */
 	BKE_rigidbody_validate_sim_shape(ob, 1);
 	
@@ -146,9 +151,42 @@
 	
 	/* need to update the RigidBody's copy as well as the stored value too */
 	rbo->friction = value;
-	rbBodySetFriction(rbo->physics_object, value);
+	
+	if (rbo->physics_object)
+		rbBodySetFriction(rbo->physics_object, value);
 }
 
+static void rna_RigidBodyOb_bounciness_set(PointerRNA *ptr, float value)
+{
+	RigidBodyOb *rbo = (RigidBodyOb *)ptr->data;
+	
+	/* need to update the RigidBody's copy as well as the stored value too */
+	rbo->bounciness = value;
+	
+	if (rbo->physics_object)
+		rbBodySetRestitution(rbo->physics_object, value);
+}
+
+static int rna_RigidBodyOb_collision_margin_editable(PointerRNA *ptr)
+{
+	RigidBodyOb *rbo = (RigidBodyOb *)ptr->data;
+	
+	/* collision margin is useless for spheres, so shouldn't be editable there */
+	// TODO: should we reset it too?
+	return (rbo->shape != RB_SHAPE_SPHERE);
+}
+
+static void rna_RigidBodyOb_collision_margin_set(PointerRNA *ptr, float value)
+{
+	RigidBodyOb *rbo = (RigidBodyOb *)ptr->data;
+	
+	/* need to update the RigidBody's copy as well as the stored value too */
+	rbo->margin = value;
+	
+	if (rbo->physics_shape)
+		rbShapeSetMargin(rbo->physics_shape, value);
+}
+
 #else
 
 static void rna_def_rigidbody_world(BlenderRNA *brna)
@@ -244,6 +282,21 @@
 	RNA_def_property_ui_text(prop, "Friction", "Resistance of object to movement");
 	// TODO: setup necessary updates for this setting
 	
+	prop= RNA_def_property(srna, "bounciness", PROP_FLOAT, PROP_NONE);
+	RNA_def_property_float_sdna(prop, NULL, "bounciness");
+	RNA_def_property_range(prop, 0.0, 1.0); // XXX: this needs checking
+	RNA_def_property_float_funcs(prop, NULL, "rna_RigidBodyOb_bounciness_set", NULL);
+	RNA_def_property_ui_text(prop, "Bounciness", "How likely object is to bounce after colliding with another (0 = stays still, 1 = perfectly elastic)");
+	// TODO: setup necessary updates for this setting
+	
+	prop= RNA_def_property(srna, "collision_margin", PROP_FLOAT, PROP_NONE);
+	RNA_def_property_float_sdna(prop, NULL, "margin");
+	//RNA_def_property_range(prop, FLT_MIN, FLT_MAX); // XXX: this needs checking
+	RNA_def_property_editable_func(prop, "rna_RigidBodyOb_collision_margin_editable");
+	RNA_def_property_float_funcs(prop, NULL, "rna_RigidBodyOb_collision_margin_set", NULL);
+	RNA_def_property_ui_text(prop, "Collision Margin", "Threshold of distance near surface where collisions are still considered (best results when non-zero)");
+	// TODO: setup necessary updates for this setting
+	
 	// TODO:
 	//	- expose rest of settings relevant to sim ob
 }

Modified: branches/soc-2010-aligorith-2/source/blender/rigidbody/RBI_api.h
===================================================================
--- branches/soc-2010-aligorith-2/source/blender/rigidbody/RBI_api.h	2010-07-03 09:06:09 UTC (rev 29894)
+++ branches/soc-2010-aligorith-2/source/blender/rigidbody/RBI_api.h	2010-07-03 09:10:56 UTC (rev 29895)
@@ -107,6 +107,12 @@
 
 /* Settings ------------------------- */
 
+/* 'Type' */
+// XXX: experimental call - sets mass and other flags correctly
+extern void rbBodySetType(rbRigidBody *body, int type, float mass);
+
+/* ............ */
+
 /* Collision Shape */
 extern rbCollisionShape *rbBodyGetCollisionShape(rbRigidBody *body);
 extern void rbBodySetCollisionShape(rbRigidBody *body, rbCollisionShape *cshape);
@@ -121,8 +127,7 @@
 extern float rbBodyGetFriction(rbRigidBody *body);
 extern void rbBodySetFriction(rbRigidBody *body, float value);
 
-/* Restitution */
-// XXX: what the hell is this?!
+/* Restitution (aka 'Bounciness') */
 extern float rbBodyGetRestitution(rbRigidBody *body);
 extern void rbBodySetRestitution(rbRigidBody *body, float value);
 
@@ -189,8 +194,8 @@
 
 /* Settings --------------------------- */
 
-// TODO:
-// 	- collision margin?
+extern float rbShapeGetMargin(rbCollisionShape *cshape);
+extern void rbShapeSetMargin(rbCollisionShape *cshape, float value);
 
 /* ********************************** */
 

Modified: branches/soc-2010-aligorith-2/source/blender/rigidbody/rb_bullet_api.cpp
===================================================================
--- branches/soc-2010-aligorith-2/source/blender/rigidbody/rb_bullet_api.cpp	2010-07-03 09:06:09 UTC (rev 29894)
+++ branches/soc-2010-aligorith-2/source/blender/rigidbody/rb_bullet_api.cpp	2010-07-03 09:10:56 UTC (rev 29895)
@@ -469,4 +469,18 @@
 	btAlignedFree(shape);
 }
 
+/* Settings --------------------------- */
+
+float rbShapeGetMargin(rbCollisionShape *cshape)
+{
+	btCollisionShape *shape = reinterpret_cast<btCollisionShape*>(cshape);
+	return shape->getMargin();
+}
+
+void rbShapeSetMargin(rbCollisionShape *cshape, float value)
+{
+	btCollisionShape *shape = reinterpret_cast<btCollisionShape*>(cshape);
+	shape->setMargin(value);
+}
+
 /* ********************************** */





More information about the Bf-blender-cvs mailing list