Я создал объект, который движется к месту назначения с инерцией. У меня много проблем с получением объекта лицом к месту назначения. Мой код прост: он вычисляет угол, преобразует его в градусы и передает этот угол в функцию Matrix4 Rotate, которая настраивает localTransform (scenegraph).
Проблема в том, что объект появляется, а затем просто вращается бесконечно. Он медленно продвигается к своей цели, но просто продолжает вращаться. Я проверил это без перевода, он вращается независимо от места. Все, что мне нужно, это чтобы объект был направлен к месту назначения. Мои функции Translate / Rotate работают правильно, я использовал его, чтобы вращать объект, иметь объект spawn с вращением его родителя и головой в этом направлении. Они обеспечивают результаты 1: 1 с библиотекой GLM.
Я попытался поменять порядок в aTan2, убрав преобразование градусов (хотя это ничего не делает, функция поворота принимает градусы) и поменяв порядок перевода / поворота.
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);
Любой совет, как справиться с этим? Это все в двухмерных координатах, однако поворот выполняется по оси Z.
Просто догадка, но полностью ли пересчитывается матрица localTransform при каждом шаге по времени?
Или вы можете добавить вращение в матрицу, которая уже была повернута в предыдущей итерации.
Это может объяснить непрерывное вращение.