Ver código fonte

Merge pull request #1001 from RaananW/Spring-Joint

Adding a spring joint
David Catuhe 9 anos atrás
pai
commit
2ba4f9b847

+ 15 - 5
src/Physics/Plugins/babylon.cannonJSPlugin.ts

@@ -91,7 +91,7 @@
                 //try to keep the body moving in the right direction by taking old properties.
                 //Should be tested!
                 if (oldBody) {
-                    ['force', 'torque', 'velocity', 'angularVelocity'].forEach(function (param) {
+                    ['force', 'torque', 'velocity', 'angularVelocity'].forEach(function(param) {
                         impostor.physicsBody[param].copy(oldBody[param]);
                     });
                 }
@@ -174,6 +174,16 @@
                 case PhysicsJoint.DistanceJoint:
                     constraint = new CANNON.DistanceConstraint(mainBody, connectedBody, (<DistanceJointData>jointData).maxDistance || 2)
                     break;
+                case PhysicsJoint.SpringJoint:
+                    var springData = <SpringJointData>jointData;
+                    constraint = new CANNON.Spring(mainBody, connectedBody, {
+                        restLength: springData.length,
+                        stiffness: springData.stiffness,
+                        damping: springData.damping,
+                        localAnchorA: constraintData.pivotA,
+                        localAnchorB: constraintData.pivotB
+                    });
+                    break;
                 default:
                     constraint = new CANNON.PointToPointConstraint(mainBody, constraintData.pivotA, connectedBody, constraintData.pivotA, constraintData.maxForce);
                     break;
@@ -409,13 +419,13 @@
         public setVelocity(impostor: PhysicsImpostor, velocity: Vector3) {
             impostor.physicsBody.velocity.copy(velocity);
         }
-        
+
         public sleepBody(impostor: PhysicsImpostor) {
-            impostor.physicsBody.sleep();    
+            impostor.physicsBody.sleep();
         }
-        
+
         public wakeUpBody(impostor: PhysicsImpostor) {
-            impostor.physicsBody.wakeUp(); 
+            impostor.physicsBody.wakeUp();
         }
 
         public dispose() {

+ 12 - 6
src/Physics/Plugins/babylon.oimoJSPlugin.ts

@@ -21,7 +21,7 @@ module BABYLON {
 
         public executeStep(delta: number, impostors: Array<PhysicsImpostor>) {
 
-            impostors.forEach(function (impostor) {
+            impostors.forEach(function(impostor) {
                 impostor.beforeStep();
             });
 
@@ -99,7 +99,7 @@ module BABYLON {
 
                 var impostors = [impostor];
                 function addToArray(parent: AbstractMesh) {
-                    parent.getChildMeshes().forEach(function (m) {
+                    parent.getChildMeshes().forEach(function(m) {
                         if (m.physicsImpostor) {
                             impostors.push(m.physicsImpostor);
                             m.physicsImpostor._init();
@@ -242,6 +242,12 @@ module BABYLON {
                 case PhysicsJoint.BallAndSocketJoint:
                     type = "jointBall";
                     break;
+                case PhysicsJoint.SpringJoint:
+                    Tools.Warn("Oimo.js doesn't support Spring Constraint. Simulating using DistanceJoint instead");
+                    var springData = <SpringJointData>jointData;
+                    nativeJointData.min = springData.length || nativeJointData.min;
+                    //Max should also be set, just make sure it is at least min
+                    nativeJointData.max = Math.max(nativeJointData.min, nativeJointData.max);
                 case PhysicsJoint.DistanceJoint:
                     type = "jointDistance";
                     nativeJointData.max = (<DistanceJointData>jointData).maxDistance
@@ -309,13 +315,13 @@ module BABYLON {
         public setVelocity(impostor: PhysicsImpostor, velocity: Vector3) {
             impostor.physicsBody.linearVelocity.init(velocity.x, velocity.y, velocity.z);
         }
-        
+
         public sleepBody(impostor: PhysicsImpostor) {
-            impostor.physicsBody.sleep();    
+            impostor.physicsBody.sleep();
         }
-        
+
         public wakeUpBody(impostor: PhysicsImpostor) {
-            impostor.physicsBody.awake(); 
+            impostor.physicsBody.awake();
         }
 
         public dispose() {

+ 17 - 9
src/Physics/babylon.physicsJoint.ts

@@ -6,29 +6,29 @@ module BABYLON {
         connectedPivot?: Vector3;
         mainAxis?: Vector3,
         connectedAxis?: Vector3,
-        collision?: boolean //native in oimo, needs this - https://github.com/schteppe/cannon.js/blob/gh-pages/demos/collisionFilter.html in cannon
+        collision?: boolean 
         //Native Oimo/Cannon/Energy data
         nativeParams?: any;
     }
 
     export class PhysicsJoint {
-        
+
         private _physicsJoint;
-        
+
         constructor(public type: number, public jointData: PhysicsJointData) {
             jointData.nativeParams = jointData.nativeParams || {};
         }
-        
+
         public get physicsJoint() {
             return this._physicsJoint;
         }
-        
+
         public set physicsJoint(newJoint: any) {
-            
-            if(this._physicsJoint) {
+
+            if (this._physicsJoint) {
                 //remove from the wolrd
             }
-            
+
             this._physicsJoint = newJoint;
         }
         
@@ -50,12 +50,20 @@ module BABYLON {
         //Similar to a Ball-Joint. Different in params
         //TODO check!!
         public static PointToPointJoint = 8;
+        //Cannon only at the moment
+        public static SpringJoint = 9;
 
     }
-    
+
     export interface DistanceJointData extends PhysicsJointData {
         maxDistance: number;
         //Oimo - minDistance
         //Cannon - maxForce
     }
+    
+    export interface SpringJointData extends PhysicsJointData {
+        length: number;
+        stiffness: number;
+        damping: number;
+    }
 }