Comment convertir de l'espace de coordonnées global en espace local?

13

Étant donné une entité nommée EntityA, je veux définir un espace de coordonnées local, où la position de EntityAest l'origine, son vecteur de cap est l'axe X et la normale du vecteur de cap est l'axe Y:

description picturale du même

Compte tenu de leurs coordonnées globales, comment puis-je trouver la position d'une autre entité dans EntityAl'espace local de?

Un exemple: EntityAla position mondiale de (50,50) et celle de EntityB(80,90). Quelle est alors la position de EntityBdans EntityAl'espace local?

EDIT: Veuillez aller doucement sur les mathématiques.

Aviv Cohn
la source

Réponses:

21

D'accord, donc en supposant que vous savez ce qu'est la matrice de transformation mondiale pour cet objet A, il vous suffit de construire l'inverse de cette matrice et vous aurez ce dont vous avez besoin.

Supposons que la rotation, mise à l' échelle et des matrices de traduction objet A utilisé pour l' obtenir à Global espace sont R , S et T respectivement. Vous les multiplierez comme

S * R * T = W

Maintenant, prenez W et trouvez son inverse W ^ -1 en quelque sorte. L'inverse d'une matrice est cette matrice qui fait exactement le contraire. Le produit de la matrice avec son inverse est toujours la matrice d'identité.

W * W ^ -1 = I

ainsi W ^ -1 = I / W ;

Maintenant, appliquez cette matrice inverse comme transformation du monde à la scène et chaque objet sera dans les coordonnées que vous vouliez.

Pour la multiplication matricielle, voir Cette page. Pour la matrice d'identité, voir ceci.

Voici une autre page qui vous donne les matrices dont vous auriez besoin de faire W .

Dans la question ci-dessus, vous devez prendre la traduction dans l'axe des x à 50, la traduction dans l'axe des y à 50, aucune mise à l'échelle dans aucun des axes et une rotation que vous n'avez pas spécifiée.

The Light Spark
la source
Merci pour la réponse, mais je ne comprends pas grand-chose à cela. Pas très bon en mathématiques. Avec une matrice? Qu'entendez-vous par «matrices de rotation, de mise à l'échelle et de traduction»?
Aviv Cohn
Une matrice est une manière très compacte de représenter un ensemble de nombres ou d'objets interdépendants. En infographie, ils sont largement utilisés pour effectuer des calculs. vérifiez le dernier lien dans la réponse pour savoir ce que je veux dire par traduction de rotation et matrices de mise à l'échelle.oui, vous devrez lire tout cela. Sinon, vous pouvez utiliser la méthode ashes999 pour résoudre votre problème, mais cela ne gagnera pas; t tenez compte de la rotation et de la mise à l'échelle d'EntityA, le cas échéant.
The Light Spark
9

J'ai fait cela avec de la trigonométrie plutôt qu'avec des matrices dans le passé (je suis un noob matriciel). La réponse d'Ashes999 est à mi-chemin, obtenez le vecteur relatif, puis faites-le pivoter par l'inverse de l'angle de l'entité 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
la source
2
+1 Trigonométrie beaucoup plus intuitive et plus facile à utiliser que les matrices.
Ramchandra Apte
Et l'échelle? Quand l'appliquez-vous?
Llamageddon
Désolé, cela voulait dire rotation.
Llamageddon
6

Permettez-moi d'essayer de vous donner quelque chose entre la réponse de The Light Spark et la réponse d'Elliot, car d'après ce que j'ai lu, vous cherchez vraiment un algorithme à suivre et pas seulement des maths.

Énoncé du problème: Étant donné que vous avez un emplacement A (50, 50)et un en-tête (puisque vous n'en avez pas fourni un, je l'affirme y = 2 * x + 25), recherchez où B (80, 90)est relatif Aet l'en-tête.

Ce que vous voulez faire est en fait assez simple. 1) Relocalisez-vous Aà l'origine de votre système. Cela signifie simplement que les Avaleurs locales vont être les valeurs de position globale moins les valeurs de position globale de A. Adevient (0, 0)et Bdevient (30, 40).

1.1) La rubrique doit également être déplacée. C'est en fait très facile à faire, car l'ordonnée à l'origine en Atermes locaux est toujours 0, et la pente ne changera pas, nous avons donc y = 2 * xcomme en-tête.

2) Maintenant, nous devons aligner le cap précédent sur l'axe X. Alors, comment faisons-nous cela? La manière la plus simple, conceptuellement, de le faire est de convertir des coordonnées x, y en un système de coordonnées polaires. Le système de coordonnées polaires implique Rla distance à un emplacement et phiun angle de rotation par rapport à l'axe des x. Rest défini comme sqrt(x^2 + y^2)et phiest défini comme atan(y / x). De nos jours, la plupart des langages informatiques vont de l'avant et définissent une atan2(y, x)fonction qui fait exactement la même chose atan(y/x)mais le fait de telle sorte que la sortie a tendance à être de -180 degrés à 180 degrés plutôt que de 0 degrés à 360 degrés, mais les deux fonctionnent.

Bdevient ainsi R = sqrt(30^2 + 40^2) = sqrt(2500) = 50, et phi = atan2(40, 30) = 53.13en degrés.

De même, le titre change maintenant. C'est un peu compliqué à expliquer, mais parce que l'en-tête, par définition, passe toujours par notre origine A, nous n'avons pas à nous inquiéter du Rcomposant. Les titres seront toujours sous la forme de phi = CCest une constante. Dans ce cas, phi = atan(2 * x / x) = atan(2) = 63.435degrés.

Maintenant, nous pouvons faire pivoter le système pour déplacer le cap vers l'axe X du Asystème local vers . Tout comme lorsque nous sommes passés Aà l'origine du système, tout ce que nous avons à faire est de soustraire phile titre de toutes les phivaleurs du système. Ainsi , le phide Bdevient 53.13 - 63.435 = -10.305degrés.

Enfin, nous devons reconvertir les coordonnées polaires en coordonnées x, y. La formule pour effectuer cette transformation est X = R * cos(phi)et Y = R * sin(phi). Par Bconséquent, nous obtenons X = 50 * cos(-10.305) = 49.2et Y = 50 * sin(-10.305) = 8.9, donc Ben local-à A-coordonnées est proche de (49,9).

J'espère que cela aide et est assez léger pour que vous puissiez suivre les calculs.

Brian Drozd
la source
1

Vous devez connaître la pose de l'entité A dans l'espace global (x1, y1, θ), où θ est l'orientation par rapport à l'axe x.

Pour convertir l'emplacement EntityB d'une coordonnée globale (x2, y2) en coordonnée locale (x2 ', y2'):


  1. Utiliser des expressions

Du mondial au local

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

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

Du local au global

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

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

  1. Utilisation de matrices:

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

Du mondial au local

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

Du local au global

    B_global = R x B_local + A
Nino Pereira
la source
-2

Pour le dire simplement, l'entité B aurait besoin d'une référence à l'entité A. Vous auriez alors besoin de faire la différence entre la position A de l'entité et la position de l'entité B.

Lucas
la source
3
Je ne comprends pas comment cela répond à la question.
Anko