SpriteKit SKPhysicsBody applyTorque导致精灵位置改变

问题描述:

我有一个有趣的问题。我用相关的物理体创建了一个SKSpriteNode。SpriteKit SKPhysicsBody applyTorque导致精灵位置改变

SKTexture *shipTexture = [SKTexture textureWithImageNamed:@"Spaceship"]; 
self.heroSpriteNode = [HeroSpriteNode spriteNodeWithTexture:shipTexture size:CGSizeMake(40, 35.2)]; 
self.heroSpriteNode.physicsBody = [SKPhysicsBody bodyWithTexture:shipTexture size:CGSizeMake(40, 35.2)]; 
self.heroSpriteNode.physicsBody.dynamic = YES; 
self.heroSpriteNode.physicsBody.mass = 1000.0; 
self.heroSpriteNode.physicsBody.affectedByGravity = NO; 
self.heroSpriteNode.physicsBody.allowsRotation = YES; 
self.heroSpriteNode.physicsBody.angularDamping = 0.5; 
self.heroSpriteNode.anchorPoint = CGPointMake(0.5,0.5); 
self.heroSpriteNode.physicsBody.categoryBitMask = heroCategory; 
self.heroSpriteNode.physicsBody.contactTestBitMask = groundCategory; 
self.heroSpriteNode.physicsBody.collisionBitMask = groundCategory | edgeCategory; 

场景本身没有重力。

在更新程序中,我把applyTorque:叫做物理主体。

-(void) updateWithDeltaTime:(NSTimeInterval)seconds 
{ 
    CGFloat rotateTorque = self.rotateRate; 

    switch (self.rotateForceApplied) 
    { 
     case leftForceApplied:  
     break; 

     case rightForceApplied: 
     rotateTorque = -1.0 * rotateTorque; 
     break; 

     case zeroForceApplied: // separate from default in case behavior should change 
     rotateTorque = 0.0; 
     break; 

     default: 
     rotateTorque = 0.0; 
     break; 

     } 

    NSLog(@"before physics position: x %f, y %f", self.heroSpriteNode.position.x, self.heroSpriteNode.position.y); 

    [self.heroSpriteNode.physicsBody applyTorque:rotateTorque]; 

    NSLog(@"after physics position: x %f, y %f", self.heroSpriteNode.position.x, self.heroSpriteNode.position.y); 

} 

精灵旋转并显示旋转到位。它实际上做的是围绕中心点旋转(所以没有净横向移动)。这通过在施加转矩之前和之后记录精灵位置来看出。没有其他行动正在被应用到物理机构。位置上的移动最多只有9个点。由于相机被“英雄”精灵的约束固定,并且世界与相机一起移动(centerOnNode:示例代码),当精灵旋转时,这会导致整个世界以圆形模式移动。世界本身并不旋转,而是以与旋转相同的循环模式以相同的速度移动。

随着sprite anchorPoint为0.5,0.5,我认为它应该围绕不应该改变精灵位置的中心点旋转。

我会怎么做这个错误呢?

如果重要的话,这是iOS9,Xcode7,不在模拟器上运行的设备上运行。 (iOS9 SpriteKit文档在Apple的网站上公开发布,iOS9的公开测试版本也是如此,所以这不应该打破任何NDA,我不认为这里的任何东西是iOS9特有的)

Sprite Kit是物理引擎,试图模仿真实世界中物体的特征,所以你应该期望模拟中物理体的物体像自然界那样运行。在这种情况下,你正在旋转一个非均匀的物理体,这个物体可能会非均匀地旋转,并且可能会随时间移动(除非物体围绕其质心旋转)。如果将物理体更改为圆形,则精灵应该均匀旋转并保持在固定位置。

+0

好的,这是有道理的,而且确实解决了这个问题。我想其他的“解决方案”将是找出重心并适当地设定定位点。太多工作。虽然一个圆形的物理机构会稍微混淆接触/碰撞,但在大多数情况下,没有人应该注意到像素或三个差异。谢谢! – chadbag