Подтвердить что ты не робот

Способ применения zRotation так, чтобы он влиял на SKPhysicsBody соответственно?

Скажем, у меня есть SKSpriteNode, который представляет колесо автомобиля, с круговым SKPhysicsBody, успешно прикрепленным к нему. Очевидно, что жанр будет боковым прокруткой 2d автомобильной игры/симулятора.

Я хочу рассчитать всю физику в двигателе, не прибегая к физическому движку SpriteKit. Я бы хотел полностью контролировать, как рассчитываются механики двигателя, сцепления, трансмиссии и т.д. Вплоть до оборотов ведущего колеса.

С этого момента я бы с радостью отдал управление физическому движку SpriteKit, который затем подсчитал бы, что произойдет, когда вращающееся ведущее колесо коснется поверхности дороги. Автомобиль продвигается, замедляется, ускоряется и/или скольжение колес, в любом случае.

Вычисление механики для получения колеса RPM не представляет проблемы. Я просто не знаю, как это сделать.

Я могу вращать колесо, просто применяя zRotation в методе update:, например:

self.rearWheelInstance.zRotation += (self.theCar.wheelRPS/6.283 * timeSinceLastUpdate); // revolutions / 2pi = radians

Таким образом, я могу применить точный RPM, который я рассчитал ранее. Очевидным недостатком является то, что физический движок SpriteKit совершенно не обращает внимания на этот поворот. Для всего, что он знает, колесо телепортируется из одной фазы в другую, поэтому оно не создает трения с дорожной поверхностью или каким-либо другим взаимодействием с другими физическими физиками SpriteKit, если на то пошло.

С другой стороны, я могу применить крутящий момент к колесу:

[self.rearWheelInstance.physicsBody applyTorque: someTorque];

или angular импульс:

[self.rearWheelInstance.physicsBody applyAngularImpulse: someAngularImpulse];

Это вращает колесо так, как это понимает физический движок SpriteKit, тем самым делая его правильно взаимодействующим с окружающей средой.

Но если мне не хватает чего-то очевидного, это рассматривает колесо как "свободный подвижный объект", не зависящий от коленчатого вала, трансмиссии или привода axel RPM. В действительности, однако, колесо не имеет "выбора" для катания на любом другом обороте, чем то, что передается через трансмиссию на ось (если трансмиссия не находится в нейтральном положении, педаль сцепления опущена или сцепление скользит, но это целые истории).

Итак: 1) Могу ли я каким-то образом манипулировать zRotation так, чтобы физический движок SpriteKit "понимал" как вращающееся движение?

или

2) У меня есть явная ошибка в моей логике, которая указывает, что это не то, что я должен пытаться в первую очередь? Если да, не могли бы вы быть настолько любезны, чтобы указать мне на недостатки, чтобы я мог вместо этого принять лучшую практику?

4b9b3361

Ответ 1

После нескольких тупиков я заметил, что на самом деле существует возможность прямого манипулирования вращением колеса (в отличие от применения крутящего момента или удара) таким образом, который соответственно влияет на физический движок.

Трюк заключается в том, чтобы манипулировать свойством угловойValocity для физического тела колеса, например:

self.rearWheelInstance.physicsBody.angularVelocity = -self.theCar.wheelRadPS; 
// Wheel angular velocity, radians per second 
// *-1 just to flip ccw rotation to cw rotation 

Таким образом, я прямо контролирую скорость вращения приводных колес, не теряя способности взаимодействовать с другими телами в физическом моделировании SpriteKit. Это помогло мне преодолеть это препятствие, я надеюсь, что это тоже поможет кому-то другому.

Ответ 2

Простой ответ, смешение настроек 2d UI, таких как положение и zRotation, с динамической физической системой не будет иметь желаемых результатов, как вы заметили. Как вы заявляете, вам нужно будет использовать части моделирования физики, такие как импульс и импульс angular.

Две части головоломки, которые также могут помочь вам:

Физические суставы - они могут делать такие вещи, как соединить колесо с акселем, чтобы он мог свободно вращаться, устанавливать ограничения на вращение, но все же прикладывают к нему вращательные силы.

Динамическая настройка физических свойств - как увеличение трения, angular демпфирование или добавление отрицательного ускорения к оси, когда пользователь нажимает на тормоза.