[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [47140] trunk/blender: BGE patch #28476: Character object physics type

Benoit Bolsee benoit.bolsee at online.be
Mon May 28 23:36:29 CEST 2012


Revision: 47140
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=47140
Author:   ben2610
Date:     2012-05-28 21:36:29 +0000 (Mon, 28 May 2012)
Log Message:
-----------
BGE patch #28476: Character object physics type
===============================================
This patch adds a new "Character" BGE physics type which uses Bullet's btKinematicCharacter for simulation instead of full-blown dynamics. It is appropiate for (player-controlled) characters, for which the other physics types often result unexpected results (bouncing off walls, sliding etc.) and for which simple kinematics offers much more precision.

"Character" can be chosen like any other physics type in the "Physics" section of the properties window. Current settings for tweaking are "Step Height" (to make the object automatically climb small steps if it collides with them), "Fall Speed" (the maximum speed that the object can have when falling) and "Jump Speed", which is currently not used.

See http://projects.blender.org/tracker/?func=detail&atid=127&aid=28476&group_id=9
for sample blends and a discussion on the patch: how to use it and what influences the behavior of the character object.

Known problem: there is a crash if the "compound" option is set in the physics panel of the Character object.

Modified Paths:
--------------
    trunk/blender/extern/bullet2/CMakeLists.txt
    trunk/blender/extern/bullet2/src/BulletCollision/BroadphaseCollision/btQuantizedBvh.h
    trunk/blender/extern/bullet2/src/BulletDynamics/Character/btKinematicCharacterController.cpp
    trunk/blender/extern/bullet2/src/SConscript
    trunk/blender/release/scripts/startup/bl_ui/properties_game.py
    trunk/blender/source/blender/blenkernel/intern/object.c
    trunk/blender/source/blender/makesdna/DNA_object_types.h
    trunk/blender/source/blender/makesrna/intern/rna_object.c
    trunk/blender/source/blender/python/generic/py_capi_utils.c
    trunk/blender/source/gameengine/Converter/BL_BlenderDataConversion.cpp
    trunk/blender/source/gameengine/Ketsji/KX_BulletPhysicsController.cpp
    trunk/blender/source/gameengine/Ketsji/KX_BulletPhysicsController.h
    trunk/blender/source/gameengine/Ketsji/KX_ConvertPhysicsObject.h
    trunk/blender/source/gameengine/Ketsji/KX_ConvertPhysicsObjects.cpp
    trunk/blender/source/gameengine/Ketsji/KX_IPhysicsController.cpp
    trunk/blender/source/gameengine/Ketsji/KX_IPhysicsController.h
    trunk/blender/source/gameengine/Ketsji/KX_Scene.cpp
    trunk/blender/source/gameengine/Physics/Bullet/CcdPhysicsController.cpp
    trunk/blender/source/gameengine/Physics/Bullet/CcdPhysicsController.h
    trunk/blender/source/gameengine/Physics/Bullet/CcdPhysicsEnvironment.cpp
    trunk/blender/source/gameengine/Physics/common/PHY_Pro.h

Modified: trunk/blender/extern/bullet2/CMakeLists.txt
===================================================================
--- trunk/blender/extern/bullet2/CMakeLists.txt	2012-05-28 21:28:48 UTC (rev 47139)
+++ trunk/blender/extern/bullet2/CMakeLists.txt	2012-05-28 21:36:29 UTC (rev 47140)
@@ -118,6 +118,7 @@
 	src/BulletCollision/NarrowPhaseCollision/btRaycastCallback.cpp
 	src/BulletCollision/NarrowPhaseCollision/btSubSimplexConvexCast.cpp
 	src/BulletCollision/NarrowPhaseCollision/btVoronoiSimplexSolver.cpp
+	src/BulletDynamics/Character/btKinematicCharacterController.cpp
 	src/BulletDynamics/ConstraintSolver/btConeTwistConstraint.cpp
 	src/BulletDynamics/ConstraintSolver/btContactConstraint.cpp
 	src/BulletDynamics/ConstraintSolver/btGeneric6DofConstraint.cpp
@@ -154,7 +155,6 @@
 	# src/BulletCollision/CollisionDispatch/btInternalEdgeUtility.cpp
 	# src/BulletCollision/CollisionShapes/btBox2dShape.cpp
 	# src/BulletCollision/CollisionShapes/btConvex2dShape.cpp
-	# src/BulletDynamics/Character/btKinematicCharacterController.cpp
 	# src/BulletDynamics/ConstraintSolver/btHinge2Constraint.cpp
 	# src/BulletDynamics/ConstraintSolver/btUniversalConstraint.cpp
 
@@ -274,6 +274,7 @@
 	src/BulletCollision/NarrowPhaseCollision/btSubSimplexConvexCast.h
 	src/BulletCollision/NarrowPhaseCollision/btVoronoiSimplexSolver.h
 	src/BulletDynamics/Character/btCharacterControllerInterface.h
+	src/BulletDynamics/Character/btKinematicCharacterController.h
 	src/BulletDynamics/ConstraintSolver/btConeTwistConstraint.h
 	src/BulletDynamics/ConstraintSolver/btConstraintSolver.h
 	src/BulletDynamics/ConstraintSolver/btContactConstraint.h
@@ -343,7 +344,6 @@
 	# src/BulletCollision/CollisionDispatch/btInternalEdgeUtility.h
 	# src/BulletCollision/CollisionShapes/btBox2dShape.h
 	# src/BulletCollision/CollisionShapes/btConvex2dShape.h
-	# src/BulletDynamics/Character/btKinematicCharacterController.h
 	# src/BulletDynamics/ConstraintSolver/btHinge2Constraint.h
 	# src/BulletDynamics/ConstraintSolver/btUniversalConstraint.h
 )

Modified: trunk/blender/extern/bullet2/src/BulletCollision/BroadphaseCollision/btQuantizedBvh.h
===================================================================
--- trunk/blender/extern/bullet2/src/BulletCollision/BroadphaseCollision/btQuantizedBvh.h	2012-05-28 21:28:48 UTC (rev 47139)
+++ trunk/blender/extern/bullet2/src/BulletCollision/BroadphaseCollision/btQuantizedBvh.h	2012-05-28 21:36:29 UTC (rev 47140)
@@ -339,7 +339,7 @@
 
 	
 	///***************************************** expert/internal use only *************************
-	void	setQuantizationValues(const btVector3& bvhAabbMin,const btVector3& bvhAabbMax,btScalar quantizationMargin=btScalar(1.0));
+	void	setQuantizationValues(const btVector3& bvhAabbMin,const btVector3& bvhAabbMax,btScalar quantizationMargin=btScalar(1.5));
 	QuantizedNodeArray&	getLeafNodeArray() {			return	m_quantizedLeafNodes;	}
 	///buildInternal is expert use only: assumes that setQuantizationValues and LeafNodeArray are initialized
 	void	buildInternal();

Modified: trunk/blender/extern/bullet2/src/BulletDynamics/Character/btKinematicCharacterController.cpp
===================================================================
--- trunk/blender/extern/bullet2/src/BulletDynamics/Character/btKinematicCharacterController.cpp	2012-05-28 21:28:48 UTC (rev 47139)
+++ trunk/blender/extern/bullet2/src/BulletDynamics/Character/btKinematicCharacterController.cpp	2012-05-28 21:36:29 UTC (rev 47140)
@@ -84,7 +84,7 @@
 		} else
 		{
 			///need to transform normal into worldspace
-			hitNormalWorld = m_hitCollisionObject->getWorldTransform().getBasis()*convexResult.m_hitNormalLocal;
+			hitNormalWorld = convexResult.m_hitCollisionObject->getWorldTransform().getBasis()*convexResult.m_hitNormalLocal;
 		}
 
 		btScalar dotUp = m_up.dot(hitNormalWorld);

Modified: trunk/blender/extern/bullet2/src/SConscript
===================================================================
--- trunk/blender/extern/bullet2/src/SConscript	2012-05-28 21:28:48 UTC (rev 47139)
+++ trunk/blender/extern/bullet2/src/SConscript	2012-05-28 21:36:29 UTC (rev 47140)
@@ -23,7 +23,7 @@
 
 linearmath_src = env.Glob("LinearMath/*.cpp")
 
-bulletdyn_src = env.Glob("BulletDynamics/Vehicle/*.cpp") + env.Glob("BulletDynamics/ConstraintSolver/*.cpp") + env.Glob("BulletDynamics/Dynamics/*.cpp")
+bulletdyn_src = env.Glob("BulletDynamics/Vehicle/*.cpp") + env.Glob("BulletDynamics/ConstraintSolver/*.cpp") + env.Glob("BulletDynamics/Dynamics/*.cpp") + env.Glob("BulletDynamics/Character/*.cpp")
 
 collision_broadphase_src = env.Glob("BulletCollision/BroadphaseCollision/*.cpp")
 collision_dispatch_src = env.Glob("BulletCollision/CollisionDispatch/*.cpp")

Modified: trunk/blender/release/scripts/startup/bl_ui/properties_game.py
===================================================================
--- trunk/blender/release/scripts/startup/bl_ui/properties_game.py	2012-05-28 21:28:48 UTC (rev 47139)
+++ trunk/blender/release/scripts/startup/bl_ui/properties_game.py	2012-05-28 21:36:29 UTC (rev 47140)
@@ -49,7 +49,12 @@
 
         physics_type = game.physics_type
 
-        if physics_type in {'DYNAMIC', 'RIGID_BODY'}:
+        if physics_type == 'CHARACTER':
+            layout.prop(game, "step_height", slider=True)
+            layout.prop(game, "jump_speed")
+            layout.prop(game, "fall_speed")
+
+        elif physics_type in {'DYNAMIC', 'RIGID_BODY'}:
             split = layout.split()
 
             col = split.column()
@@ -192,7 +197,7 @@
     def poll(cls, context):
         game = context.object.game
         rd = context.scene.render
-        return (game.physics_type in {'DYNAMIC', 'RIGID_BODY', 'SENSOR', 'SOFT_BODY', 'STATIC'}) and (rd.engine in cls.COMPAT_ENGINES)
+        return (game.physics_type in {'DYNAMIC', 'RIGID_BODY', 'SENSOR', 'SOFT_BODY', 'STATIC', 'CHARACTER'}) and (rd.engine in cls.COMPAT_ENGINES)
 
     def draw_header(self, context):
         game = context.active_object.game

Modified: trunk/blender/source/blender/blenkernel/intern/object.c
===================================================================
--- trunk/blender/source/blender/blenkernel/intern/object.c	2012-05-28 21:28:48 UTC (rev 47139)
+++ trunk/blender/source/blender/blenkernel/intern/object.c	2012-05-28 21:36:29 UTC (rev 47140)
@@ -835,6 +835,9 @@
 	/* ob->pad3 == Contact Processing Threshold */
 	ob->m_contactProcessingThreshold = 1.0f;
 	ob->obstacleRad = 1.0f;
+	ob->step_height = 0.15f;
+	ob->jump_speed = 10.0f;
+	ob->fall_speed = 55.0f;
 	
 	/* NT fluid sim defaults */
 	ob->fluidsimSettings = NULL;

Modified: trunk/blender/source/blender/makesdna/DNA_object_types.h
===================================================================
--- trunk/blender/source/blender/makesdna/DNA_object_types.h	2012-05-28 21:28:48 UTC (rev 47139)
+++ trunk/blender/source/blender/makesdna/DNA_object_types.h	2012-05-28 21:36:29 UTC (rev 47140)
@@ -204,6 +204,12 @@
 	float min_vel; /* clamp the maximum velocity 0.0 is disabled */
 	float m_contactProcessingThreshold;
 	float obstacleRad;
+	
+	/* "Character" physics properties */
+	float step_height;
+	float jump_speed;
+	float fall_speed;
+	char pad1[4];
 
 	short rotmode;		/* rotation mode - uses defines set out in DNA_action_types.h for PoseChannel rotations... */
 
@@ -483,6 +489,7 @@
 #define OB_SENSOR		0x80000
 #define OB_NAVMESH		0x100000
 #define OB_HASOBSTACLE	0x200000
+#define OB_CHARACTER		0x400000
 
 /* ob->gameflag2 */
 #define OB_NEVER_DO_ACTIVITY_CULLING	1
@@ -504,6 +511,7 @@
 #define OB_BODY_TYPE_OCCLUDER		5
 #define OB_BODY_TYPE_SENSOR			6
 #define OB_BODY_TYPE_NAVMESH		7
+#define OB_BODY_TYPE_CHARACTER			8
 
 /* ob->scavisflag */
 #define OB_VIS_SENS		1

Modified: trunk/blender/source/blender/makesrna/intern/rna_object.c
===================================================================
--- trunk/blender/source/blender/makesrna/intern/rna_object.c	2012-05-28 21:28:48 UTC (rev 47139)
+++ trunk/blender/source/blender/makesrna/intern/rna_object.c	2012-05-28 21:36:29 UTC (rev 47140)
@@ -891,6 +891,9 @@
 			ob->body_type = OB_BODY_TYPE_NO_COLLISION;
 		}
 	}
+	else if (ob->gameflag & OB_CHARACTER) {
+		ob->body_type = OB_BODY_TYPE_CHARACTER;
+	}
 	else if (ob->gameflag & OB_SENSOR) {
 		ob->body_type = OB_BODY_TYPE_SENSOR;
 	}
@@ -922,16 +925,16 @@
 	switch (ob->body_type) {
 		case OB_BODY_TYPE_SENSOR:
 			ob->gameflag |= OB_SENSOR | OB_COLLISION | OB_GHOST;
-			ob->gameflag &= ~(OB_OCCLUDER | OB_DYNAMIC | OB_RIGID_BODY | OB_SOFT_BODY | OB_ACTOR |
+			ob->gameflag &= ~(OB_OCCLUDER | OB_CHARACTER | OB_DYNAMIC | OB_RIGID_BODY | OB_SOFT_BODY | OB_ACTOR |
 			                  OB_ANISOTROPIC_FRICTION | OB_DO_FH | OB_ROT_FH | OB_COLLISION_RESPONSE | OB_NAVMESH);
 			break;
 		case OB_BODY_TYPE_OCCLUDER:
 			ob->gameflag |= OB_OCCLUDER;
-			ob->gameflag &= ~(OB_SENSOR | OB_RIGID_BODY | OB_SOFT_BODY | OB_COLLISION | OB_DYNAMIC | OB_NAVMESH);
+			ob->gameflag &= ~(OB_SENSOR | OB_RIGID_BODY | OB_SOFT_BODY | OB_COLLISION | OB_CHARACTER | OB_DYNAMIC | OB_NAVMESH);
 			break;
 		case OB_BODY_TYPE_NAVMESH:
 			ob->gameflag |= OB_NAVMESH;
-			ob->gameflag &= ~(OB_SENSOR | OB_RIGID_BODY | OB_SOFT_BODY | OB_COLLISION | OB_DYNAMIC | OB_OCCLUDER);
+			ob->gameflag &= ~(OB_SENSOR | OB_RIGID_BODY | OB_SOFT_BODY | OB_COLLISION | OB_CHARACTER | OB_DYNAMIC | OB_OCCLUDER);
 
 			if (ob->type == OB_MESH) {
 				/* could be moved into mesh UI but for now ensure mesh data layer */
@@ -940,24 +943,29 @@
 
 			break;
 		case OB_BODY_TYPE_NO_COLLISION:
-			ob->gameflag &= ~(OB_SENSOR | OB_RIGID_BODY | OB_SOFT_BODY | OB_COLLISION | OB_OCCLUDER | OB_DYNAMIC | OB_NAVMESH);
+			ob->gameflag &= ~(OB_SENSOR | OB_RIGID_BODY | OB_SOFT_BODY | OB_COLLISION | OB_CHARACTER | OB_OCCLUDER | OB_DYNAMIC | OB_NAVMESH);
 			break;
+		case OB_BODY_TYPE_CHARACTER:
+			ob->gameflag |= OB_COLLISION | OB_GHOST | OB_CHARACTER;
+			ob->gameflag &= ~(OB_SENSOR | OB_OCCLUDER | OB_DYNAMIC | OB_RIGID_BODY | OB_SOFT_BODY | OB_ACTOR
+		                     | OB_ANISOTROPIC_FRICTION | OB_DO_FH | OB_ROT_FH | OB_COLLISION_RESPONSE | OB_NAVMESH);
+		break;
 		case OB_BODY_TYPE_STATIC:
 			ob->gameflag |= OB_COLLISION;
-			ob->gameflag &= ~(OB_DYNAMIC | OB_RIGID_BODY | OB_SOFT_BODY | OB_OCCLUDER | OB_SENSOR | OB_NAVMESH);
+			ob->gameflag &= ~(OB_DYNAMIC | OB_RIGID_BODY | OB_SOFT_BODY | OB_OCCLUDER | OB_CHARACTER | OB_SENSOR | OB_NAVMESH);
 			break;
 		case OB_BODY_TYPE_DYNAMIC:

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list