diff --git a/panda/src/physics/physicsObject.cxx b/panda/src/physics/physicsObject.cxx index 3dac36be8c..6fce781720 100644 --- a/panda/src/physics/physicsObject.cxx +++ b/panda/src/physics/physicsObject.cxx @@ -124,19 +124,26 @@ add_local_impact(const LPoint3f &offset_from_center_of_mass, // offset and force are in global (or parent) coordinates. //////////////////////////////////////////////////////////////////// void PhysicsObject:: -add_impact(const LPoint3f &offset_from_center_of_mass, +add_impact(const LPoint3f &offset, const LVector3f &force) { - nassertv(!offset_from_center_of_mass.is_nan()); + nassertv(!offset.is_nan()); nassertv(!force.is_nan()); - LVector3f a = -offset_from_center_of_mass; + LVector3f a = offset; LVector3f b = force; a.normalize(); b.normalize(); - float theta = a.dot(b); - LRotationf torque; - torque.set_from_axis_angle((1.0f - theta) * a.length(), b.cross(a).normalize()); - LVector3f impulse = theta * force; - add_torque(torque); + a = a.cross(b); + float angle = a.length(); + if (angle) { + LRotationf torque; + float spin = force.length()*0.1f; // todo: this should account for + // impact distance and mass. + a.normalize(); + assert(IS_THRESHOLD_EQUAL(a.length(), 1.0f, 0.001f)); + torque.set_from_axis_angle(spin, a); + add_torque(torque); + } + LVector3f impulse = (1.0f - angle) * force; add_impulse(impulse); }