Расчет вращения по траектории - PullRequest
3 голосов
/ 15 ноября 2008

Я пытаюсь оживить объект, скажем, автомобиль. Я хочу, чтобы это пошло из пункта

x1, y1, z1

до точки x2, y2, z2 . Он движется к этим точкам, но, похоже, дрейфует , а не указывает в направлении движения. Итак, мой вопрос: как я могу решить эту проблему в моем событии updateframe ()? Не могли бы вы указать мне на некоторые хорошие ресурсы?

Спасибо.

Ответы [ 6 ]

2 голосов
/ 19 ноября 2008

Прежде всего, как вы представляете дорогу?

Я недавно сделал именно эту вещь, и я использовал Catmull-Rom сплайны для дороги. Чтобы сориентировать объект и заставить его следовать траектории сплайна, вам необходимо интерполировать текущую x, y, z позицию из t , которая идет вдоль сплайна, а затем сориентировать его вдоль Френета Система координат или Frenet Frame для этой конкретной позиции.

В основном для каждой точки вам нужно 3 вектора: касательный, нормальный и бинормальный. Тангенс будет фактическим направлением, на которое вы хотите, чтобы ваш объект (машина) указывал.

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

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

1 голос
/ 15 ноября 2008

Вам необходимо определить начальную ориентацию автомобиля и конечную ориентацию автомобиля в пункте назначения, а затем интерполировать между ними, чтобы определить промежуточную ориентацию для текущего временного шага.

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

0 голосов
/ 09 февраля 2009

переход из одного положения в другое дает объекту скорость, скорость - это вектор, а нормализация этого вектора даст вам вектор направления движения, который вы можете вставить в матрицу «взглянуть на», выполнить пересечение вверх с этим вектором, чтобы получить сторону, и эй, прежде чем у вас есть полная матрица для управления направлением объекта в движении.

0 голосов
/ 20 ноября 2008

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

0 голосов
/ 19 ноября 2008

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

Например, если автомобиль движется по кругу (радиус r ) вокруг начала координат каждые n секунд, тогда компонент x автомобиля позиция определяется по:

x = r.sin(2πt/n)

и x составляющая его вектора скорости будет:

vx = dx/dt = r.(2π/n)cos(2πt/n) 

Сделайте это для всех компонентов x , y и z , нормализуйте полученный вектор, и вы получите направление.

0 голосов
/ 15 ноября 2008

Я думаю, что интерполяция дает дрейф, который вы видите. Вам нужно смоделировать, как работает рулевое управление. Ваша функция обновления должна: 1) перемещать автомобиль всегда в направлении, куда он указывает, и 2) поворачивать автомобиль к текущей цели. произойдет и завершится быстрее, чем прибытие.

...