Как применить орбитальную гравитацию в бурундуке cocos2d

Я создаю игру для IOS в Cocos2d - Chipmunk - Spritebuilder. Мне нужно заставить персонажей вращаться вокруг точки, и у меня возникли некоторые трудности с реализацией орбит с реальной физикой. До сих пор я испробовал два метода: один из них — создать расстояние между игроком и планетой, а затем применить к игроку силу под углом 90 градусов, где создается угол между концом расстояния и воображаемой линией, проведенной в под углом 90° к нему. Он двигается как сумасшедший, и этот метод не работает для меня.

Затем я попытался вычислить 180 точек на окружности в радиусе от планеты (что является границей обнаружения и реализации ее эффектов на игроке), а затем в методе запланированного обновления [character.physicsbody applyForce:nextCircumferencePoint]; Это не работает, так как он не следует точно по пути и находится довольно далеко от него. Я думаю, что мне нужно также применить гравитационную силу к планете, которая заставит его вращаться вокруг нее. Хотя я не знаю, как рассчитать эту силу, применить ее и поможет ли она вообще.

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

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


person theideasmith    schedule 16.07.2014    source источник


Ответы (1)


Посмотрите мой ответ здесь. Это для box2d, но можно и с Chipmunk. Если положение тела изменится, орбита останется прежней. Вам просто нужно изменить скорость движения тела для ваших нужд, просто увеличить плавность и замедлить метод обновления.

person flowmachine1    schedule 16.07.2014
comment
Это прекрасно работает, но единственная проблема заключается в том, что если положение персонажа установлено внутри ограничивающей рамки другого объекта, он не будет отскакивать от него, а будет просто помещен внутрь этого другого объекта. - person theideasmith; 16.07.2014
comment
Это происходит потому, что тело не движется, а просто меняет свое положение. Как насчет body->SetLinearVelocity(newposition.x, newposition.y) вместо body->SetTransform? Сейчас не могу проверить работает или нет. Протестируй и скажи мне результат. - person flowmachine1; 17.07.2014