В моей игре XNA у меня есть два объекта, которые сталкиваются. Когда первый объект сталкивается с другим, он может зацепиться за него и перемещать его по миру. У меня здесь проблемы с математикой (математика не моя сильная сторона). В настоящее время у меня есть вторая защелка объекта на первой и я перемещаюсь вместе с ней, но я не могу удержать ее, чтобы сохранить первоначальное направление. Таким образом, если объект направлен вверх, он должен сохранять это направление относительно того, как он вращается с исходным элементом.
Любые советы о том, как мне лучше всего этого достичь?
Ответы:
Что касается угла, просто оставьте угол второго объекта таким же, как угол первого. Для положения, когда два объекта сталкиваются друг с другом, найдите расстояние второго объекта от первого, используя формулу расстояния.
Чтобы найти положение второго объекта относительно первого объекта:
источник
В дополнение к ответу @ tesselode, я бы порекомендовал вам вести список прикрепленных объектов для каждого объекта мира в вашей игре. Нечто подобное
List<WorldObject> AttachedObjects
. Затем, когда вы обнаружите столкновение, вы добавите черный прямоугольник к красномуAttachedObjects
. После этого нужно только обновлять позиции детей, используя метод @ tesselode, каждый раз, когда вы обновляете позицию родителей.источник
Я предполагаю, что один из двух будет иметь контроль над другим, очень похоже на погрузчик. На вашем рисунке я предполагаю, что это черный, а красный - пакет. Ты только упоминаешь, что у тебя проблемы с углами, так что это все, что я расскажу.
Когда объекты соединяются вместе, вы должны помнить разницу в углах между ними (я назову это тэтой). Я нарисовал это на рисунке 2 со стрелками из первой фигуры, нарисованными друг над другом. Пока объекты не разблокированы, угол красного объекта будет определяться углом черных плюс тета, как показано на рисунке 3.
источник
Вы могли бы реализовать возможность иметь дочерние объекты для объекта (где на дочерние объекты автоматически влияют изменения в положении / ротации родителя). Затем при столкновении, когда они должны соединиться вместе, вы создаете невидимый объект и делаете оба прикрепленных объекта его дочерними. Затем, вместо применения преобразований (движение, вращение) к отдельным объектам, вы применяете его к большому объекту, ИЛИ вы все равно можете применить силы к отдельным дочерним объектам, что будет проверять «есть ли у меня родитель?», И если да, сила будет отправлена родителю (который объединит силы всех дочерних объектов в один вектор, который будет применяться к себе).
Кроме того, этот подход должен правильно обрабатывать их вращение, если вы вычисляете центр масс для невидимого родителя в соответствии с весами защелкивающихся объектов, что, по-видимому, не выполняется методом Джона (объединенный объект вращается вокруг своего нового общего центра масс, а не вокруг центра масс одного из объектов), и вы можете легко внедрить этот тип поведения без какого-либо дополнительного кода. Кажется, это более надежный и гибкий подход.
+ условие, если сила, приложенная к ребенку, достаточно сильна, чтобы разорвать сустав, и вы можете справиться с «отпиранием» его, просто удалив родитель-> дочерние отношения. Если остался только один ребенок, вы также разделяете его и удаляете также невидимого родителя.
Я могу предоставить более подробную информацию (с фотографиями и, по крайней мере, псевдокод и тому подобное), если вам интересно.
источник