Si un vecteur 3D représente un point, comment peut-il avoir une longueur?

27

J'essaie de comprendre l'arithmétique vectorielle (et en particulier son utilisation dans le moteur Unity). Je ne suis pas en mesure de comprendre comment un vecteur peut avoir une longueur (magnitude) même s'il ne représente qu'un point (position et direction)?

Est-ce à dire que la grandeur est simplement sa distance du point d'origine (0, 0, 0)? Ou est-ce que je manque quelque chose?

Mohammed Noureldin
la source
14
Prenons un scalaire, également appelé nombre. Cela peut signifier une valeur absolue, une différence, un pourcentage, etc.
Peter - Unban Robert Harvey
1
Normalizeddans le contexte signifie un nouveau vecteur qui conserve le Directionmais a Magnitudede 1. Autrement dit, le Normalizedvecteur est créé en mettant à l'échelle le vecteur d'origine.
Theraot
@Theraot, Merci beaucoup, cette phrase m'a beaucoup aidé!
Mohammed Noureldin
19
Ce n'est pas le cas. Il représente un déplacement. Il ne pointe vers un certain point que si vous le considérez comme un vecteur de position , auquel cas il indique le déplacement depuis (0, 0, 0). La longueur d'un tel vecteur de position est la distance du point à l'origine.
Polygnome
1
@Peter, je crains de ne pas être d'accord avec vous. Les définitions algébriques standard d'un vecteur signifient à peu près que ce n'est pas un point. il est souvent utile de le considérer comme tel car les vecteurs de position peuvent être utilisés pour représenter des points, mais ils ne sont pas des points. "5 mètres" est toujours une distance (ou une longueur), ce ne sera jamais un temps ou une couleur. Il est souvent utile d'utiliser différents symboles - personnellement, je n'utiliserais jamais (5, 5, 5) pour désigner un vecteur , j'utiliserais toujours (5, 5, 5) ^ T (T pour transposé) ou utiliser une représentation de colonne appropriée où pris en charge. Parce que dire qu'un vecteur est un point introduit des inexactitudes.
Polygnome

Réponses:

20

Est-ce à dire que la magnitude est simplement la distance par rapport au point d'origine (0, 0, 0)?

La réponse tl; dr peut être: Oui, vous pouvez l'imaginer comme ça.

Mais je ne suis pas sûr que cela ne conduise pas à une mauvaise compréhension.


Un vecteur n'est pas un point, et il y a une différence cruciale entre les deux!

Le fait qu'un vecteur soit généralement représenté par une "flèche" peut donner une mauvaise impression. Un vecteur n'est en fait pas une seule flèche. Il serait plus précis de dire qu'un vecteur est l'ensemble de toutes les flèches qui ont la même longueur et la même direction . (La flèche qui est généralement peinte n'est qu'un représentant de toutes ces flèches). Mais je ne veux pas aller trop loin dans les détails ennuyeux des mathématiques ici.

Plus important encore, il existe une différence cruciale entre un point et un vecteur, qui devient évidente dans la programmation graphique lorsque vous transformez le point ou le vecteur. Je ne connais pas Unity, mais d'un rapide coup d'œil à la documentation, ils modélisent la différence la plus importante entre un point et un vecteur dans la Matrix4x4classe. Il a deux fonctions différentes:

La différence est, grosso modo, qu'un vecteur n'est pas traduit, alors qu'un point l'est. Imaginez la matrice 4x4 suivante:

1.0   0.0   0.0   1.0
0.0   1.0   0.0   2.0
0.0   0.0   1.0   3.0
0.0   0.0   0.0   1.0

Il décrit une traduction de (1,2,3). Maintenant, quand vous avez le pseudocode suivant

Vector3 tp = matrix.MultiplyPoint (new Vector3(2,3,4));
Vector3 tv = matrix.MultiplyVector(new Vector3(2,3,4));

Alors tpsera (3,4,5), alors qu'il y tvaura toujours (2,3,4). La traduction d'un vecteur ne le change pas (car, comme mentionné ci-dessus, c'est l'ensemble de toutes les flèches de même ampleur et de même direction).


Le fait que Unity utilise la Vector3classe à la fois pour les vecteurs et pour les points est légitime, mais peut prêter à confusion. D'autres bibliothèques font une distinction dédiée entre Point3Det Vector3D, parfois avec une base commune comme Tuple3D.

Marco13
la source
3
Êtes-vous sûr que «un vecteur est l'ensemble de toutes les flèches qui ont la même longueur et la même direction» est logique mathématiquement? On dirait que vous parlez de certaines classes d'équivalence, mais les espaces vectoriels ne sont jamais quelque chose que j'ai lu défini comme des classes d'équivalence. - Quoi qu'il en soit, vous soulevez un point très important ... ahem, point , avec la distinction entre les espaces vectoriels et les espaces affines , qui sont les noms mathématiques des types de tous les vecteurs / de tous les points, respectivement.
partir
3
A vector is, in fact, not a single arrow, vous avez raison, représenter Vector3 comme une seule flèche est exactement ce qui m'a dérouté. +1 pour avoir mentionné cette phrase critique.
Mohammed Noureldin
@leftaroundabout Il existe différentes définitions possibles pour les vecteurs (au-delà d'être "un certain n-tuple ..." ou plus). En algèbre linéaire, imaginez l'ensemble de toutes les flèches et la relation (équivalence! -) "A la même longueur et la même direction". La factorisation de l'ensemble de toutes les flèches par cette relation donne les classes d'équivalence. Je ne voulais pas tergiverser sur les détournements mathématiques (je ne suis pas non plus mathématicien), mais j'espérais préciser qu'un vecteur n'est pas "une flèche qui commence à (0,0,0)". Le point (...) est: Un vecteur n'a pas de "position".
Marco13
2
C'est encore plus compliqué par l'utilisation informatique du terme vectorpour signifier tableau ou multiple! En C ++, vous pouvez avoir un std::vector<Vector3>exemple. A vectorde l' Vectorart.
user1118321
Ah, donc ce que vous voulez dire, à partir d'un espace affine X , vous définissez pour deux points quelconques ( p , q ) une flèche sA ( X ) comme le chemin le plus court (c'est-à-dire une fonction différenciable avec une dérivée absolue intégrée minimale) s : [0,1] → X tel que s (0) = p et s (1) = q . Alors l'espace des vecteurs est l'ensemble des classes d'équivalence A ( X ) / ~ où s ~ σ si ∂ s / ∂ t = ∂ σ/ ∂ t pour tout t ∈] 0,1 [? Cela a du sens, même si je ne pense pas que vous puissiez l'utiliser comme définition des vecteurs car la différenciation en dépend déjà.
gauche autour
36

Est-ce à dire que la magnitude est simplement la distance par rapport au point d'origine (0, 0, 0)?

C'est exactement ça.

Entre autres, un vecteur peut représenter un point (une position), une direction et / ou une vitesse, selon le contexte.

Si vous avez cette variable:

Vector3 mPosition;

Il ne représente généralement que la position, c'est-à-dire où il se trouve dans l'espace 3D.

Si vous avez cette variable:

Vector3 mDirection;

Il représente généralement la direction. Typiquement, ces vecteurs sont des vecteurs unitaires, c'est-à-dire des vecteurs de longueur 1 (mais ce n'est pas toujours nécessaire). Un vecteur unitaire et un vecteur normalisé sont la même chose, ils sont tous les deux de longueur 1. Ces vecteurs sont souvent utilisés avec d' autres vecteurs pour changer leurs positions.

Lors de la normalisation d'un vecteur, vous perdez sa longueur (son amplitude), mais la direction reste la même. Il y a des situations où vous n'avez besoin que de la direction (par exemple lorsque vous voulez déplacer un objet dans cette direction), et avoir la magnitude (non-unit-length) dans le vecteur introduirait des résultats de calcul inattendus.

Si vous avez besoin d'un vecteur normal pour un seul calcul, vous pouvez l'utiliser myVec3.normalized, cela n'affectera pas myVec3, et si vous avez l'intention d'utiliser souvent ce vecteur normalisé, vous devriez probablement créer une variable:

Vector3 myVec3Normalized = myVec3.normalized;

pour éviter les appels répétés à la normalizedméthode.

Et si vous voyez des variables:

Vector3 mVelocity;

Il représente généralement une force / vitesse: ces vecteurs représentent une direction et leur amplitude (leur longueur) est importante. Ils pourraient également être représentés avec Vector3 mDirection;et a float mSpeed;.

Tous ces éléments sont utilisés en fonction de leur origine locale, qui peut être (0, 0, 0), ou peut être une autre position.

Vaillancourt
la source
4
Il détruit une partie des informations contenues dans le vecteur, et cette information est l'ampleur. La direction reste cependant la même.
6
@Eldy Il est plus précis de noter que myVec3.normalizedrenvoie un nouveau Vector3, ayant la même direction mais la magnitude 1. myVec3est inchangée
Caleth
4
@ NPSF3000 Ce serait une secousse et un cahot , il n'y a pas de consensus sur les noms au - delà. Nous sommes tous heureux que les secousses ne soient pas courantes.
Theraot
1
@ NPSF3000 Certains suggèrent que les dérivées de position 4e, 5e et 6e devraient être snap, crackle et pop! :-D en.wikipedia.org/wiki/Snap,_Crackle_and_Pop#Physics
gbmhunter
1
Peut - être changer these vector are unit vectorsà direction vectors are unit vectorsou quelque chose? Parce que tel qu'il est maintenant, un lecteur peut être confus en pensant theseaux deux exemples précédents mPosition et mDirection . (C'est comme ça que je l'ai lu au début.)
Supr
8

Est-ce à dire que la magnitude est simplement la distance par rapport au point d'origine (0, 0, 0)?

Vous pouvez le voir de cette façon, mais seulement le voir de cette façon peut conduire à une mauvaise compréhension.


Tout d'abord, un vecteur n'est pas un point et un point n'est pas un vecteur.

La différence entre un vecteur et un point est la même qu'entre une durée et une heure de la journée . Le premier est un intervalle de temps, le second est un seul point dans le temps. C'est évidemment que 6 heures ce n'est pas la même chose que 6 heures. Vous ne diriez pas "La course dure 1 heure" et vous ne diriez pas non plus "Rencontrons à 13 heures". La course dure une heure - un intervalle - et vous vous retrouvez à 13 heures - un moment précis.

Il en va de même pour les vecteurs et les points. Un vecteur est un intervalle - un déplacement si vous voulez. Il pointe dans une certaine direction, et oui, il a une longueur.

Les points et les vecteurs sont donc liés, tout comme les durées et les heures de la journée. La course commence à 13 heures et se termine à 15 heures. Les deux sont des points dans le temps. Mais 15 heures - 13 heures = 2 heures, une durée. La course dure deux heures, pas 2 heures.

Il en va de même pour les points. La différence entre le point A et B est notée ⃗v = B - A, où ⃗v désigne un vecteur et A et B désigne des points.

Maintenant, il y a quelque chose qui a appelé un vecteur de position . Vous pouvez considérer un vecteur comme un point à un certain degré, lorsque vous dites que les vecteurs pointent de l'origine vers un certain autre point. En d'autres termes: si tous vos amis savent que vous appelez les heures de la journée comme des durées depuis minuit (0 heures), vous pouvez dire "Nous nous réunissons à 6 heures". Ils sauraient que 0 heure + 6 heures = 6 heures et donc, quand vous rencontrer. C'est en fait ce que font les temps navals. "Nous nous réunissons à six heures six cents" signifie 6 heures.

Donc, le vecteur <1,2,3> pointe vers le point (1,2,3), si vous considérez l'origine comme le point d'ancrage, et oui, la longueur de ce vecteur est la distance de ce point à l'origine.

Mais le vecteur <1,2,3> pointe également de (1,1,1) à (2,3,4), et dans ce cas, sa longueur indique la distance entre ces deux points.


Donc, comme vous pouvez le voir, un vecteur a une longueur car ce n'est pas un point, mais un intervalle - un déplacement.

Polygnome
la source
Lecture connexe: Torsors
Buster
5

Un vecteur peut représenter une ligne entre deux points dans l'espace 3D (direction et distance) ou un emplacement dans l'espace 3D (la longueur est la distance depuis l'origine).

Si vous avez le point A et le point B, alors BA = AB = la direction et la distance que vous devrez parcourir pour aller de A à B.

Ian Young
la source
Merci, mais qu'est-ce que cela signifie d'utiliser Vector3.Normalized? la documentation dit Returns this vector with a magnitude of 1:, cela ne détruit-il pas les informations enregistrées dans le vecteur? en fait cela Magnitudeet Normalizedc'est ce qui m'a rendu confus.
Mohammed Noureldin
Qu'il s'agisse d'un point dans l'espace ou d'une flèche indiquant la vitesse, tout est dans votre tête. Les mêmes données représentent les deux.
Omnifarious
@MohammedNoureldin Un vecteur normalisé est un vecteur de longueur unitaire (c'est-à-dire 1). Oui, si vous normalisez un vecteur, vous perdez les informations de longueur ou de magnitude. Si vous avez besoin des deux (utile dans de nombreuses occasions), vous obtenez la longueur du vecteur, puis normalisez-le.
Ian Young
1

Ce que Unity dit à propos des points par rapport aux vecteurs n'a aucun sens à long terme, car les API de géométrie choisissent simplement des définitions distinctes pour rendre l'outil plus accessible, elles ne correspondent pas à la façon dont ces choses sont conceptualisées en géométrie. Jetez un œil aux implémentations des classes, si vous le pouvez. Parce que c'est arbitraire, connaître sa définition est le seul moyen de comprendre ce qu'est le concept. Divulgation complète, je n'ai pas d'expérience Unity.

Un vecteur est un point dans un espace vectoriel , en ce sens que le concept de point dans la géométrie est codé par des éléments de l'ensemble sous-jacent. Un espace vectoriel a un vecteur distinct, appelé origine ou 0 . L'algèbre linéaire est une tentative de coder algébriquement un fragment de géométrie euclidienne avec une origine.

La flèche et sa longueur

Les mouvements à travers un espace de points sont fréquemment interprétés comme toutes les flèches depuis les points source / avant vers leurs points cible / après.

Une fonction de deux arguments peut être appliquée à un argument pour produire une fonction d'un argument - on peut parler de x +, la fonction qui amène chaque vecteur y au vecteur x + y . Il s'agit de la traduction associée avec l'ajout de x . Les flèches associées vont des points y aux points x + y . Voir: application partielle , curry .

Alors pourquoi n'utilisons-nous qu'une seule flèche ? La flèche de l'origine pointe vers un vecteur spécifique, le x dans x + - l'origine est l'identité de l'addition du vecteur. Ainsi, nous pouvons récupérer la traduction x + à partir de sa seule valeur x +0 = x .

En tant que représentation graphique de l'espace, la représentation de la flèche a à voir avec notre capacité d'extrapoler visuellement ou physiquement l'effet d'une traduction à partir de la valeur qui la détermine. Quand avons-nous cette capacité?

Donner à l'espace vectoriel une norme qui en fait un espace vectoriel normé, c'est fournir une notion de la longueur d'un vecteur qui a du sens comme sa distance à 0. De plus, il doit s'agir d'une distance satisfaisant l'inégalité du triangle, qui est un forte contrainte sur la relation entre les longueurs de deux vecteurs et celle de leur somme. De la longueur, nous pouvons définir la distance pour en faire un espace métrique , et une géodésique est un chemin intrinsèquement droit en ce sens qu'il est aussi court que possible. La norme euclidienne induit une distance euclidienne et les géodésiques sont les segments de ligne des flèches, mais si vous dessinez les flèches comme des géodésiques en utilisant des normes différentes, vous pouvez extrapoler l'effet géométrique de la traduction à partir des géodésiques pour en savoir plus sur la géométrie.

La signification du point et du vecteur

Dans certains cas, en faisant de la géométrie de jeux, votre espace de points n'est pas un espace vectoriel . Un espace affine de dimension n peut être noyé dans un espace projectif de dimension n . Les cartes affines se réduisent à des projectivités. Les projectivités vous permettent également de faire du FOV, w / c je pense que ce n'est pas affine. Les projectivités ont des avantages:

L' espace n projectif sur un champ peut être construit à partir de l' espace linéaire ( n +1) (espace vectoriel), en traitant les points de l'espace projectif comme des lignes passant par l'origine de l'espace linéaire. Les plans passant par l'origine donnent à leur tour des lignes projectives. La multiplication des vecteurs par une matrice fixe est une carte linéaire , c'est à cela que sert la multiplication matricielle. Les cartes linéaires conservent l'origine et sont compatibles avec l'incidence. En particulier, si f est un automorphisme linéaire ( correspondant à une matrice inversible ( n +1) x ( n +1)), et que deux lignes L, M passant par l'origine couvrent un plan A , alorsf L, f M sont des lignes passant par l'origine couvrant f A , donc f préservera également l'incidence sur l'espace projectif - une matrice inversible a une projectivité associée. La multiplication matricielle code la composition des cartes linéaires, et donc des projectivités.

En supprimant l'origine de l'espace linéaire, tous les points sur une ligne donnée passant par l'origine sont des multiples scalaires les uns des autres. Exploitant ce fait, l' homogénéisation choisit un point linéaire pour remplacer chaque point projectif et une matrice inversible pour remplacer chaque transformation projective (comme dans cette carte affine 2D -> 2D comme 3D -> vidéo de cartes linéaires 3D ), dans un tel manière que les représentants sont fermés sous des produits matrice-matrice et matrice-vecteur et donnent et sont donnés par des choses projectives uniques. Cette description de la construction du plan projectif à partir du plan linéaire relie certaines choses ensemble.

Donc, dans le pipeline de matrice modèle-vue-projection, nous utilisons des vecteurs pour représenter les points de notre espace projectif, mais l'espace projectif n'est pas un espace vectoriel, et tous les vecteurs de l'espace vectoriel que nous utilisons représentent des points de notre géométrie (voir photo du plan affine à droite ). Nous utilisons des matrices de traduction au lieu de la somme vectorielle si nous voulons des traductions. Parfois, les gens appellent des vecteurs de points projectifs ou affines, surtout lorsqu'ils utilisent une configuration dans cette veine.

Horloge Loki
la source
2
+1. Mais mon instinct est que la plupart des gens qui comprennent la langue que vous utilisez connaissent déjà la réponse à la question d'origine, je recommande donc d'ajuster la réponse pour les lecteurs occasionnels.
Peter - Unban Robert Harvey
@Peter J'ai eu du mal à tout aborder. Je voudrais le rendre plus accessible, mais je ne sais pas comment le faire sans élaboration. Cependant, lorsque je travaillais pour la première fois avec OpenGL, je me suis interrogé sur la signification des matrices homogènes, des matrices en perspective et comment les matrices de traduction ont été découvertes comme alternative à la traduction par sommation, il est donc possible que ce ne soit pas trop loin dans le fond. Le formalisme est un langage, et en donnant la bonne formulation, je pense que comment discuter des concepts se rencontrera. Cependant, il est très opaque d'être concis, donc cela ressemble plus à une liste de lecture Wiki.
Loki Clock du
J'ai ajouté quelques liens, en particulier une vidéo de cartes affines réalisées dans une dimension supérieure en tant que cartes linéaires. J'espère que cela vous aidera.
Loki Clock
agréable. mérite plus de votes positifs.
Peter - Unban Robert Harvey
-1

La longueur (ou magnitude) du vecteur est square root of (x*x+y*y+z*z). Les vecteurs sont toujours considérés comme un passage de rayon à l'origine de <0,0,0> par le point décrit dans le vecteur<x,y,z>

La documentation de l'unité à ce sujet se trouve ici .

Stephan
la source
Désolé, mais c'est complètement faux. Si j'ai deux points A et B, alors v = BA est le vecteur qui va de A à B. v ne passe pas du tout par l'origine dans ce cas. Un vecteur n'est pas un point. il peut être utilisé pour représenter un point (comme vecteur de position), mais il est quelque chose de différent. Veuillez obtenir les bases algébriques directement.
Polygnome
J'ai mis à jour la réponse pour éliminer la confusion, mais je fais référence à la documentation de ce qu'est un Vector3 dans Unity, et ma réponse était conforme à toutes les réponses les mieux classées, y compris la vôtre.
Stephan
Si vous lisez attentivement la documentation de l'unité, vous remarquerez qu'elle ne mentionne jamais l'origine, car l'origine n'a de toute façon rien à voir avec la longueur du vecteur. Le vecteur entre (1,1,1) et (2,3,4) est <1,2,3> et a une longueur de sqrt (1 ^ 2 + 2 ^ 2 + 3 ^ 3) = ~ 3,9, ce qui est la distance entre ces deux points. Il ne touche même l'origine du tout . Je ne comprends pas comment vous pourriez penser que ma réponse est d'accord avec vous, car elle ne l'est pas du tout .
Polygnome