SpriteKit SKPhysicsBody applyTorque вызывает изменение положения спрайта

У меня есть интересная проблема. Я создаю SKSpriteNode со связанным физическим телом.

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:), это приводит к тому, что весь мир движется по кругу по мере вращения спрайта. Сам мир не вращается, а движется с той же скоростью по кругу, что и вращение.

Я думаю, что со спрайтом anchorPoint равным 0,5, 0,5 он должен вращаться вокруг центральной точки, которая не должна изменять положение спрайта.

Что бы я делал не так с этим?

Если это имеет значение, это iOS9, Xcode7, работающий на устройстве, а не в симуляторе. (Документация по SpriteKit для iOS9 находится в открытом доступе на веб-сайте Apple, как и публичная бета-версия самой iOS9, поэтому это не должно нарушать никаких соглашений о неразглашении, и я в любом случае не думаю, что здесь есть что-то конкретное для iOS9)


person chadbag    schedule 11.07.2015    source источник


Ответы (1)


Sprite Kit — это физический движок, который пытается имитировать характеристики объектов в реальном мире, поэтому вы должны ожидать, что объект с физическим телом в симуляции будет вести себя так же, как в природе. В этом случае вы вращаете неоднородное физическое тело, которое может вращаться неравномерно и, возможно, двигаться во времени (если только тело не вращается вокруг своего центра масс). Если вы измените физическое тело на круг, спрайт должен вращаться равномерно и должен оставаться в фиксированном месте.

person 0x141E    schedule 11.07.2015
comment
Хорошо, это имеет смысл, и это действительно устранило проблему. Я предполагаю, что другим решением было бы выяснить центр тяжести и установить точку привязки соответствующим образом. Слишком много работы. В то время как круглое физическое тело немного портит контакт/столкновение, в большинстве случаев никто не должен замечать пиксель или три несоответствия. Спасибо! - person chadbag; 12.07.2015