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?
Normalized
dans le contexte signifie un nouveau vecteur qui conserve leDirection
mais aMagnitude
de 1. Autrement dit, leNormalized
vecteur est créé en mettant à l'échelle le vecteur d'origine.Réponses:
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
Matrix4x4
classe. Il a deux fonctions différentes:Matrix4x4.MultiplyVector
etMatrix4x4.MultiplyPoint
La différence est, grosso modo, qu'un vecteur n'est pas traduit, alors qu'un point l'est. Imaginez la matrice 4x4 suivante:
Il décrit une traduction de (1,2,3). Maintenant, quand vous avez le pseudocode suivant
Alors
tp
sera (3,4,5), alors qu'il ytv
aura 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
Vector3
classe à 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 entrePoint3D
etVector3D
, parfois avec une base commune commeTuple3D
.la source
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.vector
pour signifier tableau ou multiple! En C ++, vous pouvez avoir unstd::vector<Vector3>
exemple. Avector
de l'Vector
art.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:
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:
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 pasmyVec3
, et si vous avez l'intention d'utiliser souvent ce vecteur normalisé, vous devriez probablement créer une variable:pour éviter les appels répétés à la
normalized
méthode.Et si vous voyez des variables:
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 afloat 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.
la source
myVec3.normalized
renvoie un nouveau Vector3, ayant la même direction mais la magnitude 1.myVec3
est inchangéethese vector are unit vectors
àdirection vectors are unit vectors
ou quelque chose? Parce que tel qu'il est maintenant, un lecteur peut être confus en pensantthese
aux deux exemples précédentsmPosition
etmDirection
. (C'est comme ça que je l'ai lu au début.)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.
la source
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.
la source
Returns this vector with a magnitude of 1
:, cela ne détruit-il pas les informations enregistrées dans le vecteur? en fait celaMagnitude
etNormalized
c'est ce qui m'a rendu confus.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.
la source
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 .
la source