Вращение Atan2 CCW CW непрерывность - PullRequest
1 голос
/ 14 января 2012

Это то, что у меня есть

  • У меня есть плоскость в 2D X, Y
  • Я установил его пункт назначения, нажав на экран X ', Y'
  • Я рассчитываю угол, на который нужно повернуться, чтобы встретиться с этим пунктом назначения:
// Calculate the angle between plane position and destination point

CVector3 facingVec = m_vDestination - m_vPosition;
fAngle = -Math::radiansToDegrees (  (float)atan2f(m_vDestination.x - m_vPosition.x, m_vDestination.y - m_vPosition.y)  )  ;

//This doesn't work, when rotating from ex. 350 degree to 0 
//plane has to go all the way around 360,350,340,330,
//...,120,...100,90,..down to zero
float angleToTurn = fAngle - m_fRotationAngle;
if(angleToTurn < 0)
{
    angleToTurn += 360.0f;
}

m_fRotationAngle += (angleToTurn) / 5;

// Move the unit towards the calculated angle m_fRotationAngle

m_vDirection.x =   (-sin(Math::degreesToRadians(m_fRotationAngle)));
m_vDirection.y =   (cos(Math::degreesToRadians(m_fRotationAngle)));

m_vPosition += ( 2 * m_vDirection * fDelta);

Вот так это выглядит

YT Video - извините за демо-версию, в данный момент я не могу ничего получить бесплатно.

Это то, что мне нужно

  • Мне нужно, чтобы он вел себя правильно, скажем, самолет поворачивается на угол 350. Я установил пункт назначения, и новый угол должен быть 15.

Вместо того, чтобы идти: 350 340 340 310 320 310 300 290, ... 10,0,15 Следует продолжить: 350,0,15

Надеюсь, вы поможете мне с этими парнями, я уже отказался от более безумного подхода - и я борюсь с этим уже несколько дней.

1 Ответ

1 голос
/ 14 января 2012

Если я правильно прочитал, вы пытаетесь найти наименьший угол для интерполяции между двумя векторами? Если это так, должен работать следующий алгоритм:

  1. Найти угол первого вектора относительно фиксированного вектора [1, 0]. Это а1.
  2. Найти угол второго вектора относительно фиксированного вектора [1, 0]. Это а2.
  3. Пусть da = a2 - a1.
  4. если да> 180, да - = 360;
  5. иначе, если da <180, da + = 360; </li>

Вам необходимо рассчитать углы относительно другого третьего вектора [1, 0], чтобы вы могли определить погоду, вращающуюся влево или вправо.

Редактировать: Я видел, что ваша ссылка на YouTube не работает, теперь я вижу, что она снова работает. Я думаю, что мой ответ, что вы после.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...