Использование aTan2, чтобы повернуть объект к месту назначения

Я создал объект, который движется к месту назначения по инерции. У меня много проблем с тем, чтобы объект оказался лицом к месту назначения. Мой код прост, он вычисляет угол, преобразует его в градусы и передает этот угол в функцию Matrix4 Rotate, которая корректирует localTransform (scenegraph).

Проблема в том, что объект спаунится, а потом просто бесконечно вращается. Он медленно продвигается к своей цели, но продолжает вращаться. Пробовал без перевода, крутится независимо на месте. Все, что мне нужно, это чтобы объект повернулся лицом к месту назначения. Мои функции Translate/Rotate работают правильно, я использовал их для поворота объекта, чтобы объект появлялся с вращением его родителя и направлялся в этом направлении. Они обеспечивают результаты 1:1 с библиотекой GLM.

Я попытался поменять порядок в aTan2, удалив преобразование градусов (хотя это ничего не делает, функция Rotate принимает градусы) и поменяв порядок перевода/вращения.

localTransform — это комбинированная матрица поворота/масштабирования/перемещения. строка[3]столбец[1] — это Y. [3][0] — это X.

float fAngle = atan2(v3Destination[1] - localTransform.data[3][1] , v3Destination[0] - localTransform.data[3][0]);
float fAngleDegrees = fAngle * 180 / PI;
localTransform = Matrix4::Rotate(localTransform, fAngleDegrees, Vector3(0.0f, 0.0f, 1.0f));

Vector3 Movement;
Movement[0] = v3Destination[0] - localTransform.data[3][0];
Movement[1] = v3Destination[1] - localTransform.data[3][1];

Movement = Movement * fSpeed * Application.GetTimeStep();
localTransform = Matrix4::Translate(localTransform, Movement);

Любые советы о том, как справиться с этим? Все это в 2D-координатах, однако вращение выполняется по оси Z.


person Community    schedule 12.01.2015    source источник
comment
Похоже, вы вычисляете угол вектора от объекта к цели, но не учитываете ориентацию объекта. После того, как объект был повернут за один временной шаг, вы снова поворачиваете его на угол вектора на следующем шаге.   -  person Kolmar    schedule 12.01.2015


Ответы (1)


Просто догадка, но матрица localTransform полностью пересчитывается каждый раз?

Или вы можете добавить вращение к матрице, которая уже была повернута в предыдущей итерации.

Это могло бы объяснить непрерывное вращение.

person Joe    schedule 12.01.2015
comment
localTransform сохраняется между циклами. Это текущие значения X/Y/Z/вращения/масштаба. О, я понимаю, fAngle вычисляется в каждом цикле без учета предыдущего fAngle, так что это просто повторное применение одного и того же поворота снова и снова. Как мне продолжать регулировать угол по направлению к точке (если она движется вниз по X/Y, а не по прямой линии), не просто читая угол? - person ; 12.01.2015
comment
Я бы, наверное, пересчитал всю матрицу, начиная с единичной матрицы. Затем поворот на угол и перевод в текущую позицию. - person Joe; 12.01.2015
comment
Это сработало отлично. Я стер 00, 01, 10 и 11 (данные вращения) каждого цикла для объектов, для которых мне нужно вычислить угол. Спасибо :) Бесконечный цикл окончен. - person ; 12.01.2015