2015-01-12 8 views
0

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

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

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

localTransform - комбинированная матрица поворота/масштабирования/преобразования. Строка [3] колонка [1] представляет собой Y. [3] [0] Х.

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-оси.

+0

Кажется, что вы вычисляете угол вектора от объекта к цели, но не учитываете облицовку объекта. После того, как объект был повернут за один раз, вы снова повернете его на угол вектора на следующем шаге. – Kolmar

ответ

0

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

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

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

+0

LocalTransform является постоянным между циклами. Это текущий X/Y/Z/Rotation/Scale. О, я понимаю, fAngle вычисляется каждый цикл без учета предыдущего fAngle, поэтому его просто повторяется один и тот же поворот снова и снова. Как мне регулировать угол по направлению к точке (в случае, если он движется вниз по X/Y, а не по прямой), не просто считывая угол? –

+0

Я бы, вероятно, пересчитал всю матрицу, начиная с единичной матрицы. Затем поверните на угол и переведите в текущее положение. – Joe

+0

Это сработало отлично. Я удалил 00, 01, 10 и 11 (данные вращения) каждый цикл для объектов, которые мне нужно вычислить для угла. Thankyou :) Бесконечная петля закончилась. –