【问题标题】:SpriteKit. Confusion with applyForce opposite to gravity精灵套件。与与重力相反的 applyForce 混淆
【发布时间】:2015-08-06 14:50:54
【问题描述】:

我使用下面列出的代码作为 SpriteKit 的实验。我所做的是对它施加与重力效应相同的力,但使用反平行矢量(物体质量设置为 1.0)。该函数通过更新函数在每一帧上执行。我希望对象根本不会移动,因为 applyForce 和重力会相互补偿。

-(void)didMoveToView:(SKView *)view {

  self.anchorPoint = CGPointMake(0.5, 0.5);

  SKShapeNode *node = [SKShapeNode shapeNodeWithRect:CGRectMake(0,0,WIDTH, HEIGHT)];
  node.position = CGPointMake(30, 280);
  node.strokeColor = [SKColor whiteColor];
  node.fillColor = [SKColor purpleColor];
  node.name = @"node";

  CGSize sz = node.frame.size;
  node.physicsBody = [SKPhysicsBody bodyWithRectangleOfSize:sz center:[GameScene Center]];
  node.physicsBody.restitution = 0.3;
  node.physicsBody.mass = 1.0;
  node.physicsBody.affectedByGravity = YES;

  self.figure = node;

  [self addChild:node];

  self.physicsBody = [SKPhysicsBody bodyWithEdgeLoopFromRect:self.frame];
}


-(void)update:(CFTimeInterval)currentTime {

  [self.figure.physicsBody applyForce:CGVectorMake(
                                                 - self.physicsWorld.gravity.dx,
                                                 - self.physicsWorld.gravity.dy)];

但是,物体会像仅受重力影响一样落下。我用日志检查了质量,它始终是 1.0

经过一些实验,我发现它有一个神奇的数字。是 150。如果使用下一个更新方法,对象被休息:

-(void)update:(CFTimeInterval)currentTime {

[self.figure.physicsBody applyForce:CGVectorMake(
                                                 - self.physicsWorld.gravity.dx,
                                                 -150 * self.physicsWorld.gravity.dy)];

另外,如果物体尺寸为 150*150,质量会自动计算为 1.0。无论如何,这无济于事。行为与我们直接将质量设置为 1 相同。

如果有人知道这里发生了什么,请帮忙!

【问题讨论】:

    标签: ios objective-c iphone sprite-kit


    【解决方案1】:

    假设在 SpriteKit 中有 150 比 1 的点与米的比率。如果我们创建一个大小为 150*150 的物体,那么质量就是 1。好的,这很好,我们有一个质量等于 1.0,我们自己不会改变它。但是,接下来我们再次施加与重力相反且大小相同的力。在这种情况下,身体会再次下降。不好。

    好的,150 / 1 是点对米,我们需要将力乘以 150 来平衡力。我们可能会开始思考“嗯,其中一定有一些线索”。可能是重力矢量(0,-9.8)影响的不是公斤,不是米,而是点!好吧,让我们拥有 150*150 点的主体。为了平衡我们需要的力量(理论上):

    一方面重力:9.8牛顿(公斤*米)/秒^2)

    另一方面,我们应用力:(1.0 公斤) * 9.8 * (150 点) / (sec^2)

    所以,我们在这里错过了 150。无论如何,这似乎有点愚蠢,但 applyForce 以 ((points * kg) / sec ^ 2) 为单位,但重力加速度以牛顿 ((kilo * 米)/ sec ^ 2) (尽管它在文档中被描述为每秒米。每秒米!加速度!)。乘以质量得到力。

    【讨论】:

    • 我认为情况可能相反。 applyForce 是以米为单位的像素和重力。要获得 applyForce: 值,您将乘以像素与米的比率 (150),因此 150(pixel) /meter * (meter / sec^2) = 150 *pixel / sec^2 = applyForce value
    • @M321K 是的,也许你是对的。在这些方面重力更强大,所以它的加速度需要更大。但是,Apple 和 applyForce: is not in Newtons (meter/sec^2) 给出了错误的文档
    • 这不是坏文档,这是一个错误,报告给苹果,因为它仍然是这样。
    【解决方案2】:

    你找到了神奇的数字:D

    150 是 Sprite-kit 中的“像素与米”比率。在这里可以找到一个特别好的解释:look at the second answer by mitchellallison。当您在 update: 方法中访问重力矢量时,请记住这个比率。

    【讨论】:

    • 我明白这一点。从逻辑上讲,它应该只用于节点的面积计算。但是如果将body的质量设置为1.0,我们不关心像素和米。据说重力是米/秒^2,应用力的单位是牛顿-公斤*米/秒^2。因此,如果质量等于 1,则力应该重合。它们必须重合
    • 是的,我知道你的意思,我也是这么想的。事实证明文档有点不对劲。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-09-21
    • 1970-01-01
    • 2012-12-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多