From 51d2276dad8c4e2602c1ce502605218a76d05f7b Mon Sep 17 00:00:00 2001 From: Dave Schuyler Date: Fri, 5 Dec 2003 08:23:24 +0000 Subject: [PATCH] work in progress, working on jump clipping against a wall --- panda/src/collide/collisionHandlerPusher.cxx | 22 +++- panda/src/collide/collisionHandlerPusher.h | 1 + panda/src/physics/physicsCollisionHandler.I | 33 ++++++ panda/src/physics/physicsCollisionHandler.cxx | 101 ++++++++++++------ panda/src/physics/physicsCollisionHandler.h | 16 +++ 5 files changed, 138 insertions(+), 35 deletions(-) diff --git a/panda/src/collide/collisionHandlerPusher.cxx b/panda/src/collide/collisionHandlerPusher.cxx index ec86f3e919..d67e35fec0 100644 --- a/panda/src/collide/collisionHandlerPusher.cxx +++ b/panda/src/collide/collisionHandlerPusher.cxx @@ -245,12 +245,16 @@ handle_entries() { } #endif + // This is the part where the node actually gets moved: CPT(TransformState) trans = def._target.get_transform(); LVecBase3f pos = trans->get_pos(); pos += net_shove * trans->get_mat(); def._target.set_transform(trans->set_pos(pos)); def.updated_transform(); + // We call this to allow derived classes to do other + // fix-ups as they see fit: + apply_net_shove(def, net_shove, force_normal); apply_linear_force(def, force_normal); } } @@ -261,10 +265,22 @@ handle_entries() { } //////////////////////////////////////////////////////////////////// -// Function: CollisionHandlerPusher::apply_linear_force +// Function: CollisionHandlerPusher::apply_net_shove // Access: Protected, Virtual -// Description: +// Description: This is an optional hook for derived classes to do +// some work with the ColliderDef and the force vector. //////////////////////////////////////////////////////////////////// void CollisionHandlerPusher:: -apply_linear_force(ColliderDef &, const LVector3f &) { +apply_net_shove(ColliderDef &def, const LVector3f &net_shove, + const LVector3f &force_normal) { +} + +//////////////////////////////////////////////////////////////////// +// Function: CollisionHandlerPusher::apply_linear_force +// Access: Protected, Virtual +// Description: This is an optional hook for derived classes to do +// some work with the ColliderDef and the force vector. +//////////////////////////////////////////////////////////////////// +void CollisionHandlerPusher:: +apply_linear_force(ColliderDef &def, const LVector3f &force_normal) { } diff --git a/panda/src/collide/collisionHandlerPusher.h b/panda/src/collide/collisionHandlerPusher.h index 3904d4a4ff..9fdf06303c 100644 --- a/panda/src/collide/collisionHandlerPusher.h +++ b/panda/src/collide/collisionHandlerPusher.h @@ -40,6 +40,7 @@ PUBLISHED: protected: virtual bool handle_entries(); + virtual void apply_net_shove(ColliderDef &def, const LVector3f &net_shove, const LVector3f &force_normal); virtual void apply_linear_force(ColliderDef &def, const LVector3f &force); private: diff --git a/panda/src/physics/physicsCollisionHandler.I b/panda/src/physics/physicsCollisionHandler.I index c99c422c30..487da556c5 100755 --- a/panda/src/physics/physicsCollisionHandler.I +++ b/panda/src/physics/physicsCollisionHandler.I @@ -15,3 +15,36 @@ // panda3d@yahoogroups.com . // //////////////////////////////////////////////////////////////////// + + +INLINE void PhysicsCollisionHandler:: +set_almost_stationary_speed(float speed) { + _almost_stationary_speed = speed; +} + +INLINE float PhysicsCollisionHandler:: +get_almost_stationary_speed() { + return _almost_stationary_speed; +} + +INLINE void PhysicsCollisionHandler:: +set_static_friction_coef(float coef) { + _static_friction_coef = coef; +} + +INLINE float PhysicsCollisionHandler:: +get_static_friction_coef() { + return _static_friction_coef; +} + +INLINE void PhysicsCollisionHandler:: +set_dynamic_friction_coef(float coef) { + _dynamic_friction_coef = coef; +} + +INLINE float PhysicsCollisionHandler:: +get_dynamic_friction_coef() { + return _dynamic_friction_coef; +} + + diff --git a/panda/src/physics/physicsCollisionHandler.cxx b/panda/src/physics/physicsCollisionHandler.cxx index a50af5cb46..902a9ec4b0 100755 --- a/panda/src/physics/physicsCollisionHandler.cxx +++ b/panda/src/physics/physicsCollisionHandler.cxx @@ -32,6 +32,9 @@ TypeHandle PhysicsCollisionHandler::_type_handle; //////////////////////////////////////////////////////////////////// PhysicsCollisionHandler:: PhysicsCollisionHandler() { + _almost_stationary_speed = 0.1f; + _static_friction_coef=0.9f; + _dynamic_friction_coef=0.5f; set_horizontal(false); } @@ -44,6 +47,46 @@ PhysicsCollisionHandler:: ~PhysicsCollisionHandler() { } +//////////////////////////////////////////////////////////////////// +// Function: PhysicsCollisionHandler::apply_friction +// Access: +// Description: The vel parameter will be modified in place to +// account for friction. +//////////////////////////////////////////////////////////////////// +void PhysicsCollisionHandler:: +apply_friction(ColliderDef &def, LVector3f& vel, const LVector3f& force, float angle) { + if (vel!=LVector3f::zero()) { + float friction_coefficient=0.0f; + // Determine the friction: + if (fabs(force.dot(LVector3f::unit_z())<0.5f)) { + // ...The force is nearly horizontal, it is probably a wall. + physics_debug(" wall friction"); + friction_coefficient=0.0f; + } else if (vel.length()<_almost_stationary_speed) { + physics_debug(" static friction"); + friction_coefficient=_static_friction_coef; + } else { + physics_debug(" dynamic friction"); + friction_coefficient=_dynamic_friction_coef; + } + // Apply the friction: + physics_debug(" vel pre friction "<1.0f) { + cerr<<"\n\nfriction error "<get_dt(); + vel *= (1.0f-friction) * dt * dt; + #else + vel *= 1.0f-friction; + #endif + physics_debug(" vel post friction "<get_mat(); - physics_debug(" adjustment trn "<get_physics_object()->get_lcs(); physics_debug(" adjustment lcs "<1.0f) { - cerr<<"\n\nfriction error "<get_dt(); - vel *= (1.0f-friction) * dt * dt; - #else - vel *= 1.0f-friction; - #endif - physics_debug(" vel post friction "<0.5) { + vel=LVector3f::zero(); } + //vel+=adjustment; + physics_debug(" vel+adj "< old_vel.length()) { + if (IS_THRESHOLD_EQUAL(vel.length(), old_vel.length(), 0.0001f)) { + // This is a check to see if vel is staying the same: + physics_debug(" vel is about the same length: "< old_vel.length()) { // This is a check to avoid adding engergy: - physics_debug(" vel.length() > old_vel.length() "< "< "< 10.0f) { // This is a check to see if the velocity is higher than I expect it diff --git a/panda/src/physics/physicsCollisionHandler.h b/panda/src/physics/physicsCollisionHandler.h index e6a6cfbcbd..55bb0c3ccd 100755 --- a/panda/src/physics/physicsCollisionHandler.h +++ b/panda/src/physics/physicsCollisionHandler.h @@ -33,8 +33,24 @@ class EXPCL_PANDAPHYSICS PhysicsCollisionHandler : public CollisionHandlerPusher PUBLISHED: PhysicsCollisionHandler(); virtual ~PhysicsCollisionHandler(); + + // These setters and getter are a bit of a hack: + INLINE void set_almost_stationary_speed(float speed); + INLINE float get_almost_stationary_speed(); + + INLINE void set_static_friction_coef(float coef); + INLINE float get_static_friction_coef(); + + INLINE void set_dynamic_friction_coef(float coef); + INLINE float get_dynamic_friction_coef(); protected: + float _almost_stationary_speed; + float _static_friction_coef; + float _dynamic_friction_coef; + + void apply_friction(ColliderDef &def, LVector3f &vel, const LVector3f& force, float angle); + virtual void apply_net_shove(ColliderDef &def, const LVector3f &net_shove, const LVector3f &force_normal); virtual void apply_linear_force(ColliderDef &def, const LVector3f &force); public: