Je lis un livre sur le jeu AI.
L’un des termes utilisés est la normalisation d’un vecteur qui consiste à transformer un vecteur en unité. Pour ce faire, vous devez diviser chaque dimension x
, y
et z
par sa magnitude.
Nous devons transformer le vecteur en unité avant de faire quoi que ce soit avec elle. Pourquoi?
Et est-ce que quelqu'un pourrait donner quelques scénarios où nous devons utiliser un vecteur unitaire?
Merci!
Vous n'avez pas à normaliser les vecteurs, mais beaucoup d'équations sont un peu plus simples à réaliser. Cela pourrait également rendre les API plus petites: toute forme de normalisation peut potentiellement réduire le nombre de fonctions nécessaires.
Voici un exemple simple. Supposons que vous souhaitiez trouver l'angle entre deux vecteurs u et v. S'ils sont des vecteurs unitaires, l'angle est simplement arccos (uv). S'ils ne sont pas des vecteurs unitaires, l'angle est arccos (u v/(| u | | v |)). Dans ce cas, vous finissez par calculer les normes de u et v de toute façon.
Comme le dit John D. Cook - vous le faites principalement parce que vous vous souciez de la direction, pas du vecteur lui-même. Selon le contexte, il est fort probable que vous ne souhaitiez/n’aviez pas besoin des informations sur la magnitude, mais simplement sur la direction elle-même. Vous normalisez pour éliminer 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 preniez le vecteur V entre P1 (le méchant de l'IA) et P2 (votre héros) comme direction à suivre pour que le méchant se déplace. Vous voulez que le méchant se déplace à une vitesse de N par battement - comment calculez-vous cela? Eh bien, soit nous normalisons le vecteur à chaque temps, nous multiplions par N pour déterminer le degré d'avancement de leur déplacement, soit nous pré-normalisons la direction en premier lieu, et nous multiplions simplement le vecteur unitaire par N à chaque fois - sinon le méchant se déplacerait. plus loin si c'était plus loin du héros! Si le héros ne change pas de position, c'est un calcul de moins à prendre en compte.
Dans ce contexte, ce n'est pas grave - mais que se passe-t-il si vous avez cent méchants? Ou mille? Que se passe-t-il si votre IA doit gérer des combinaisons de méchants? Tout à coup, vous sauvegardez cent ou mille normalisations par battement. Puisqu'il s'agit d'une poignée de multiplications et d'une racine carrée pour chacune, vous finissez par atteindre le point où ne pas normaliser les données à l'avance signifie que vous allez tuer votre taux de traitement de l'IA.
Plus généralement - les mathématiques sont très courantes - 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: une - obliger chaque fonction à effectuer le calcul, ou deux - pré-normaliser les données.
Du point de vue du concepteur de l’infrastructure: ce dernier est intrinsèquement plus rapide - si nous supposons le premier, même si votre utilisateur pense à normaliser les données, il devra passer par la même routine de normalisation OR vous ' Il va falloir fournir deux versions de chaque fonction, ce qui est un casse-tête. Mais au moment où vous faites réfléchir les utilisateurs sur la version de la fonction à appeler, vous pouvez également les laisser réfléchir suffisamment pour appeler la bonne, et ne la leur fournir que d’abord, ce qui les incite à faire le bon choix pour la performance. .
Vous normalisez souvent un vecteur parce que vous ne vous souciez que de la direction du vecteur et non de la magnitude.
Un scénario concret est Cartographie normale . En combinant la lumière frappant la surface et les vecteurs 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.
Nous devons transformer un vecteur en unités Avant de faire quoi que ce soit avec lui.
Cette déclaration est incorrecte. Tous les vecteurs ne sont pas des vecteurs unitaires.
Les vecteurs qui forment la base d’un espace de coordonnées ont deux propriétés très agréables qui les rendent faciles à utiliser:
Cela vous permet d’écrire n’importe quel vecteur dans un espace 3D sous la forme d’une combinaison linéaire de vecteurs unitaires:
alt text http://www.equationsheet.com/latexrender/pictures/e691d8878d3d2cf83362af36faa16096.gif
Je peux choisir de transformer ce vecteur en un vecteur unité en divisant chaque composant par la magnitude.
alt text http://www.equationsheet.com/latexrender/pictures/78a0af48a0d02492fdd2b5377157c6a8.gif
Si vous ne connaissez pas les espaces de coordonnées ou les vecteurs de base, je vous conseillerais d'en apprendre un peu plus sur les mathématiques des graphiques avant d'aller beaucoup plus loin.
Outre les réponses déjà fournies, je mentionnerai deux aspects importants.
Toutes les fonctions trigonométriques sont définies sur un cercle unitaire. Le nombre pi
lui-même est défini sur un cercle unitaire.
Lorsque vous normalisez les vecteurs, vous pouvez utiliser toutes les fonctions trigonométriques directement , sans arrondir la mise à l'échelle. Comme mentionné précédemment, l'angle entre deux vecteurs unitaires est simplement: acos(dot(u, v))
, sans mise à l'échelle ultérieure.
Un vecteur peut être interprété comme une quantité comportant deux types d'informations: la magnitude et la direction. La force, la vitesse et l'accélération 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
, où magnitude
est un scalaire et direction
un vecteur unitaire, est souvent très pratique: les changements de magnitude impliquent des manipulations scalaires, et des changements en direction ne modifient pas la magnitude. direction
doit être un vecteur unitaire pour que la magnitude de vector
soit exactement égale à magnitude
.