2
0
Dave Schuyler 22 жил өмнө
parent
commit
afe8501ff7

+ 20 - 0
panda/src/physics/actorNode.I

@@ -15,3 +15,23 @@
 // [email protected] .
 //
 ////////////////////////////////////////////////////////////////////
+
+////////////////////////////////////////////////////////////////////
+//    Function : set_contact_vector
+//      Access : Public
+// Description : 
+////////////////////////////////////////////////////////////////////
+INLINE void ActorNode::
+set_contact_vector(const LVector3f &contact_vector) {
+  _contact_vector=contact_vector;
+}
+
+////////////////////////////////////////////////////////////////////
+//    Function : get_contact_vector
+//      Access : Public
+// Description : 
+////////////////////////////////////////////////////////////////////
+INLINE const LVector3f &ActorNode::
+get_contact_vector() const {
+  return _contact_vector;
+}

+ 4 - 0
panda/src/physics/actorNode.h

@@ -38,6 +38,9 @@ PUBLISHED:
   virtual ~ActorNode();
   
   PhysicsObject *get_physics_object() { return _mass_center; }
+  
+  void set_contact_vector(const LVector3f &contact_vector);
+  const LVector3f &get_contact_vector() const;
 
   // update the parent scene graph node with PhysicsObject information
   // i.e. copy from PhysicsObject to PandaNode
@@ -48,6 +51,7 @@ PUBLISHED:
 
 private:
   PhysicsObject *_mass_center;
+  LVector3f _contact_vector;
   bool _ok_to_callback;
 
   // node hook if the client changes the node's transform.

+ 48 - 48
panda/src/physics/physicsCollisionHandler.cxx

@@ -55,55 +55,55 @@ apply_linear_force(ColliderDef &def, const LVector3f &force) {
   if (force == LVector3f::zero()) {
     return;
   }
-  
-  if (def._node) {
-    ActorNode *actor=DCAST(ActorNode, def._node);
-    float friction=1.0f;
-    LVector3f vel=actor->get_physics_object()->get_velocity();
-    LVector3f old_vel=vel;
-    LVector3f adjustment=force;
-    adjustment.normalize();
-    adjustment*=adjustment.dot(vel);
-    #if 0 //[
-    float initialVelMag=vel.length();
-    float temp=((vel-c)*friction).length();
-    if ((vel-c)[2]) {
-      cerr<<"\n\napply_linear_force"
-          <<"\n  vel "<<vel<<" mag "<<initialVelMag
-          <<"\n  force "<<force<<" mag "<<force.length()
-          <<"\n  unitForce "<<unitForce<<" mag "<<unitForce.length()
-          <<"\n  c "<<c<<" mag "<<c.length()
-          <<"\n  vel "<<vel-c<<" mag "<<(vel-c).length()
-          <<"\n  friction "<<friction
-          <<"\n  vel "<<((vel-c)*friction)<<" mag "<<temp
-          <<"\n  initialVelMag > "<<(initialVelMag>temp)  
-          <<endl;
-      if (initialVelMag<temp) {
-        cerr<<"\n*************************************"<<endl;
-      }
-    }
-    #endif //]
-    float angle=adjustment.dot(vel);
-    vel-=adjustment;
-    if (angle<=0.0f) {
-      // ...avoid amplifying the velocity by checking to see
-      // that the adjustment and the velocity are more than 
-      // right-angles (i.e. obtuse angle).
-      float almostStationary=1.0f;
-      if (vel.dot(vel)>almostStationary) {
-        friction*=0.01f; cerr<<"not almostStationary"<<endl;
-      }
-      //vel*=1.0f-friction;
-    }
-    
-    LVector3f new_vel=vel;
-    if (vel.length() > old_vel.length()) {
-      cerr<<"\nvel.length() > old_vel.length()  "<<vel.length()<<" > "<<old_vel.length()<<endl;
+  if (!def._node) {
+    return;
+  }
+  ActorNode *actor=DCAST(ActorNode, def._node);
+  float friction=0.9f;
+  LVector3f vel=actor->get_physics_object()->get_velocity();
+  LVector3f old_vel=vel;
+  LVector3f adjustment=force;
+  adjustment.normalize();
+  adjustment*=adjustment.dot(vel);
+  #if 0 //[
+  float initialVelMag=vel.length();
+  float temp=((vel-c)*friction).length();
+  if ((vel-c)[2]) {
+    cerr<<"\n\napply_linear_force"
+        <<"\n  old_vel "<<old_vel<<" len "<<old_vel.length()
+        <<"\n  force "<<force<<" len "<<force.length()
+        <<"\n  adjustment "<<adjustment<<" len"<<adjustment.length()
+        <<"\n  vel "<<vel-c<<" len "<<(vel-c).length()
+        <<"\n  friction "<<friction
+        <<"\n  vel "<<((vel-c)*friction)<<" len "<<temp
+        <<"\n  initialVelLen > "<<(initialVelMag>temp)  
+        <<endl;
+    if (initialVelMag<temp) {
+      cerr<<"\n*************************************"<<endl;
     }
-    if (vel.length() > 10.0f) {
-      cerr<<"\nvel.length() > 10.0f  "<<vel.length()<<endl;
+  }
+  #endif //]
+  float angle=adjustment.dot(vel);
+  vel-=adjustment;
+  if (angle<=0.0f) {
+    // ...avoid amplifying the velocity by checking to see
+    // that the adjustment and the velocity are more than 
+    // right-angles (i.e. obtuse angle).
+    float almostStationary=1.0f;
+    if (vel.dot(vel)>almostStationary) {
+      friction*=0.01f; cerr<<"not almostStationary"<<endl;
     }
-    
-    actor->get_physics_object()->set_velocity(vel);
+    //vel*=1.0f-friction;
   }
+
+  LVector3f new_vel=vel;
+  if (vel.length() > old_vel.length()) {
+    cerr<<"\nvel.length() > old_vel.length()  "<<vel.length()<<" > "<<old_vel.length()<<endl;
+  }
+  if (vel.length() > 10.0f) {
+    cerr<<"\nvel.length() > 10.0f  "<<vel.length()<<endl;
+  }
+
+  actor->set_contact_vector(force);
+  actor->get_physics_object()->set_velocity(vel);
 }