Сохраняя вращение между двумя объектами

9

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

введите описание изображения здесь

Любые советы о том, как мне лучше всего этого достичь?

user99
источник
Я думаю, что оба объекта будут вращаться вокруг оси центра другого объекта.
MichaelHouse

Ответы:

3

Что касается угла, просто оставьте угол второго объекта таким же, как угол первого. Для положения, когда два объекта сталкиваются друг с другом, найдите расстояние второго объекта от первого, используя формулу расстояния.

distance = math.sqrt((x2 - x1)^2 + (y2 - y1)^2)

Чтобы найти положение второго объекта относительно первого объекта:

x2 = x1 + distance * math.cos(angle)
y2 = y1 + distance * math.sin(angle)
tesselode
источник
2

В дополнение к ответу @ tesselode, я бы порекомендовал вам вести список прикрепленных объектов для каждого объекта мира в вашей игре. Нечто подобное List<WorldObject> AttachedObjects. Затем, когда вы обнаружите столкновение, вы добавите черный прямоугольник к красному AttachedObjects. После этого нужно только обновлять позиции детей, используя метод @ tesselode, каждый раз, когда вы обновляете позицию родителей.

Джесси Эмонд
источник
2

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

Когда объекты соединяются вместе, вы должны помнить разницу в углах между ними (я назову это тэтой). Я нарисовал это на рисунке 2 со стрелками из первой фигуры, нарисованными друг над другом. Пока объекты не разблокированы, угол красного объекта будет определяться углом черных плюс тета, как показано на рисунке 3.

// When Latching:
theta = Red.angle - Black.angle;

// When retrieving Red's angle:
Red.angle = Black.angle + theta

Angle Diff

Джон Макдональд
источник
1

Вы могли бы реализовать возможность иметь дочерние объекты для объекта (где на дочерние объекты автоматически влияют изменения в положении / ротации родителя). Затем при столкновении, когда они должны соединиться вместе, вы создаете невидимый объект и делаете оба прикрепленных объекта его дочерними. Затем, вместо применения преобразований (движение, вращение) к отдельным объектам, вы применяете его к большому объекту, ИЛИ вы все равно можете применить силы к отдельным дочерним объектам, что будет проверять «есть ли у меня родитель?», И если да, сила будет отправлена ​​родителю (который объединит силы всех дочерних объектов в один вектор, который будет применяться к себе).

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

+ условие, если сила, приложенная к ребенку, достаточно сильна, чтобы разорвать сустав, и вы можете справиться с «отпиранием» его, просто удалив родитель-> дочерние отношения. Если остался только один ребенок, вы также разделяете его и удаляете также невидимого родителя.

Я могу предоставить более подробную информацию (с фотографиями и, по крайней мере, псевдокод и тому подобное), если вам интересно.

код sh
источник