Я создал объект, который движется к месту назначения по инерции. У меня много проблем с тем, чтобы объект оказался лицом к месту назначения. Мой код прост, он вычисляет угол, преобразует его в градусы и передает этот угол в функцию 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.