Как сделать полукруглое движение? - PullRequest
1 голос
/ 18 октября 2019

Предположим, у меня есть машина в положении P0, и я хочу переместить ее в положение P1, как в следующих 4 примерах:

enter image description here

Линейныйрасстояние между P0 и P1 составляет d, а максимальная перпендикулярная высота, которую достигает движение, составляет d/3. Я хочу смоделировать это полукруглое движение по часовой стрелке от P0 до P1.

Предположим, dir = P1 - P0 (длина d) и perp - это вектор (длиной d/3), перпендикулярный dir.

Предположим, t = 0 - это начало полукруглого движения, а t = 1 - это конец, как я могу измерить угол и положение автомобиля на t = i?

1 Ответ

4 голосов
/ 18 октября 2019

Нам нужно найти угол этой дуги и центр круга.

Сначала найдите радиус.

R^2 = (d/2)^2 + (R-d/3)^2  //pythagorean
R = 13/24 * d

Теперь угол

half_angle = arcsin(12/13) ~ 67.4 degrees 
angle = 2 * half_angle ~ 135 degrees = 2.35 radians

Нормализовать вектор perp

uperp = perp / len(perp)

Получить центр круга

M = (P0 + P1)/2   //chord middle
C = M + uperp * 5/24 * d

Начальный угол

A0 = atan2(P0.Y-C.Y, P0.X-C.X)

И, наконец, координаты

Car.X = C.X + R * Cos(A0 + t * angle)
Car.Y = C.Y + R * Sin(A0 + t * angle)

В Unity это будет выглядеть так:

Vector2 startPosition;
Vector2 endPosition;
Vector2 perp;
float t;

float d = (endPosition - startPosition).magnitude;

float radius = 13f/24f * d;
float angle = 2f * Mathf.Asin(12f/13f);

Vector2 uperp = perp.normalized;

Vector2 M = (startPosition+endPosition)*0.5f;
Vector2 C = M + uperp * 5f/24f * d;

float A0 = Mathf.Atan2(startPosition.y-C.y, startPosition.x-C.x);
float At = A0 + t * angle;

Vector2 newPos = C + radius * new Vector2(Mathf.Cos(At), Mathf.Sin(At));

enter image description here

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