Вращение объекта вокруг центральной точки vector2 - PullRequest
7 голосов
/ 16 ноября 2011

Мне следует предвосхитить это, потому что я не рядом с математиком.Код, который я нашел в другом вопросе, кажется, работает несколько ... за исключением того, что он заставляет объект, который я помещаю, вращаться в большом круге, в основном за пределами экрана.

Вот код:

public void Update(GameTime gameTime)
{
    Location = RotateAboutOrigin(Center, Origin, 0.01f);
}

public Vector2 RotateAboutOrigin(Vector2 point, Vector2 origin, float rotation)
{
    var u = point - origin; //point relative to origin  

    if (u == Vector2.Zero)
         return point;

    var a = (float)Math.Atan2(u.Y, u.X); //angle relative to origin  
    a += rotation; //rotate  

    //u is now the new point relative to origin  
    u = u.Length() * new Vector2((float)Math.Cos(a), (float)Math.Sin(a));
    return u + origin;
} 

Местоположение задается щелчком мыши в произвольной позиции вокруг центрального вектора.

Центр - это (как вы уже догадались) центр объекта, который я «размещаю» при нажатии.Это определяется простым делением высоты и ширины текстуры.

Источник - это вектор2, вокруг которого я пытаюсь вращаться.Он статически установлен на 384 384


Насколько я могу судить, он получает расстояние между двумя векторами, а затем использует atan2 для определения угла.Остальное потом для меня загадка.Я знаю, что я должен узнать, что все делает, и я собираюсь поступить в колледж (только на десять лет позже), начиная с весны.Я пытался читать их, но я потерян.Буду признателен за любую помощь.

Кроме того, если у вас есть хороший сайт для чайников, который вы можете порекомендовать, я был бы рад прочитать его.

Ответы [ 2 ]

10 голосов
/ 16 ноября 2011

Вот альтернатива:

public Vector2 RotateAboutOrigin(Vector2 point, Vector2 origin, float rotation)
{
    return Vector2.Transform(point - origin, Matrix.CreateRotationZ(rotation)) + origin;
} 

Бит "переводить в мир, вращаться, а затем переводить назад".

Это вращает 'точку' вокруг 'источника' радианами 'вращения' независимо от того, где происхождение относительно мирового происхождения. Триггер происходит во встроенной функции CreateRotationZ (). Чтобы увидеть, как применяется триггер, отразите этот метод в каркасе.

Редактировать: исправление имени переменной

2 голосов
/ 16 ноября 2011

Это проще сделать с помощью матриц, хотя основную теорию, возможно, немного сложнее понять, вам не нужно знать все это, чтобы использовать ее (стоя на плечах гигантов и все такое).

Чтобы повернуть вектор относительно начала координат:

Vector2.Transform(PosComponent.Direction, Matrix.CreateRotationZ(-0.1f))

Где PosComponent.Direction - мой вектор, а -0.1f - это величина, на которую нужно повернуть (в радианах, а не в градусах).

Так как вы хотите повернуть вектор вокруг чего-то другого, кроме начала, вам нужно сначала переместить вектор, затем повернуть, а затем переместить его назад.Это в основном то, что делает ваш код выше, за исключением того, что для получения угла и поворота используется триг.

Выполните вращение:

  1. Вы получите точку относительноначало координат (как в вашем коде),
  2. , затем поверните либо
    • , используя trig, чтобы получить угол, измените его, затем пересчитайте вектор (как в вашем коде),
    • или используя матрицы (как в моем коде).
  3. Наконец переместите вектор назад (как в вашем коде).

Этот вопрос и мой ответ, возможно,быть полезным для понимания триггера: Получить положение точки на окружности окружности, учитывая угол?

...