Como faço para converter do espaço global de coordenadas em um espaço local?

13

Dada uma entidade denominada EntityA, quero definir um espaço de coordenadas local, onde a posição de EntityAé a origem, seu vetor de cabeçalho é o eixo X e o normal do vetor de cabeçalho é o eixo Y:

descrição pictórica do mesmo

Dadas as coordenadas globais, como encontro a posição de outra entidade no EntityAespaço local de?

Um exemplo: EntityAa posição global de (50,50) e a de EntityB(80,90). Qual é então a posição de EntityBno EntityAespaço local 's?

EDIT: Por favor, vá com calma na matemática.

Aviv Cohn
fonte

Respostas:

21

Certo, supondo que você saiba qual é a matriz de Transformação Mundial para esse objeto A, basta construir o inverso dessa matriz e terá o que precisa.

Suponha que as matrizes de rotação, escala e conversão do objeto A usadas para levá-lo ao Espaço Global sejam R , S e T, respectivamente. Você os multiplicará juntos como

S * R * T = W

Agora, pegue W e encontre seu W ^ -1 inverso de alguma forma. O inverso de uma matriz é aquela matriz que faz exatamente o oposto. O produto da matriz com seu inverso é sempre a matriz de identidade.

W * W ^ -1 = I

portanto W ^ -1 = I / W ;

Agora aplique essa matriz inversa como a transformação do mundo na cena e cada objeto estará nas coordenadas que você queria.

Para multiplicação de matrizes, consulte Esta página. Para matriz de identidade, veja isso.

Aqui está outra página que lhe dá as matrizes que você precisa para fazer W .

Na pergunta acima, você deve considerar a translação no eixo x como 50, a translação no eixo y como 50, sem redimensionamento nos dois eixos e uma rotação que você não especificou.

The Light Spark
fonte
Obrigado pela resposta, mas na verdade eu não entendo muito disso. Não é muito bom com matemática. Com é uma matriz? O que você quer dizer com 'matrizes de rotação, redimensionamento e conversão'?
Aviv Cohn
A Matrix é uma maneira muito compacta de representar um conjunto de números inter-relacionadas ou objetos. Em computação gráfica, eles são usados ​​extensivamente para fazer cálculos. verifique o último link na resposta para saber o que quero dizer com tradução de rotação e matrizes de escala. Sim, você terá que ler tudo isso. Caso contrário, você pode usar o método de ashes999 para resolver seu problema, mas isso não será responsável pela rotação e dimensionamento da Entidade A, se houver.
The Light Spark
9

Eu fiz isso com trigonometria em vez de matrizes no passado (eu sou uma matriz noob). A resposta de Ashes999 está no meio do caminho, obtenha o vetor relativo e gire-o pelo inverso do ângulo da Entidade A.

   relativeX = B.x - A.x
   relativeY = B.y - A.y
   rotatedX = Cos(-Angle) * relativeX - Sin(-Angle) * relativeY
   rotatedY = Cos(-Angle) * relativeY + Sin(-Angle) * relativeX
Elliot
fonte
2
+1 Muito mais intuitivo e fácil de usar trigonometria do que matrizes.
Ramchandra Apte
E a balança? Quando você aplica?
Llamageddon
Desculpe, significava rotação.
Llamageddon
6

Deixe-me tentar fornecer algo em algum lugar entre a resposta do The Light Spark e a resposta de Elliot, porque pelo que li, você está realmente procurando um algoritmo a seguir e não apenas a matemática lançada para você.

Declaração do problema: Como você possui um local A (50, 50)e um cabeçalho (como você não forneceu um, eu o afirmo como y = 2 * x + 25), descubra onde B (80, 90)é relativo aA e o cabeçalho.

O que você quer fazer é realmente bastante direto. 1) Realoque Apara a origem do seu sistema. Isso significa simplesmente que os Avalores locais para valores serão os valores da posição global menos os valores da posição global A. Atorna (0, 0)- Bse e torna - se(30, 40) .

1.1) O cabeçalho também precisa ser movido. Isso é realmente muito fácil de fazer, porque a interceptação em y em Atermos locais é sempre 0 e a inclinação não muda, então temosy = 2 * x como título.

2) Agora precisamos alinhar o cabeçalho anterior ao eixo X. Então, como fazemos isso? Conceitualmente, a maneira mais fácil de fazer isso é converter de coordenadas x, y em um sistema de coordenadas polares. O sistema de coordenadas polares envolve Ra distância de um local e phium ângulo de rotação do eixo x. Ré definido como sqrt(x^2 + y^2)e phié definido como atan(y / x). Atualmente, a maioria das linguagens de computador vai em frente e define uma atan2(y, x)função que faz exatamente a mesma coisa, atan(y/x)mas de tal maneira que a saída tende a ser de -180 graus a 180 graus, em vez de 0 a 360 graus, mas ambas funcionam.

Bassim se torna R = sqrt(30^2 + 40^2) = sqrt(2500) = 50, ephi = atan2(40, 30) = 53.13 em graus.

Da mesma forma, o título agora muda. Isso é um pouco complicado de explicar, mas como o título, por definição, sempre passa por nossa origem A, não precisamos nos preocupar com o Rcomponente. Os títulos sempre estarão na forma de phi = Conde Cé uma constante. Nesse caso, phi = atan(2 * x / x) = atan(2) = 63.435graus.

Agora, podemos girar o sistema para mover o cabeçalho para o eixo X do local para o Asistema. Assim como quando mudamos Apara a origem do sistema, tudo o que precisamos fazer é subtrair phio cabeçalho de todos os phivalores no sistema. Então o phide Bse torna 53.13 - 63.435 = -10.305graus.

Finalmente, temos que converter de volta as coordenadas polares em coordenadas x, y. A fórmula para fazer essa transformação é X = R * cos(phi)e Y = R * sin(phi). Pois B, portanto, temos X = 50 * cos(-10.305) = 49.2e Y = 50 * sin(-10.305) = 8.9, portanto, Bnas Acoordenadas locais está próximo (49,9).

Espero que isso ajude e seja leve o suficiente na matemática para você seguir.

Brian Drozd
fonte
1

Você precisa conhecer a pose da Entidade A no espaço global (x1, y1, θ), onde θ é a orientação relativa ao eixo x.

Para converter o local da EntityB de uma coordenada global (x2, y2) em uma coordenada local (x2 ', y2'):


  1. Usando expressões

Global para Local

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

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

Local para Global

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

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

  1. Usando matrizes:

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

Global para Local

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

Local para Global

    B_global = R x B_local + A
Nino Pereira
fonte
-2

Em outras palavras, a entidade B precisaria de uma referência à entidade A. Você precisaria obter a diferença entre a posição A da entidade e a posição da entidade B.

Lucas
fonte
3
Não entendo como isso responde à pergunta.
Anko