@@ -50,21 +50,30 @@ var Bounds = require('../geometry/Bounds');
5050 * @param {pair[] } pairs
5151 * @param {number } timeScale
5252 */
53- Resolver . solvePosition = function ( pairs , timeScale ) {
53+ Resolver . solvePosition = function ( pairs , bodies , timeScale ) {
5454 var i ,
55+ normalX ,
56+ normalY ,
5557 pair ,
5658 collision ,
5759 bodyA ,
5860 bodyB ,
5961 normal ,
60- bodyBtoA ,
62+ separation ,
63+ penetration ,
64+ positionImpulseA ,
65+ positionImpulseB ,
6166 contactShare ,
67+ bodyBtoAX ,
68+ bodyBtoAY ,
6269 positionImpulse ,
63- contactCount = { } ,
64- tempA = Vector . _temp [ 0 ] ,
65- tempB = Vector . _temp [ 1 ] ,
66- tempC = Vector . _temp [ 2 ] ,
67- tempD = Vector . _temp [ 3 ] ;
70+ impulseCoefficient = timeScale * Resolver . _positionDampen ;
71+
72+ for ( i = 0 ; i < bodies . length ; i ++ ) {
73+ var body = bodies [ i ] ;
74+ body . previousPositionImpulse . x = body . positionImpulse . x ;
75+ body . previousPositionImpulse . y = body . positionImpulse . y ;
76+ }
6877
6978 // find impulses required to resolve penetration
7079 for ( i = 0 ; i < pairs . length ; i ++ ) {
@@ -78,39 +87,37 @@ var Bounds = require('../geometry/Bounds');
7887 bodyB = collision . parentB ;
7988 normal = collision . normal ;
8089
81- // get current separation between body edges involved in collision
82- bodyBtoA = Vector . sub ( Vector . add ( bodyB . positionImpulse , bodyB . position , tempA ) ,
83- Vector . add ( bodyA . positionImpulse ,
84- Vector . sub ( bodyB . position , collision . penetration , tempB ) , tempC ) , tempD ) ;
90+ positionImpulseA = bodyA . previousPositionImpulse ;
91+ positionImpulseB = bodyB . previousPositionImpulse ;
8592
86- pair . separation = Vector . dot ( normal , bodyBtoA ) ;
87- }
88-
89- for ( i = 0 ; i < pairs . length ; i ++ ) {
90- pair = pairs [ i ] ;
93+ penetration = collision . penetration ;
9194
92- if ( ! pair . isActive || pair . isSensor )
93- continue ;
94-
95- collision = pair . collision ;
96- bodyA = collision . parentA ;
97- bodyB = collision . parentB ;
98- normal = collision . normal ;
99- positionImpulse = ( pair . separation - pair . slop ) * timeScale ;
95+ // bodyBtoA = positionImpulseB - positionImpulseA + penetration
96+ bodyBtoAX = positionImpulseB . x - positionImpulseA . x + penetration . x ;
97+ bodyBtoAY = positionImpulseB . y - positionImpulseA . y + penetration . y ;
98+
99+ normalX = normal . x ;
100+ normalY = normal . y ;
101+
102+ // separation = dot(normal, bodyBtoA)
103+ separation = normalX * bodyBtoAX + normalY * bodyBtoAY ;
104+ pair . separation = separation ;
105+
106+ positionImpulse = ( separation - pair . slop ) * impulseCoefficient ;
100107
101108 if ( bodyA . isStatic || bodyB . isStatic )
102109 positionImpulse *= 2 ;
103110
104111 if ( ! ( bodyA . isStatic || bodyA . isSleeping ) ) {
105- contactShare = Resolver . _positionDampen / bodyA . totalContacts ;
106- bodyA . positionImpulse . x += normal . x * positionImpulse * contactShare ;
107- bodyA . positionImpulse . y += normal . y * positionImpulse * contactShare ;
112+ contactShare = positionImpulse / bodyA . totalContacts ;
113+ bodyA . positionImpulse . x += normalX * contactShare ;
114+ bodyA . positionImpulse . y += normalY * contactShare ;
108115 }
109116
110117 if ( ! ( bodyB . isStatic || bodyB . isSleeping ) ) {
111- contactShare = Resolver . _positionDampen / bodyB . totalContacts ;
112- bodyB . positionImpulse . x -= normal . x * positionImpulse * contactShare ;
113- bodyB . positionImpulse . y -= normal . y * positionImpulse * contactShare ;
118+ contactShare = positionImpulse / bodyB . totalContacts ;
119+ bodyB . positionImpulse . x -= normalX * contactShare ;
120+ bodyB . positionImpulse . y -= normalY * contactShare ;
114121 }
115122 }
116123 } ;
0 commit comments