Unity: à quoi sert la fonction Vector3.Normalize ?

a marqué ce sujet comme résolu.

Imaginons que tu veuille déplacer un personnage (le joueur). Si tu lui applique le mouvement sur X, puis sur Y sans normaliser, il se déplacera plus vite en diagonale qu’en horizontal ou vertical.

Alors qu’en normalisant, peut importe si il se déplace en vertical, horizontal ou diagonal, il avancera à la même vitesse.

Par contre, je ne saurais te dire pourquoi c’est comme ça. Pour ça, je laisse d’autres agrumes faire des réponses un peu plus complète que la mienne.

+1 -0

Salut,

De façon générale, avoir un vecteur normalisé permet de découpler le traitement sur la direction et sur la magnitude. Pour reprendre l’exemple d’un vecteur vitesse v\vec v de @FougereBle, sa norme vv est la vitesse à laquelle l’objet se déplace. Ton vecteur peut alors s’écrire v=vv^\vec v=v\hat v, avec v^\hat v le vecteur vitesse normalisé (trivialement par définition v^v/v\hat v\equiv \vec v/v).

Donc en pratique, mettons que tu es dans un plan 2D avec un repère cartésien canonique et que tu veux te déplacer en diagonale, donc selon la direction portée par example par (11)\begin{pmatrix}1\\1\end{pmatrix}. Tu peux commencer par le normaliser (donc le diviser par sa norme, ici 2\sqrt{2}) ce qui donne v^=(2/22/2)\hat v=\begin{pmatrix}\sqrt 2/2\\\sqrt 2/2\end{pmatrix}. La fonction dont tu parles te donne ce vecteur (probablement dans un espace 3D, mais l’idée est la même). Si tu veux te déplacer à une vitesse de magnitude vv selon la diagonale, tu sais que ton vecteur vitesse est bêtement v=v(2/22/2)\vec v=v\begin{pmatrix}\sqrt 2/2\\\sqrt 2/2\end{pmatrix}.

+0 -0

Bonjour !

Merci à vous trois pour vos réponses.

Salut,

De façon générale, avoir un vecteur normalisé permet de découpler le traitement sur la direction et sur la magnitude1. Pour reprendre l’exemple d’un vecteur vitesse v\vec v de @FougereBle, sa norme vv est la vitesse à laquelle l’objet se déplace. Ton vecteur peut alors s’écrire v=vv^\vec v=v\hat v, avec v^\hat v le vecteur vitesse normalisé (trivialement par définition v^v/v\hat v\equiv \vec v/v2).

Donc en pratique, mettons que tu es dans un plan2D avec un repère cartésien canonique et que tu veux te déplacer en diagonale, donc selon la direction portée par example par (11)\begin{pmatrix}1\\1\end{pmatrix}. Tu peux commencer par le normaliser (donc le diviser par sa norme, ici 2\sqrt{2}) ce qui donne v^=(2/22/2)\hat v=\begin{pmatrix}\sqrt 2/2\\\sqrt 2/2\end{pmatrix}. La fonction dont tu parles te donne ce vecteur (probablement dans un espace 3D, mais l’idée est la même). Si tu veux te déplacer à une vitesse de magnitude vv selon la diagonale, tu sais que ton vecteur vitesse est bêtement v=v(2/22/2)\vec v=v\begin{pmatrix}\sqrt 2/2\\\sqrt 2/2\end{pmatrix}.

adri1

Ton explication m’a aidé à comprendre certaines choses à propos des vecteurs, mais je ne comprends toujours pas pourquoi cette fonction renvoie un vecteur unitaire, et je n’arrive pas non plus à saisir le pourquoi avec ton exemple.

Soit je ne pige pas la notion de normalisation, soit y’a vraiment quelque chose qui m’échappe… j’veux dire: quelle utilité de modifier la magnitude d’origine d’un vecteur pour la réduire à 1 ? Même dans un "déplacement" en diagonale, j’vois clairement pas l’intérêt, ça ne me saute pas aux yeux.

EDIT: Parce qu’ici, la fonction normalize ne renvoie pas la magnitude du vecteur ni le normalise, elle renvoie un vecteur avec une magnitude de 1.

+0 -0

Je dois dire que j’ai un peu du mal à comprendre ce qui coince.

Ton explication m’a aidé à comprendre certaines choses à propos des vecteurs, mais je ne comprends toujours pas pourquoi cette fonction renvoie un vecteur normalisé, et je n’arrive pas non plus à saisir le pourquoi avec ton exemple.

Une façon brute de répondre est qu’il est souvent pratique de manipuler des vecteurs de norme 1. D’un point de vue calculatoire, on s’en sort toujours sans vecteur normalisé explicitement, mais on va souvent les voir apparaître dans les calculs sous la forme a/a\vec a/a. C’est ce qui donne envie de manipuler directement les vecteurs normalisés plutôt que se cogner les calculs complets à chaque fois et de diviser sans arrêt des vecteurs par leur norme.

Soit je ne pige pas la notion de normalisation, soit y’a vraiment quelque chose qui m’échappe…

Normaliser un vecteur a\vec a, ça veut juste dire le diviser par sa norme aa pour obtenir un vecteur de norme 1 : a^=a/a\hat a=\vec a/a.

j’veux dire: quelle utilité de modifier la magnitude d’origine d’un vecteur pour la réduire à 1 ?

Parce que 1 est l’élément neutre de la multiplication. Autrement dit, si tu veux construire un vecteur b\vec b de même direction que a\vec a mais de norme bb différente de aa, la seule façon de faire est de calculer ba/a=ba^b\vec a/a=b\hat a, on voit apparaître le vecteur normalisé a^\hat a naturellement. Un exemple d’application, c’est par exemple si tu as une arme dans ton jeu avec un canon, qui va donc tirer dans la direction du canon. Le vecteur vitesse de la balle sera vc^v\hat c avec c^\hat c un vecteur normalisé dans la direction du canon. Un autre exemple est lorsque tu calcules des rebonds sur des surfaces non triviales (arrondies par exemple). Une façon de faire est de calculer un vecteur normalisé perpendiculaire à la surface qui aide ensuite à calculer les rebonds.

EDIT: Parce qu’ici, la fonction normalize ne renvoie pas la magnitude du vecteur ni le normalise, elle renvoie un vecteur avec une magnitude de 1.

Le vecteur de norme 1, c’est le vecteur normalisé… Ce sont ceux que je note avec un chapeau dans mes messages.

+0 -0

Salut !

Merci pour ta réponse (et ta patience, pour le coup :-° ).

Je dois dire que j’ai un peu du mal à comprendre ce qui coince.

Le problème doit venir de moi, j’ai beaucoup trop peu de pratique au compteur. Je m’en vais corriger ça et je reviendrai si j’ai d’autres questions.

Bonne soirée !

Connectez-vous pour pouvoir poster un message.
Connexion

Pas encore membre ?

Créez un compte en une minute pour profiter pleinement de toutes les fonctionnalités de Zeste de Savoir. Ici, tout est gratuit et sans publicité.
Créer un compte