Як перетворити з глобального простору координат в локальний простір?


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 . Обернена матриця - це та матриця, яка робить якраз навпаки. Добутком матриці з її оберненою завжди є матриця тотожності.

Ш * Ш ^ -1 = Я

таким чином W ^ -1 = I / W ;

Тепер застосуйте цю обернену матрицю як перетворення світу на сцену, і кожен об'єкт буде в потрібних вам координатах.

Для матричного множення див. Цю сторінку. Для матриці ідентичності див. Це.

Ось ще одна сторінка , яка дає вам матриці, потрібно буде зробити Вт .

У вищезазначеному питанні ви повинні взяти переклад по осі x як 50, переклад по осі y як 50, без масштабування в будь-якій осі і обертання, яке ви не вказали.


Дякую за відповідь, але я насправді не дуже розумію цього. Не дуже добре з математикою. З матрицею? Що ви маєте на увазі під матрицями обертання, масштабування та перекладу?
Авів Кон

Матриця являє собою дуже компактний спосіб представлення набору взаємопов'язаних чисел або об'єктів. У комп’ютерній графіці вони широко використовуються для здійснення розрахунків. перевірте останнє посилання у відповіді, щоб знати, що я маю на увазі під перекладом обертання та масштабуванням matrices.yes, вам доведеться все це прочитати. В іншому випадку ви можете використовувати метод ashes999 для вирішення вашої проблеми, але це не призведе; t враховуйте обертання та масштабування EntityA, якщо є.
Світла іскра

9

У минулому я це робив з тригонометрією, а не матрицями (я матриця noob). Відповідь 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 Набагато інтуїтивніше і простіше у використанні тригонометрії, ніж матриці.
Рамчандра Апте

А як щодо масштабу? Коли ви застосовуєте його?
Llamageddon

Вибачте, мав на увазі обертання.
Llamageddon

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в місцевій-to - 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 потребують посилання на сутність А. Тоді вам потрібно буде отримати різницю між позицією сутності А та позицією сутності В.


3
Я не розумію, як це відповідає на питання.
Анко
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.