【问题标题】:SpriteKit ball loses all energy hitting wall, restitution=1SpriteKit 球在撞墙时失去所有能量,restitution=1
【发布时间】:2014-02-27 03:14:52
【问题描述】:

如果我在 y 方向施加 1 的冲量,球会来回弹跳而不会失去任何能量。但是,如果初始冲量为 0.5 或更低,则球在撞击墙壁时会立即失去所有能量。为什么会这样?我对 SKPhysicsBody 类的属性有很好的理解。试试这段代码,看看你的计算机上是否有同样的行为。

-(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;
}

【问题讨论】:

  • 是的。我得到了同样的行为。

标签: ios sprite-kit


【解决方案1】:

当碰撞速度足够小时(例如您的CGVector(0, 0.5)),Sprite Kit 物理引擎底层的 Box2d 会将碰撞计算为非弹性(即好像 restitution 为 0,消除任何弹性),并且节点不会反弹。

根据 Box2d documentation,这是为了防止抖动。

在 Box2d 源代码中,你甚至有这行:

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

您的冲动应高于此阈值,才能得到尊重。

【讨论】:

  • 我可以用 (10.0,3.27)、大约 18 度或更浅的角度来重现该问题。什么构成了低线速度,因为它在那个角度以相当好的速率削波?您将如何覆盖 SpriteKit 中的 b2_velocityThreshold(因为这似乎是 Box2D 论坛上的推荐答案)?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-09-30
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多