SUVAT 数学不会在 SpriteKit 的物理引擎中添加 (iOS - Objective C)
SUVAT Maths don't add up in SpriteKit's physics engine (iOS - Objective C)
我正在使用 SpriteKit 的内置物理引擎为 iOS 构建游戏。基本上它涉及一个弹跳球,它通过我手动设置它的初始速度移动,并通过重置与地板接触事件中的速度弹跳。
问题是,这个环境的实际数学计算不成立。使用 'SUVAT' 方程很容易确定球在以一定速度抛出后到达地板时的 x 位移应该有多远,但是(重力设置为 -9.81),它几乎没有移动几个像素.
我将问题简化为尝试将球向上(在 y 方向)射出一定距离,同样的事情发生了,它向上移动了几个点,然后就落到了地板上,至少它应该移动多远的 20 分之一。
这是我设置物理环境的方式:
self.physicsWorld.contactDelegate = self;
self.physicsWorld.gravity = CGVectorMake(0.0, -9.81);
然后这是我生成这个球(向上射门)示例的函数。从数学上讲它应该达到塔的高度:
-(void)generateTestBall {
self.ball = [SKSpriteNode spriteNodeWithImageNamed:@"ball"];
SKSpriteNode * tower = [SKSpriteNode spriteNodeWithImageNamed:@"player"];
self.ball.position = CGPointMake(self.scene.size.width/2,self.scene.size.height/2);
self.ball.size = CGSizeMake(20,20);
self.ball.color = [SKColor redColor];
self.ball.colorBlendFactor = 1;
tower.position = CGPointMake(self.scene.size.width/2 + 20,self.scene.size.height/2+100);
tower.size = CGSizeMake(20,200);
tower.color = [SKColor blueColor];
tower.colorBlendFactor = 1;
[self addChild:tower];
[self addChild:self.ball];
self.ball.physicsBody = [SKPhysicsBody bodyWithCircleOfRadius:10];
self.ball.physicsBody.affectedByGravity = YES;
self.ball.physicsBody.linearDamping = NO;
self.ball.physicsBody.dynamic = YES;
CGFloat ballVel = sqrt(2*9.81*tower.size.height);
NSLog(@"%f",ballVel);
self.ball.physicsBody.velocity = CGVectorMake(0.0f, ballVel);
}
有人能解释一下我做错了什么吗?我已经仔细检查了我的数学(我是一名数学专业的学生,所以祈祷这不是问题)!
谢谢!
史蒂夫
所以我终于弄明白了。以防万一其他人遇到同样的问题我会 post 在这里回答:
问题是,虽然重力(显然)以 ms^-2 和速度 m2^-1(复制地球)为单位,但 Objective C 中的任何距离都以点而不是所需的形式测量米。因此,任何使用从 SKSpriteNodes 等获取的 x、y 位置/大小值进行的计算都将是一个特定的因素。
经过 运行 几次测试后,我发现该系数大致为 157。这意味着您必须将 POINTS 中的任何尺寸/距离乘以 157 以获得相对的 'METRE' 值,这将起作用与 SUVAT.
实际数字本身看起来有点荒谬,因为它们都非常大(速度、距离等),但这实际上并不构成问题,因为它们现在都相互关联!
希望这对任何人都有帮助!
史蒂夫
我正在使用 SpriteKit 的内置物理引擎为 iOS 构建游戏。基本上它涉及一个弹跳球,它通过我手动设置它的初始速度移动,并通过重置与地板接触事件中的速度弹跳。
问题是,这个环境的实际数学计算不成立。使用 'SUVAT' 方程很容易确定球在以一定速度抛出后到达地板时的 x 位移应该有多远,但是(重力设置为 -9.81),它几乎没有移动几个像素.
我将问题简化为尝试将球向上(在 y 方向)射出一定距离,同样的事情发生了,它向上移动了几个点,然后就落到了地板上,至少它应该移动多远的 20 分之一。
这是我设置物理环境的方式:
self.physicsWorld.contactDelegate = self;
self.physicsWorld.gravity = CGVectorMake(0.0, -9.81);
然后这是我生成这个球(向上射门)示例的函数。从数学上讲它应该达到塔的高度:
-(void)generateTestBall {
self.ball = [SKSpriteNode spriteNodeWithImageNamed:@"ball"];
SKSpriteNode * tower = [SKSpriteNode spriteNodeWithImageNamed:@"player"];
self.ball.position = CGPointMake(self.scene.size.width/2,self.scene.size.height/2);
self.ball.size = CGSizeMake(20,20);
self.ball.color = [SKColor redColor];
self.ball.colorBlendFactor = 1;
tower.position = CGPointMake(self.scene.size.width/2 + 20,self.scene.size.height/2+100);
tower.size = CGSizeMake(20,200);
tower.color = [SKColor blueColor];
tower.colorBlendFactor = 1;
[self addChild:tower];
[self addChild:self.ball];
self.ball.physicsBody = [SKPhysicsBody bodyWithCircleOfRadius:10];
self.ball.physicsBody.affectedByGravity = YES;
self.ball.physicsBody.linearDamping = NO;
self.ball.physicsBody.dynamic = YES;
CGFloat ballVel = sqrt(2*9.81*tower.size.height);
NSLog(@"%f",ballVel);
self.ball.physicsBody.velocity = CGVectorMake(0.0f, ballVel);
}
有人能解释一下我做错了什么吗?我已经仔细检查了我的数学(我是一名数学专业的学生,所以祈祷这不是问题)!
谢谢! 史蒂夫
所以我终于弄明白了。以防万一其他人遇到同样的问题我会 post 在这里回答:
问题是,虽然重力(显然)以 ms^-2 和速度 m2^-1(复制地球)为单位,但 Objective C 中的任何距离都以点而不是所需的形式测量米。因此,任何使用从 SKSpriteNodes 等获取的 x、y 位置/大小值进行的计算都将是一个特定的因素。
经过 运行 几次测试后,我发现该系数大致为 157。这意味着您必须将 POINTS 中的任何尺寸/距离乘以 157 以获得相对的 'METRE' 值,这将起作用与 SUVAT.
实际数字本身看起来有点荒谬,因为它们都非常大(速度、距离等),但这实际上并不构成问题,因为它们现在都相互关联!
希望这对任何人都有帮助! 史蒂夫