C++ Как рассчитать дугу между двумя точками 3D

Я прочитал форум, и, как я уверен, этот вопрос задавался раньше, но я не мог найти то, что искал.

Моя проблема заключается в следующем:

У меня есть AI-персонаж, движущийся по сплайну. Если этот путь заблокирован, персонаж должен двигаться по дуге вокруг него, а затем продолжать свой путь.

Ради аргументов предположим, что сплайн имеет длину 7000 единиц.

Поэтому у меня есть два трехмерных (x, y, z) вектора. Первый вектор — это текущая позиция ИИ-бота, а второй вектор — позиция за препятствием. Пока скажем так: текущая позиция сплайна + 400 единиц; позже я мог бы сделать трассировку линии, чтобы получить размер препятствия и т. д., но сейчас меня это не волнует.

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


person frankBang    schedule 17.03.2017    source источник
comment
Поскольку вопрос не имеет прямого отношения к программированию, вы можете задать его здесь http://math.stackexchange.com/.   -  person muXXmit2X    schedule 17.03.2017


Ответы (3)


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

Представьте, что вы находитесь в позиции А, а препятствие — в позиции В. Вы можете делать следующие движения:

  • От текущей позиции до A+V(B[x]+height(B),0,0)
  • Из текущей позиции в A+V(0,B[y]+width(B),0)
  • От текущей позиции до A+V(B[x]-height(B),0,0)

где V — вектор с компонентами V(x,y,z), width(B) — ширина препятствия, а B[x] — компонент x положения B. Таким образом, вы перемещались по прямоугольнику . Теперь вы можете сгладить путь, разделив этот прямоугольник пополам. 3 подразделения достаточно, чтобы сделать это достаточно гладким. Чтобы разделить, возьмите среднюю точку первого пути и проведите линию до середины второго пути. То же самое вы делаете со второго пути на третий, и теперь ваш прямоугольник становится восьмиугольником. Если это недостаточно гладко, сделайте еще несколько шагов. Это создаст новый сплайн, который вы можете использовать.

person The Quantum Physicist    schedule 17.03.2017

Я бы посмотрел на комбинацию сплайнов и системы EQS. Сплайн определяет идеальный путь для следования. Система EQS находит места рядом или на пути, избегая при этом препятствий. EQS может возвращать все действительные места назначения, поэтому вы можете вручную упорядочить их по пользовательским критериям.

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

person JonS    schedule 26.03.2017

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

person Andreas Goetze    schedule 27.03.2017