Войти
Box2DФорумОбщее

RevoluteJoint. повернуть тело в соответствии с положением указателя

#0
5:15, 3 сен. 2014

Всем привет. Есть два динамических тела скрепленные между собой RevoluteJoint-ом. Оба тела динамические, на них не действует гравитация, но одно из них (тело A) постоянно находиться под воздействием каких-либо сил (типа как в космосе крутится летает как попало). Второе тело (B) "болтается" на joint-е до тех пор пока неактивный указатель (палец не на экране или кнопка мыши не нажата). как только указатель становиться активным, то тело В должно повернуться в сторону указателя и поворачиваться к нему постоянно, пока указатель активен. Прошу помощи у сообщества, никак не получается высчитать направление и задать joint-у соответствующие лимиты. Высчитывать угол по двум точкам (точка джоинта и точка указателя), задавать лимиты и включать мотор? Вроде и угол тогда надо компенсировать между телом A и В. Что-то никак не догоню (. Любая помощь приветствуется! Спасибо.


#1
5:31, 3 сен. 2014

Можешь хотя бы в пейнте набросать, как это должно выглядеть? А то не понятно ничего.

Есть простое и хитрое решение.
Делаешь массу тела А большой, а тела B, наоборот, маленькой.
Когда появляется указатель, применяешь силу к тому концу тела B, которое должно быть направлено к указателю.
Сила должна быть небольшой, чтобы не сильно влиять на тело А, и направлена от точки приложения к указателю.
Тело B  будет как бы притягиваться к указателю, как к магниту (вращаясь при этом на оси джоинта).
Вроде, должно сработать.

#2
5:45, 3 сен. 2014

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

#3
6:40, 3 сен. 2014

вот так как-то:
векторы | RevoluteJoint. повернуть тело в соответствии с положением указателя

#4
7:52, 3 сен. 2014

ухх вроде сделал.
алгоритм такой:
1. находим угол пересечения прямой с осью X (прямая строится по двум точкам - координаты джоинта, координаты указателя).
2. найденный угол компенсируем углом наклона тела А путем вычитания.
3. ставим лимиты равные этому углу на джоинт и даем мотору скорость в + или - в зависимости от знака полученного угла

#5
8:45, 3 сен. 2014

Привет, ничего сложного тут нет.
Тебе просто "принудительно" нужно повернуть тело.
Упростит задачу ну или будет более благоприятно влиять на физику если центр масс поворачиваемых тел совпадет с центром крепления джоинта.
1) Для поворота используется формула косинусов, другого способа я не знаю.
С ее помощью можно вычислить угол что изображен на рис. То есть ты будешь знать куда и на сколько повернуться)
2) Используй applyForce или нечто подобное) SetTransform не советую использовать.
Рисунок:
87 | RevoluteJoint. повернуть тело в соответствии с положением указателя

Я делал подобную штуку, хотя 1:1 то же что и ты делаешь, работало нормально) Будь аккуратнее с арккосинусом, он шалит временами и из-за него могут начаться странные проблемы.

#6
9:48, 3 сен. 2014

да, это искомый угол, но если тело А тоже вращается то мы никогда не нацелимся используя applyForce, либо нужно колдовать с параметрами и постоянно ловить этот угол. setTransform не пойдет потому что висим на jointe. у меня наблюдались приличные лаги. тело дергалось хотя и поворачивало коекак. Тот алгоритм который привел работает корректно и не тяжелый совсем

#7
10:02, 3 сен. 2014

Тебе же нужно просто "красиво" повернуть тело В в сторону тача? Причем тут тело А, его вообще же можно не принимать во внимание т.к. оно не ограничивает угол поворота, оно просто висит и все.

#8
10:34, 3 сен. 2014

оно не ограничивает оно тоже движется и поворачивается вокруг своей оси. поворачиваясь вокруг совей оси тело А тащитджоинт а джоинт тащит тело В. соответственно угол у тела В уже не тот который нужен и показывает оно неправильно. в любом случае тот алгоритм который я привел выше отлично работает. все что нужно посчитать это угол по прямой между точками и вычесть из него известный угол тела А

Box2DФорумОбщее

Тема в архиве.