La pelota SpriteKit pierde toda la energía golpeando la panetworking, la restitución = 1

Si aplico un impulso de 1 en la dirección y, la pelota rebota hacia adelante y hacia atrás sin perder energía. Sin embargo, si el impulso inicial es 0.5 o inferior, la bola pierde toda la energía al instante cuando golpea la panetworking. ¿Por qué está pasando esto? Tengo una muy buena comprensión de las properties de la class SKPhysicsBody. Prueba este código para ver si obtienes el mismo comportamiento en tu computadora.

-(id)initWithSize:(CGSize)size { if (self = [super initWithSize:size]) { /* Setup your scene here */ self.physicsWorld.gravity = CGVectorMake(0.0f, 0.0f); SKPhysicsBody* borderBody = [SKPhysicsBody bodyWithEdgeLoopFromRect:self.frame]; self.physicsBody = borderBody; self.physicsBody.friction = 0.0f; self.backgroundColor = [SKColor colorWithRed:0.7 green:0.7 blue:0.7 alpha:1.0]; SKShapeNode *ball = [SKShapeNode node]; CGMutablePathRef pathToDraw = CGPathCreateMutable(); [ball setStrokeColor:[UIColor blackColor]]; CGPathMoveToPoint(pathToDraw, NULL, 0, 0); CGPathAddEllipseInRect(pathToDraw, NULL, CGRectMake(-16, -16, 32, 32)); ball.path = pathToDraw; ball.position = CGPointMake(size.width / 2, size.height / 2); ball.physicsBody = [SKPhysicsBody bodyWithCircleOfRadius:ball.frame.size.width/2]; ball.physicsBody.friction = 0.0f; ball.physicsBody.restitution = 1.0f; ball.physicsBody.linearDamping = 0.0f; ball.physicsBody.allowsRotation = NO; [self addChild:ball]; [ball.physicsBody applyImpulse:CGVectorMake(0, 0.5)]; } return self; } 

Cuando la velocidad de colisión es lo suficientemente pequeña (como su CGVector de (0, 0.5) ), Box2d subyacente al motor de física del Sprite Kit calculará la colisión como inelástica (es decir, como si la restitution fuera 0, eliminando cualquier bounciness) y el nodo no rebotará

Esto es, según la documentation de Box2d, para evitar la inestabilidad.

En el código fuente de Box2d, incluso tiene esta línea:

 /// A velocity threshold for elastic collisions. Any collision with a relative linear /// velocity below this threshold will be treated as inelastic. #define b2_velocityThreshold 

Su impulso debería estar por encima de este umbral para que se respete la restitución.