Как мне преобразовать из глобального координатного пространства в локальное пространство?

13

Для заданной сущности с именем EntityAя хочу определить локальное координатное пространство, где положение EntityA- это начало координат, вектор заголовка - это ось X, а нормаль вектора заголовка - это ось Y:

графическое описание того же

Учитывая их глобальные координаты, как мне найти положение другого объекта в EntityAлокальном пространстве?

Пример: EntityAглобальная позиция (50,50) и EntityB(80,90). Каково же положение EntityBв EntityAроссийском локальном пространстве?

РЕДАКТИРОВАТЬ: Пожалуйста, успокойтесь на математике.

Авив Кон
источник

Ответы:

21

Итак, предположим, что вы знаете, что такое матрица Мирового Преобразования для этого объекта A, вам просто нужно построить обратную матрицу, и вы получите то, что вам нужно.

Предположим, что матрицы поворота, масштабирования и перемещения объекта A, используемые для его доставки в Глобальное пространство, равны R , S и T соответственно. Вы умножите их вместе, как

S * R * T = W

Теперь возьмите W и найдите его обратное W ^ -1 . Инверсия матрицы - это та матрица, которая делает прямо противоположное. Произведение матрицы с ее обратной стороной всегда является единичной матрицей.

W * W ^ -1 = I

таким образом W ^ -1 = I / W ;

Теперь примените эту обратную матрицу как трансформацию мира к сцене, и каждый объект будет в нужных вам координатах.

Для умножения матрицы, см. Эту страницу. Для матрицы идентичности, смотрите это.

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

В приведенном выше вопросе вы должны принять перевод по оси х за 50, перевод по оси у за 50, без масштабирования по любой оси и поворот, который вы не указали.

Легкая искра
источник
Спасибо за ответ, но я на самом деле не понимаю этого. Не очень хорошо с математикой. С матрицей? Что вы подразумеваете под «матрицами вращения, масштабирования и перевода»?
Авив Кон
Матрица представляет собой очень компактный способ представления набора взаимосвязанных чисел или объектов. В компьютерной графике они широко используются для расчетов. проверьте последнюю ссылку в ответе, чтобы узнать, что я подразумеваю под переводом вращения и масштабированием matrices.yes, вам придется все это прочитать. В противном случае вы можете использовать метод ashes999 для решения вашей проблемы, но он не учитывает ротацию и масштабирование EntityA, если оно есть.
Легкая искра
9

Я делал это с помощью тригонометрии, а не матриц в прошлом (я нуб-матрица). Ответ Ashes999 находится на полпути, получите относительный вектор, затем поверните его на угол, обратный углу EntityA.

   relativeX = B.x - A.x
   relativeY = B.y - A.y
   rotatedX = Cos(-Angle) * relativeX - Sin(-Angle) * relativeY
   rotatedY = Cos(-Angle) * relativeY + Sin(-Angle) * relativeX
Эллиот
источник
2
+1 Намного интуитивно понятнее и проще в использовании тригонометрии, чем матрицы.
Рамчандра Апте
Как насчет масштаба? Когда вы применяете это?
Лламагеддон
Извините, значит вращение.
Лламагеддон
6

Позвольте мне попытаться дать вам что-то среднее между ответом Светлой Искры и ответом Эллиота, потому что из того, что я прочитал, вы действительно ищете алгоритм, которым нужно следовать, а не просто бросаете математику.

Постановка задачи: учитывая, что у вас есть местоположение A (50, 50)и заголовок (так как вы его не указали, я буду утверждать его как y = 2 * x + 25), найдите, где B (80, 90)относительно Aи заголовок.

То, что вы хотите сделать, на самом деле довольно просто. 1) Переместитесь Aв источник вашей системы. Это просто означает, что локальные Aзначения будут глобальными значениями позиции минус глобальные значения позиции A. Aстановится (0, 0)и Bстановится (30, 40).

1.1) Заголовок также необходимо переместить. Это на самом деле очень легко сделать, потому что y-перехват в локальных Aтерминах всегда равен 0, и наклон не изменится, поэтому мы имеем y = 2 * xв качестве заголовка.

2) Теперь нам нужно выровнять предыдущий заголовок по оси X. Итак, как мы это сделаем? Концептуально самый простой способ сделать это - преобразовать координаты x, y в полярную систему координат. Полярная система координат включает Rв себя расстояние до местоположения и phiугол поворота от оси x. Rопределяется как sqrt(x^2 + y^2)и phiопределяется как atan(y / x). Большинство компьютерных языков в наши дни идут вперед и определяют atan2(y, x)функцию, которая делает то же самое, что и atan(y/x)делает, таким образом, чтобы выходной сигнал имел тенденцию быть от -180 градусов до 180 градусов, а не от 0 градусов до 360 градусов, но работал бы либо.

Bтаким становится R = sqrt(30^2 + 40^2) = sqrt(2500) = 50и phi = atan2(40, 30) = 53.13в градусах.

Точно так же заголовок теперь изменяется. Это немного сложно объяснить, но это потому, что заголовок, по определению, всегда проходит через наше происхождение A, нам не нужно беспокоиться о Rкомпоненте. Заголовки всегда будет в форме , phi = Cгде Cявляется константой. В этом случае phi = atan(2 * x / x) = atan(2) = 63.435градусов.

Теперь мы можем повернуть систему, чтобы переместить курс на ось X локальной Aсистемы. Подобно тому, как мы перешли Aк источнику системы, все, что нам нужно сделать, это вычесть phiзаголовок из всех phiзначений в системе. Так что phiиз Bстановится 53.13 - 63.435 = -10.305градусов.

Наконец, мы должны преобразовать обратно из полярных координат в координаты x, y. Формула для этого преобразования X = R * cos(phi)и Y = R * sin(phi). Ибо, Bследовательно, мы получаем, X = 50 * cos(-10.305) = 49.2и Y = 50 * sin(-10.305) = 8.9поэтому Bв локальных Aкоординатах близко к (49,9).

Надеюсь, это поможет, и достаточно легко на математике для вас, чтобы следовать.

Брайан Дрозд
источник
1

Вам необходимо знать позу сущности A в глобальном пространстве (x1, y1, θ), где θ - ориентация относительно оси x.

Чтобы преобразовать местоположение EntityB из глобальной координаты (x2, y2) в локальную координату (x2 ', y2'):


  1. Использование выражений

От глобального к местному

x2' = (x2-x1)cosθ + (y2-y1)sinθ

y2' = -(x2-x1)sinθ + (y2-y1)cosθ

Локальный в Глобальный

x2 = x2'cosθ - y2'sinθ + x1

y2 = x2'sinθ + y2'cosθ + y1

  1. Используя матрицы:

    R = [cosθ   -sinθ
    
         sinθ    cosθ]
    
    A = [x1
         y1]
    
    B_global = [x2
                y2]
    
    B_local = [x2' 
               y2']
    

От глобального к местному

    B_local = inv(R) x (B_global - A)

Локальный в Глобальный

    B_global = R x B_local + A
Нино Перейра
источник
-2

Проще говоря, для сущности B потребуется ссылка на сущность A. Затем вам необходимо получить разницу между позицией A субъекта и позицией B субъекта.

Лукас
источник
3
Я не понимаю, как это отвечает на вопрос.
Анко