У меня есть вращающееся колесо, вращающееся с угловой скоростью ω
, ускорение отсутствует, реализовано с помощью SpriteKit.
Когда пользователь нажимает кнопку, мне нужно медленно замедлить колесо с текущего угла ∂0
и в конечном итоге под заданным углом (назовем его ∂f
).
Я создал связанный с ним mass
из 2
.
Я уже пробовал angularDamping
и SKAction.rotate(toAngle: duration:)
, но они не соответствуют моим потребностям , потому что:
- С помощью
angularDamping
я не могу легко указать угол ∂f
, где я хочу оказаться.
- С
SKAction.rotate(toAngle: duration:)
я не могу начать замедляться с текущей скорости вращения, и она не ведет себя нормально.
Единственный оставшийся подход, который я попробовал, - это использование SKAction.applyTorque(duration:)
.
Это звучит интересно, но У меня проблемы с вычислением формулы для получения правильного крутящего момента, применяемого и особенно для инерции и радиуса колеса.
Вот мой подход:
Я принимаю начальную угловую скорость ω
как:
wheelNode.physicsBody?.angularVelocity
.
Я беру mass
с wheelNode.physicsBody?.mass
Время t
является константой 10
(это означает, что через 10 секунд я хочу, чтобы колесо замедлилось до конечного угла ∂f
).
Замедление, которое я рассчитал как:
let a = -1 * ω / t
Инерция должна быть: let I = 1/2 * mass * pow(r, 2)
*. (см. примечания относительно радиуса, пожалуйста)
Затем, наконец, я рассчитал конечный крутящий момент для применения в виде: let t = I * a
(с учетом противоположности текущей угловой скорости колеса).
Примечание:
Так как у меня нет ясного, как получить радиус колеса Я попытался схватить его оба из:
-
wheelNode.physicsBody?.area
as let r = sqrt(wheelNode.physicsBody?.area ?? 0 / .pi)
- путем преобразования пикселя в метры, как указано в области документации . Тогда у меня есть
let r = self.wheelNode.radius / 150
.
Забавно: я получаю 2 разных значения: (
НЕОБХОДИМОСТЬ что-то в этом подходе не работает, потому что до сих пор я не представляю, как оказаться в указанном угле, а колесо все равно не останавливается, как должно (или крутящий момент слишком велик) и вращается в другом направлении или не достаточно). Таким образом, применяемый крутящий момент также кажется неправильным.
Знаете ли вы лучший способ добиться нужного мне результата? Это правильный подход? Если да, что не так с моими расчетами?