38 votes

Pourquoi avons-nous besoin d'un vecteur unitaire (en d'autres termes, pourquoi avons-nous besoin de normaliser les vecteurs) ?

Je lis un livre sur l'IA des jeux.

L'un des termes utilisés est la normalisation d'un vecteur, qui consiste à transformer un vecteur en une unité. Pour ce faire, vous devez diviser chaque dimension x , y y z par sa magnitude.

Nous devons transformer le vecteur en une unité avant de faire quoi que ce soit avec lui. Pourquoi ?

Et quelqu'un pourrait-il donner quelques scénarios où nous devons utiliser un vecteur unitaire ?

Merci !

33voto

John D. Cook Points 19036

Il n'est pas nécessaire de normaliser les vecteurs, mais cela simplifie beaucoup d'équations. Cela pourrait également réduire la taille des API : toute forme de normalisation a le potentiel de réduire le nombre de fonctions nécessaires.

Voici un exemple simple. Supposons que vous vouliez trouver l'angle entre deux vecteurs u et v. Si ce sont des vecteurs unitaires, l'angle est juste arccos(u v). S'il ne s'agit pas de vecteurs unitaires, l'angle est arccos(u v/(|u| |v|)). Dans ce cas, on finit par calculer les normes de u et v de toute façon.

1 votes

Je crois que vous devez normaliser le quaternion pour la rotation.

1 votes

@afriza : Un quaternion est différent d'un vecteur unitaire mais vous avez raison de dire que l'ensemble des quaternions unitaires vous donne l'ensemble de toutes les rotations.

27voto

James Points 5137

Comme le dit John D. Cook - vous faites cela principalement parce que vous vous souciez de la direction, et non du vecteur lui-même. Selon le contexte, il est plus que probable que vous ne vouliez pas / n'ayez pas besoin de l'information sur la magnitude - seulement de la direction elle-même. La normalisation permet de supprimer la magnitude afin qu'elle ne fausse pas les autres calculs, ce qui simplifie beaucoup d'autres choses.

En termes d'IA, imaginez que vous prenez le vecteur V entre P1 (le méchant de l'IA) et P2 (votre héros) comme la direction dans laquelle le méchant doit se déplacer. Vous voulez que le méchant se déplace à une vitesse N par battement - comment calculez-vous cela ? Eh bien, soit nous normalisons le vecteur à chaque battement, puis nous le multiplions par N pour déterminer la distance parcourue, soit nous normalisons la direction au départ, et nous multiplions simplement le vecteur unitaire par N à chaque fois - sinon le méchant se déplacerait davantage s'il était plus éloigné du héros ! Si le héros ne change pas de position, c'est un calcul de moins à faire.

Dans ce contexte, ce n'est pas un gros problème - mais qu'en est-il si vous avez une centaine de méchants ? Ou un millier ? Et si votre IA doit faire face à des combinaisons de méchants ? Soudain, c'est une centaine ou un millier de normalisations que vous économisez par battement. Comme il s'agit d'une poignée de multiplications et d'un carré de racine pour chacune d'entre elles, vous finissez par atteindre le point où le fait de ne pas normaliser les données à l'avance signifie que vous allez tuer le taux de traitement de votre IA.

De manière plus générale - les mathématiques pour cela sont vraiment communes - les gens font ici ce qu'ils font pour des choses comme le rendu 3D - si vous n'unitiez pas, par exemple, les normales de vos surfaces, vous auriez potentiellement des milliers de normalisations par rendu qui sont complètement inutiles. Vous avez deux options : un - faire en sorte que chaque fonction effectue le calcul, ou deux - pré-normaliser les données.

Du point de vue du concepteur du framework : la seconde est intrinsèquement plus rapide - si nous supposons la première, même si votre utilisateur pense à normaliser les données, il devra passer par la même routine de normalisation OU vous devrez fournir deux versions de chaque fonction, ce qui est un casse-tête. Mais au point où vous faites réfléchir les gens sur la version de la fonction à appeler, vous pouvez tout aussi bien les faire réfléchir suffisamment pour qu'ils appellent la bonne version, et ne la fournir qu'en premier lieu, en leur faisant faire la bonne chose pour les performances.

1 votes

C'est ce qui a le mieux répondu à cette question pour moi. Excellente explication !

0 votes

Bonjour, où John D. Cook dit-il que je dois le référer ?

8voto

smaclell Points 3164

Vous normalisez souvent un vecteur parce que vous ne vous intéressez qu'à la direction du vecteur et non à sa magnitude.

Un scénario concret est Cartographie normale . En combinant la lumière qui frappe la surface et les vecteurs qui sont perpendiculaires à la surface, vous pouvez donner une illusion de profondeur. Les vecteurs de la surface définissent la direction parallèle et la magnitude du vecteur rendrait les calculs erronés.

6voto

duffymo Points 188155

Nous devons transformer un vecteur en unités avant de faire quoi que ce soit avec.

Cette affirmation est incorrecte. Tous les vecteurs ne sont pas des vecteurs unitaires.

Les vecteurs qui constituent la base d'un espace de coordonnées possèdent deux propriétés très intéressantes qui les rendent faciles à utiliser :

  1. Ils sont orthogonaux
  2. Ce sont des vecteurs unitaires - magnitude = 1.

Cela vous permet d'écrire tout vecteur dans un espace 3D comme une combinaison linéaire de vecteurs unitaires :

alt text
(source : <a href="http://www.equationsheet.com/latexrender/pictures/e691d8878d3d2cf83362af36faa16096.gif" rel="nofollow noreferrer">equationsheet.com </a>)

Je peux choisir de transformer ce vecteur en un vecteur unitaire si nécessaire en divisant chaque composante par la magnitude

alt text
(source : <a href="http://www.equationsheet.com/latexrender/pictures/78a0af48a0d02492fdd2b5377157c6a8.gif" rel="nofollow noreferrer">equationsheet.com </a>)

Si vous ne savez pas ce que sont les espaces de coordonnées ou les vecteurs de base, je vous recommande d'en apprendre un peu plus sur les mathématiques des graphiques avant d'aller plus loin.

0 votes

Pourriez-vous me recommander des ressources ou des livres que je devrais consulter ? Merci

0 votes

N'importe quel livre sur les principes fondamentaux des vecteurs 3D fera l'affaire. Tous les livres d'infographie les passeront également en revue. Il ne s'agit pas seulement de vecteurs. Les vecteurs unitaires ont à voir avec la définition des systèmes de coordonnées, et les transformations sont courantes, de sorte que vous aurez besoin de connaître un peu les matrices.

0 votes

+1 Et signifie également que ces vecteurs unitaires (i,j,k) forment une base orthonormée, que ce soit dans l'espace local ou dans l'espace mondial.

0voto

Escualo Points 12584

En plus des réponses déjà fournies, je mentionnerais deux aspects importants.

La trigonométrie est définie sur un cercle unitaire

Toutes les fonctions trigonométriques sont définies sur un cercle unitaire. Le nombre pi est lui-même défini sur un cercle unitaire.

Lorsque vous normalisez des vecteurs, vous pouvez utiliser toutes les fonctions trigonométriques directement sans aucun changement d'échelle. Comme mentionné précédemment, l'angle entre deux vecteurs unitaires est simplement : acos(dot(u, v)) sans autre mesure.

Trigonometric Circle

Les vecteurs unitaires nous permettent de séparer la magnitude de la direction.

Un vecteur peut être interprété comme une quantité portant deux types d'informations : la magnitude et la direction. La force, la vitesse et l'accélération en sont des exemples importants.

Si vous souhaitez traiter séparément avec la magnitude et la direction, une représentation de la forme vector = magnitude * direction , donde magnitude est un scalaire et direction un vecteur unitaire, est souvent très pratique : Les changements de magnitude entraînent des manipulations scalaires, et les changements de direction ne modifient pas la magnitude. Le site direction doit être un vecteur unitaire pour garantir que la magnitude de vector est exactement égal à magnitude .

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X