Всем привет. Есть два динамических тела скрепленные между собой RevoluteJoint-ом. Оба тела динамические, на них не действует гравитация, но одно из них (тело A) постоянно находиться под воздействием каких-либо сил (типа как в космосе крутится летает как попало). Второе тело (B) "болтается" на joint-е до тех пор пока неактивный указатель (палец не на экране или кнопка мыши не нажата). как только указатель становиться активным, то тело В должно повернуться в сторону указателя и поворачиваться к нему постоянно, пока указатель активен. Прошу помощи у сообщества, никак не получается высчитать направление и задать joint-у соответствующие лимиты. Высчитывать угол по двум точкам (точка джоинта и точка указателя), задавать лимиты и включать мотор? Вроде и угол тогда надо компенсировать между телом A и В. Что-то никак не догоню (. Любая помощь приветствуется! Спасибо.
Можешь хотя бы в пейнте набросать, как это должно выглядеть? А то не понятно ничего.
Есть простое и хитрое решение.
Делаешь массу тела А большой, а тела B, наоборот, маленькой.
Когда появляется указатель, применяешь силу к тому концу тела B, которое должно быть направлено к указателю.
Сила должна быть небольшой, чтобы не сильно влиять на тело А, и направлена от точки приложения к указателю.
Тело B будет как бы притягиваться к указателю, как к магниту (вращаясь при этом на оси джоинта).
Вроде, должно сработать.
чот я не знаю как и нарисовать то это. ( два динамических тела связаны револютом. свободно летают в пространстве. как только появляется указатель одно из тел начинает на него смотреть, но при этом все также свободно перемещаясь в пространстве. можно mouseJoint привязать. так еще проще. но мне это не подходит. нужно чтобы джоинт сам поворачивал тело к указателю где бы ни находился указатель и где бы ни находились эти связанные тела. Попробую нарисовать
вот так как-то:
ухх вроде сделал.
алгоритм такой:
1. находим угол пересечения прямой с осью X (прямая строится по двум точкам - координаты джоинта, координаты указателя).
2. найденный угол компенсируем углом наклона тела А путем вычитания.
3. ставим лимиты равные этому углу на джоинт и даем мотору скорость в + или - в зависимости от знака полученного угла
Привет, ничего сложного тут нет.
Тебе просто "принудительно" нужно повернуть тело.
Упростит задачу ну или будет более благоприятно влиять на физику если центр масс поворачиваемых тел совпадет с центром крепления джоинта.
1) Для поворота используется формула косинусов, другого способа я не знаю.
С ее помощью можно вычислить угол что изображен на рис. То есть ты будешь знать куда и на сколько повернуться)
2) Используй applyForce или нечто подобное) SetTransform не советую использовать.
Рисунок:
Я делал подобную штуку, хотя 1:1 то же что и ты делаешь, работало нормально) Будь аккуратнее с арккосинусом, он шалит временами и из-за него могут начаться странные проблемы.
да, это искомый угол, но если тело А тоже вращается то мы никогда не нацелимся используя applyForce, либо нужно колдовать с параметрами и постоянно ловить этот угол. setTransform не пойдет потому что висим на jointe. у меня наблюдались приличные лаги. тело дергалось хотя и поворачивало коекак. Тот алгоритм который привел работает корректно и не тяжелый совсем
Тебе же нужно просто "красиво" повернуть тело В в сторону тача? Причем тут тело А, его вообще же можно не принимать во внимание т.к. оно не ограничивает угол поворота, оно просто висит и все.
оно не ограничивает оно тоже движется и поворачивается вокруг своей оси. поворачиваясь вокруг совей оси тело А тащитджоинт а джоинт тащит тело В. соответственно угол у тела В уже не тот который нужен и показывает оно неправильно. в любом случае тот алгоритм который я привел выше отлично работает. все что нужно посчитать это угол по прямой между точками и вычесть из него известный угол тела А
Тема в архиве.