Я пытаюсь оживить объект, скажем, автомобиль. Я хочу, чтобы все началось
х1, у1, z1
в точку х2, у2, z2. Он движется к этим точкам, но кажется, что это дрейфующий, а не указывает направление движения. Итак, мой вопрос: как я могу решить эту проблему в моем событии updateframe ()? Не могли бы вы указать мне на какие-нибудь хорошие ресурсы?
Спасибо.





Вам необходимо определить начальную ориентацию автомобиля и окончательную ориентацию автомобиля в пункте назначения, а затем выполнить интерполяцию между ними, чтобы определить промежуточную ориентацию для текущего временного шага.
Статья Этот описывает математику, лежащую в основе интерполяции, а также некоторые другие вещи, связанные с вращающимися объектами, которые могут быть вам полезны. gamasutra.com в целом - отличный ресурс для такого рода вещей.
Я думаю, что интерполяция дает дрейф, который вы видите. Вам необходимо смоделировать, как работает рулевое управление ... ваша функция обновления должна 1) двигать машину всегда в том направлении, куда она указывает и 2) поворачивать машину к текущей цели ... одно не должно влиять на другое, чтобы поворот произойдет и завершится быстрее, чем прибытие.
В общем, автомобиль указывает направление вдоль его вектор скорости, которое является первой производной его вектора позиция.
Например, если автомобиль движется по кругу (радиуса р) вокруг исходной точки каждые п секунд, то компонент Икс положения автомобиля определяется следующим образом:
x = r.sin(2πt/n)
а компонента Икс его вектора скорости будет:
vx = dx/dt = r.(2π/n)cos(2πt/n)
Сделайте это для всех компонентов Икс, y и z, нормализуйте результирующий вектор, и вы получите свое направление.
Во-первых, как вы представляете дорогу?
Я недавно проделал именно это и использовал шлицы Catmull-Rom для дороги. Чтобы сориентировать объект и заставить его следовать по пути сплайна, вам необходимо интерполировать текущую позицию х, у, г из т, который идет вдоль сплайна, а затем ориентировать его по системе координат Френе или Фрейм Френета для этой конкретной позиции.
В основном для каждой точки вам нужно 3 вектора: касательный, нормальный и бинормальный. Касательная будет фактическим направлением, в котором вы хотите, чтобы ваш объект (автомобиль) указывал.
Я выбираю Catmull-Rom, потому что они легко вычитают касательные в любой точке - просто сделайте (векторную) разницу между двумя другими ближайшими точками к текущей. (Допустим, вы находитесь в т, выберите т-эпсилон и т + эпсилон - эпсилон является достаточно маленькой константой).
Для двух других векторов вы можете использовать этот итерационный метод - то есть вы начинаете с известного набора векторов на одном конце и вы работаете с новым набором на основе предыдущего (каждый updateframe ()).
@JosyulaKrishna см. github.com/valentingalea/android-3d-engine/blob/master/Sourc e /…
Спасибо большое Валентин! :)
Всегда направлять машину к месту назначения просто и дешево, но это не сработает, если машина едет по кривой. В этом случае вам нужно указать автомобиль вдоль касательная линия в его текущем местоположении (см. Другие ответы выше).
переход из одного положения в другое дает объекту скорость, скорость - это вектор, и нормализация этого вектора даст вам вектор направления движения, который вы можете вставить в матрицу "просмотра". этот вектор, чтобы получить сторону, и привет, у вас есть полная матрица для управления направлением объекта в движении.
Прошло очень много времени с тех пор, как этот вопрос был опубликован, писали ли вы какой-нибудь пост в блоге или репо, в котором это делается? благодаря.