Уточнение: я предполагаю, что «дыра» означает квадрат на бесконечной плоскости, вытянутый ортогонально плоскости, образуя таким образом вогнутую форму.Из вашего вопроса не ясно, может ли это быть, скажем, тонкий проводной квадрат в пространстве (было бы легче обнаружить столкновение).Сфера с 3 единицами не может пройти через квадрат с 2 единицами (предполагая, что 2 единицы - длина стороны квадрата), Вы имели в виду квадрат с 4 единицами?С идеальным квадратом из 2-х я могу придумать 3 конфигурации контактов: 1-, 2- и 4-сторонний контакт (сфера на краю, в углу и покоится на всех 4 сторонах, так как он больше, чем отверстие),Сфера никогда не может касаться внутренних стенок отверстия, только края.Здесь нет выпуклых вершин, поэтому он не может реально касаться вершин осмысленным образом (отдых на вершине квадрата даст тот же отклик, что и отдых на плоскости; это также вырожденный случай покоя в углу, когдаоба угловых контакта - одна и та же точка).
Кроме того, я предполагаю, что вы хотите непрерывное обнаружение столкновений с сферой, начинающейся в допустимой конфигурации (непроникающей).Немного сложно найти хорошие контакты, если сфера проникает сквозь дыру в углу, и вы хотите изящного восстановления от проникновения, поэтому лучше всего в качестве первого решения не допустить ее проникновения.
Я вам верюне нашел алгоритм обнаружения столкновений в Google, потому что эта конфигурация не является достаточно общей, чтобы представлять интерес для исследователей.Поскольку отверстие имеет простую, но вогнутую форму, наиболее эффективным алгоритмом обнаружения столкновений было бы смещение сферы относительно любого края отверстия (квадрата) и плоскости.
Допустим, сфера движется из точки p0 со скоростью v0.Плоскость - это плоскость XZ (y = 0), а квадрат имеет вершины (- 1,0, -1), (1,0, -1), (1,0,1), (- 1,0,1) .
Чтобы развернуть плоскость, просто найдите время t такое, что vy = 1,5 (радиус шара). Точка контакта c будет р0 + v0 * T + (0, -1.5,0) .Если эта точка контакта находится внутри квадрата отверстия (то есть | cx | <1, | cz | <1 </strong>), продолжайте движение - мяч коснется краев отверстия.В противном случае вычислите реакцию на столкновение с нормалью (0,1,0) - нормалью плоскости.
Чтобы развернуться по любому ребру, вы прокатитесь по бесконечной линии, которая образует этот край, т.е. найдите время t такое, что расстояние отцентр шара (p0 + v0 * t) линии равен радиусу шара.Если ваш сегмент имеет концы a и b и нормальное направление d = (ba) / | ba | , вы можете найти проекцию центра шара на линию: *+1027 * ((центр-а), д) * д + а .Если проекция находится на отрезке (т. Е. Проекция находится между 0 и | ba | ), то мяч касается линии.
В вашем случае вам не нужно подносить мяч к концам сегмента, но, как правило, вы должны делать это для любого выпуклого угла любой формы, против которого вы, таким образом, подметаете.
IЯ уверен, что вы можете найти много статей о реагировании на столкновения в Интернете.В простейшем случае это реакция без трения, где основная идея состоит в том, чтобы найти импульс, действующий вдоль нормали столкновения, который предотвратит проникновение шара в точку столкновения.Затем вы можете добавить какой-то импульс, чтобы сделать его бодрым.Реакция ограничена принципами сохранения энергии и импульса.В случае реакции столкновения с трением посмотрите реакцию реакции трения в колонне.В этом случае вы обнаружите, что импульс отклика ограничен конусом, и существуют разные варианты вычисления ответа, иногда с парадоксальными результатами (посмотрите парадокс Пенлеве).
Фу, это было дольшечем планировалосьНадеюсь, это кому-нибудь поможет.Снова и снова.