Fr/Vector: Difference between revisions

From Valve Developer Community
< Fr
Jump to navigation Jump to search
(scalar)
(Rewrite Template:Lang to Template:LanguageBar. This action was performed by a bot.)
 
(33 intermediate revisions by 11 users not shown)
Line 1: Line 1:
'''<span style="color:red;">Article en cours de traduction</span>'''
{{LanguageBar|Vector}}


{{toc-right}}
{{toc-right}}


'''Vector''' est une classe C++ représentant une ligne avec une direction et une longueur, elle commence à l'origine ([[origin]]) courante. En français cela est tous simplement un [http://fr.wikipedia.org/wiki/Vecteur vecteur]
'''Vector''' est une classe C++ représentant une ligne avec une direction et une longueur, elle commence à l'origine ({{L|origin}}) courante. En français cela est tous simplement un [http://fr.wikipedia.org/wiki/Vecteur vecteur]


Chaque vecteur contient trois <code>[[vec_t]]</code> 'ordonées' (ordinates). <code>(0,20,5)</code> signifie 20 [[unit|unités]] en face et 5 unités au dessus de l'origin courante.
Chaque vecteur contient trois <code>{{L|vec_t}}</code> 'ordonnées' (ordinates). <code>(0,20,5)</code> signifie 20 {{L|unit|unités}} en face et 5 unités au dessus de l'origin courante.


{{note|La classe vector du Source Engine est geometrique et ''très'' différente [[Wikipedia:Vector (C++)|du Template de la librairie standard]], qui est du type [[Wikipedia:Array|array]] (tableau). Le vecteur de style STL a été renomée en <code>[[CUtlVector]]</code> dans Source.}}
{{Note|La classe vector du Source Engine est géométrique et ''très'' différente {{L|Wikipedia:Vector (C++)|du Template de la librairie standard}}, qui est du type {{L|Wikipedia:Array|array}} (tableau). Le vecteur de style STL a été renommée en <code>{{L|CUtlVector}}</code> dans Source.}}


== Déclaration ==
== Déclaration ==
Line 15: Line 15:
* Le nom de classe (classname) <code>Vector</code> est sensible à la case.
* Le nom de classe (classname) <code>Vector</code> est sensible à la case.
* Vous pouvez aussi assigner les variables X, Y et Z séparément.
* Vous pouvez aussi assigner les variables X, Y et Z séparément.
* <code>vec</code> (ou simplement <code>v</code>) comme suffix, identifie une variable comme étend un vecteur <code>Vector</code>.
* <code>vec</code> (ou simplement <code>v</code>) comme suffixe, identifie une variable comme étend un vecteur <code>Vector</code>.


=== Orientation ===
=== Orientation ===
Dans la majorité des cas, les vecteurs sont considérés comme étends orientés de manière 'relative' au coordonnées global. Ainsi, ils sont '''alignés sur les axes du monde 3D'''(world-axis-aligned): l'''horizon'' ou composante X, est aligné d'est en ouest.  
Dans la majorité des cas, les vecteurs sont considérés comme étends orientés de manière 'relative' au coordonnées global. Ainsi, ils sont '''alignés sur les axes du monde 3D''' (world-axis-aligned): l'''horizon'' ou composante X, est aligné d'est en ouest.  
La ''profondeur de champs'' ou composante Y, est aligné du nord au sud.  
La ''profondeur de champs'' ou composante Y, est aligné du nord au sud.  
L'''altitude'' ou composante Z, est aligné de haut en bas.
L'''altitude'' ou composante Z, est aligné de haut en bas.


Cependant dans quelques cas, le vecteur peut aussi être considéré comme étend '''aligné sur les axes d'un objet''' (object-axis-aligned) - orienté dans le sens des coordonées et angles locaux de son parent. C'est dans ce cas que certaines fonctions sont utilisées pour appliquer une force à un objet physique. Ainsi les codeurs doivent en être conscient, et vérifier tout commentaires spécifiés quand ils sont dans le doute.
Cependant dans quelques cas, le vecteur peut aussi être considéré comme étend '''aligné sur les axes d'un objet''' (object-axis-aligned) - orienté dans le sens des coordonnées et angles locaux de son parent. C'est dans ce cas que certaines fonctions sont utilisées pour appliquer une force à un objet physique. Ainsi les codeurs doivent en être conscient, et vérifier tout commentaires spécifiés quand ils sont dans le doute.


{{note|En somme, on distingue si le vecteur est propre à un objet ou non. Par exemple une porte, on détermine par le vecteur dans qu'elle sens elle va s'ouvrir et sur quelle distance. Dans ce cas là le vecteur est propre à l'objet 'porte' et considéré comme étend ''object-axis-aligned''.}}
{{Note|En somme, on distingue si le vecteur est propre à un objet ou non. Par exemple une porte, on détermine par le vecteur dans qu'elle sens elle va s'ouvrir et sur quelle distance. Dans ce cas là le vecteur est propre à l'objet 'porte' et considéré comme étend ''object-axis-aligned''.}}


Un exemple de cela serait dans le fichier vphysics_interface.cpp pour la classe IPhysicsObject :
Un exemple de cela serait dans le fichier vphysics_interface.cpp pour la classe IPhysicsObject :
Line 41: Line 41:
=== Positionnement ===
=== Positionnement ===


Toutes les positions des entités sont stockées comme des vecteurs relatif à leurs [[parent]]. Vous devez être familiarisé avec cette notion via le système de la [[coordinates|grille de coordonées cartésiennes].
Toutes les positions des entités sont stockées comme des vecteurs relatifs à leurs {{L|parent}}s. Vous devez être familiarisé avec cette notion via le système de la {{L|coordinates|grille de coordonnées cartésiennes}}.


Les vecteurs relatifs à un ''parent'' (apparentés) stockés par l'entité sont 'locaux'; Calculer une un vecteur 'absolue' relatif au [[world|monde 3D]] requiert un peu plus de calcule. Les deux fonctions Abs ci-dessous les font pour vous, mais sont plus [[expensive|gourmande en ressources]].   
Les vecteurs relatifs à un ''parent'' (apparentés) stockés par l'entité sont 'locaux'; Calculer un vecteur ''absolue'' relatif au {{L|world|monde 3D}} requiert un peu plus de calcule. Les deux fonctions Abs ci-dessous les font pour vous, mais sont plus {{L|expensive|gourmande en ressources}}.   


* <code>[[GetAbsOrigin()]]</code>, <code>[[SetAbsOrigin()]]</code>
* <code>{{L|GetAbsOrigin()}}</code>, <code>{{L|SetAbsOrigin()}}</code>
* <code>[[GetLocalOrigin()]]</code>, <code>[[SetLocalOrigin()]]</code>
* <code>{{L|GetLocalOrigin()}}</code>, <code>{{L|SetLocalOrigin()}}</code>


=== Mouvement ===
=== Mouvement ===


An entity attempts to move the length of its velocity vector once per second. The code looks something like this:
Une entité qui tente de se déplacer de la longueur de son vecteur de vélocité. Aura un code à peu près comme ça:
 
<source lang="cpp">
  Vector velocity = Vector(0,5,0); ''// 5 units/second in the +Y direction''
  Vector velocity = Vector(0,5,0); ''// 5 units/second in the +Y direction''
   
   
  Vector vecNewOrigin = GetAbsOrigin() + velocity * [[gpGlobals]]->frametime; ''// frametime is in seconds, e.g. 0.033''
  Vector vecNewOrigin = GetAbsOrigin() + velocity * {{L|gpGlobals}}->frametime; ''// frametime is in seconds, e.g. 0.033''
   
   
  SetAbsOrigin(vecNewOrigin);
  SetAbsOrigin(vecNewOrigin);
</source>
Noté comment <code>frametime</code> est utilisé pour réguler la vitesse de l'entité en fonction du temps requit pour calculer chaque frame. Regarder [[#Scalaire|Multiplication scalaire]] pour plus de détails sur cette opération.


Notice how <code>frametime</code> is used to regulate the entity's speed regardless of how long each frame takes to calculate. See [[#Scalar|scalar multiplication]] for more detail on the operation.
Comme avec l'origine, la vélocité est stockée relativement au parent. ''AbsVelocity'' représente la vélocité relative au cadre du reste du monde 3D, et c'est la méthode la plus utilisé communément.


As with the origin, velocity is stored relative to the parent. AbsVelocity represents the velocity relative to the rest frame of the world, and is the more commonly used method.
* <code>{{L|GetAbsVelocity()}}</code>, <code>{{L|SetAbsVelocity()}}</code>
 
* <code>{{L|GetLocalVelocity()}}</code>, <code>{{L|SetLocalVelocity()}}</code>
* <code>[[GetAbsVelocity()]]</code>, <code>[[SetAbsVelocity()]]</code>
* <code>[[GetLocalVelocity()]]</code>, <code>[[SetLocalVelocity()]]</code>


=== Tracelines ===
=== Tracelines ===


''Article principal: [[TraceLines]]''
''Article principale: {{L|UTIL_TraceLine}}''


Tracing is the process of going from a point A towards another point B, and finding out the first thing that we "hit" on our way from A to B ('''TraceLine''').
Tracer est le procédé qui consiste à aller d'un point A à un point B, et de trouver la première chose qui sera "touchée" sur notre chemin allant de A à B ('''TraceLine''').


== Opérations ==
== Opérations ==


All vectors in an operation must have the same [[origin]] for the result to make sense. Whether a local or absolute origin is used depends on what you're trying to achieve.
Tous les vecteurs lors d'une opération doivent avoir la même {{L|origin|origine}} pour que le résultat est un sens (au propre comme au figuré). Si vous utilisez une origine local ou absolue, de cela dépends directement se que vous essayez d'obtenir.


=== Addition ===
=== Addition ===


Adding two (or more) vectors '''combines''' them. You have already experienced vector addition if you've ever pushed an object with two hands!
Ajouter deux (ou plus) vecteurs les '''combines'''. Vous avez déjà expérimenté l'addition de vecteur si vous avez déjà poussé un objet avec vos mains!


[[Image:Vector_add.png|center|Vector addition: (4,1) + (-3,1) = (1,2)]]
[[File:Vector_add.png|center|Vector addition: (4,1) + (-3,1) = (1,2)]]


=== Soustraction ===
=== Soustraction ===


Subtracting one vector from another produces the '''difference''' between the two - in other words, how to get to the first location from the second. The result is local to the ''second'' vector.
Soustraire un vecteur par un autre produit la '''différence''' des deux. En d'autres termes comment obtenir la position du premier vecteur, depuis le deuxième. Le résultat est donc local au ''second'' vecteur.


[[Image:Vector_subtraction.png|center|Vector subtraction: (2,3) - (-2,1) = (4,2)]]
[[File:Vector_subtraction.png|center|Vector soustraction: (2,3) - (-2,1) = (4,2)]]


{{tip|The order in which you subtract defines the direction of the vector.}}
{{tip:fr|L'ordre dans lequel vous soustrayez détermine la direction du vecteur.}}


=== Multiplication ===
=== Multiplication ===
Line 93: Line 93:
==== Scalaire ====
==== Scalaire ====


Multiplier ou diviser un vecteur par un [[Wikipedia:Scalar|scalaire] (nb: un [[int]] ou [[float]]) chanegra ça '''longueur''' (Mathématiquement appellé "magnitude") sans affecté ça direction.
Multiplier ou diviser un vecteur par un {{L|Wikipedia:Scalar|scalaire}} (nb: un {{L|int}} ou {{L|float}}) changera ça '''longueur''' (Mathématiquement appellé "magnitude") sans affecter ça direction.


[[Image:Vector-scalar_multiply.png|center|Vector-scalar multiplication: (1,2) x 2 = (2,4)]]
[[File:Vector-scalar_multiply.png|center|Vector-scalaire multiplication: (1,2) x 2 = (2,4)]]


{{tip|Dividing a vector by its length [[normal]]ises it. Use <code>VectorNormalize()</code> to do this quickly.}}
{{tip:fr|Diviser un vecteur par sa longueur le {{L|normal}}ise. Utiliser <code>VectorNormalize()</code> pour faire ça rapidement.}}


==== Produit scalaire (dot product) ====
==== Produit scalaire (dot product) ====


Multiplier deux vecteurs normalisés puis additionné leurs ordonnés obtenues est appellé Produit Scalaire (dot product en anglais), cela permet de savoir l'angle qui sépare les deux vecteurs (Mathématiquement appelé ''l'argument'' des vecteurs). Pourquoi dire ''Argument'' au lieu ''d'Angle'' tout simplement car la valeurs obtenue est un ''cosinus'' et non pas une valeur en degrée. Si celle-ci vaut +1 alors les vecteurs sont alignés, si elle vaut 0 alors les vecteurs sont perpendiculaire l'un à l'autre, si elle vaut -1 alors les vecteurs sont opposés<br />
Multiplier deux vecteurs normalisés puis additionné leurs ordonnés obtenues est appelé Produit Scalaire (dot product en anglais), cela permet de savoir l'angle qui sépare les deux vecteurs (Mathématiquement appelé ''l'argument'' des vecteurs). Pourquoi dire ''Argument'' au lieu ''d'Angle'' tout simplement car la valeurs obtenue est un ''cosinus'' et non pas une valeur en degrés. Si celle-ci vaut +1 alors les vecteurs sont alignés, si elle vaut 0 alors les vecteurs sont perpendiculaire l'un à l'autre, si elle vaut -1 alors les vecteurs sont opposés<br />


{{note|''Le véritable produit scalaire est obtenue uniquement quand la longueur des deux vecteurs est de 1.'' L'étape de [[normal]]isation a été sautée dans la démonstration qui suit pour rendre l'équationplus simple. (mais les règles de positif/zéro/négatif reste applicable).}}
{{Note|''Le véritable produit scalaire est obtenue uniquement quand la longueur des deux vecteurs est de 1.'' L'étape de {{L|normal}}isation a été sautée dans la démonstration qui suit pour rendre l'équation plus simple. (mais les règles de positif/zéro/négatif reste applicable).}}


[[Image:Vector_dotproduct.png|center|Produit scalaire de vecteurs: (2,2) x (-2,0) = (-4,0) = -4; (2,2) x (-2,2) = (-4,4) = 0; (2,2) x (2,2) = (4,4) = 8]]
[[File:Vector_dotproduct.png|center|Produit scalaire de vecteurs: (2,2) x (-2,0) = (-4,0) = -4; (2,2) x (-2,2) = (-4,4) = 0; (2,2) x (2,2) = (4,4) = 8]]


Ce code calcule un produit scalaire avec les diverses fontions d'aide de Source.
Ce code calcule un produit scalaire avec les diverses fonctions d'aide de Source.
<code>
<code>
  Vector vecTarget = GetAbsOrigin() - pTarget->GetAbsOrigin(); ''// Get local vector to target''
  Vector vecTarget = GetAbsOrigin() - pTarget->GetAbsOrigin(); ''// Get local vector to target''
Line 113: Line 113:
   
   
  Vector vecFacing;
  Vector vecFacing;
  '''[[AngleVectors()|AngleVectors]]'''(GetLocalAngles(),&vecFacing); ''// Convert facing angle to equivalent vector (arrives normalised)''
  '''{{L|AngleVectors()|AngleVectors}}'''(GetLocalAngles(),&vecFacing); ''// Convert facing angle to equivalent vector (arrives normalised)''
   
   
  float result = '''DotProduct'''(vecTarget,vecFacing); ''// Get the dot product.''
  float result = '''DotProduct'''(vecTarget,vecFacing); ''// Get the dot product.''
Line 121: Line 121:
</code>
</code>


{{tip|Il n'y a pas besoin de normaliser si vous avez juste besoin de savoir si une position est devant une autre.}}
{{tip:fr|Il n'y a pas besoin de normaliser si vous avez juste besoin de savoir si une position est devant une autre.}}


==== Le produit vectoriel (cross product) ====
==== Le produit vectoriel (cross product) ====


Le produit vectoriel ou cross product en anglais, est le vecteur '''perpendiculaire''' à deux autres vecteurs. Il est utilisé pour extrapoler uen troisièem dimension à partir de deux vecteurs: Le produit vectoriel d'un vecteur pointant le bas de l'axe X et d'un vecteur pointant le bas de l'axe Y, sera un vecteur pointant le bas de l'axe Z.   
Le produit vectoriel ou cross product en anglais, est le vecteur '''perpendiculaire''' à deux autres vecteurs. Il est utilisé pour extrapoler une troisième dimension à partir de deux vecteurs: Le produit vectoriel d'un vecteur pointant le bas de l'axe X et d'un vecteur pointant le bas de l'axe Y, sera un vecteur pointant le bas de l'axe Z.   


Si l'équation suivante est trop compliquée ne vous en faite pas, Source à des fonctions qui font ça pour vous!
Si l'équation suivante est trop compliquée ne vous en faite pas, Source à des fonctions qui font ça pour vous!
Line 139: Line 139:


Dans source il suffit de faire <code>CrossProduct(vecA,vecB,&vecResult)</code>.  
Dans source il suffit de faire <code>CrossProduct(vecA,vecB,&vecResult)</code>.  
Il n'est en général pas nécessaire de normaliser les vecteurs passés en argument. Il est rare que les moddeurs utilisent le produit vectoriel, comme toujours, si cela est requit, soyez conscient du [http://mathworld.wolfram.com/CrossProduct.html niveau de mathématique requit] pour comprendre ce [http://en.wikipedia.org/wiki/Cross_product genre d'opération].  
Il n'est en général pas nécessaire de normaliser les vecteurs passés en argument. Il est rare que les moddeurs utilisent le produit vectoriel, comme toujours, si cela est requit, soyez conscient du [http://mathworld.wolfram.com/CrossProduct.html niveau de mathématique requit] pour comprendre ce [http://en.wikipedia.org/wiki/Cross_product genre d'opération].


== Fonctions membres ==
== Fonctions membres ==


=== Longueur ===
=== Longueur ===
; <code>[[vec_t]] Length()</code>
; <code>{{L|vec_t}} Length()</code>
; <code>vec_t LengthSqr()</code>
; <code>vec_t LengthSqr()</code>
: <code>Length()</code> retourne la longueur du vecteur en [[unit|unités]]. Cepdendant il est plus rapide d'utiliser <code>LengthSqr()</code> et de prendre la racine du résultat pour comparer .
: <code>Length()</code> retourne la longueur du vecteur en {{L|unit|unités}}. Cependant il est plus rapide d'utiliser <code>LengthSqr()</code> et de prendre la racine du résultat pour comparer .
; <code>[[bool]] IsLengthGreaterThan(flValue)</code>
; <code>{{L|bool}} IsLengthGreaterThan(flValue)</code>
; <code>bool IsLengthLessThan(flValue)</code>
; <code>bool IsLengthLessThan(flValue)</code>
: Effectuer un rapide test de longueur grâce à la focntion d'aide <code>LengthSqr()</code>.
: Effectuer un rapide test de longueur grâce à la fonction d'aide <code>LengthSqr()</code>.
; <code>void Zero()</code>
; <code>void Zero()</code>
: Ce qui veux dire?
: Ce qui veux dire?
Line 158: Line 158:
: Définit rapidement l'ordonée d'un vecteur existant.
: Définit rapidement l'ordonée d'un vecteur existant.
; <code>void Random(vec_t minVal,vec_t maxVal)</code>
; <code>void Random(vec_t minVal,vec_t maxVal)</code>
: Attribue des valeurs aléatoire pour les trois ordonnées dans l'interval donné.
: Attribue des valeurs aléatoire pour les trois ordonnées dans l'intervalle donné.
; <code>void Negate()</code>
; <code>void Negate()</code>
: Inverse la direction du vecteur sans en affecter la longueur.
: Inverse la direction du vecteur sans en affecter la longueur.
; <code>Vector Max(vOther)</code>
; <code>Vector Max(vOther)</code>
; <code>Vector Min(vOther)</code>
; <code>Vector Min(vOther)</code>
: "Pince" les ordonées du vecteur qu'elles soit au-dessus ou au-dessous des valeurs données. Les ordonnées ne resteront pas proportionnels (nb: La direction peu changer)
: "Pince" les ordonnées du vecteur qu'elles soit au-dessus ou au-dessous des valeurs données. Les ordonnées ne resteront pas proportionnels (nb: La direction peu changer)


=== Comparaison ===
=== Comparaison ===
Line 180: Line 180:


; <code>Vector2D AsVector2D()</code>
; <code>Vector2D AsVector2D()</code>
: Cast en [[Vector2D]].
: Cast en {{L|Vector2D}}.
; <code>vec_t Length2D()</code>
; <code>vec_t Length2D()</code>
; <code>vec_t Length2DSqr()</code>
; <code>vec_t Length2DSqr()</code>
: Cast dans leurs équivalent standard, en ignorant l'axe Z.
: Cast dans leurs équivalent standard, en ignorant l'axe Z.
; <code>Base()</code>
; <code>Base()</code>
: Cast en [[vec_t]]. {{todo|Quand résult-il?}}
: Cast en {{L|vec_t}}. {{todo|Quand résult-il?}}


== Fonctions d'aide ==
== Fonctions d'aide ==


; <code>vec_t DotProduct(vecA,vecB)</code>
''Elles sont disponibles dans le fichier <code>cbase.h</code>.''
 
; <code>{{L|vec_t}} DotProduct(vecA,vecB)</code>
: Voir [[#Produit scalaire (dot product)|produit scalaire]].
: Voir [[#Produit scalaire (dot product)|produit scalaire]].
; <code>void CrossProduct(const Vector& a, const Vector& b, Vector& result )</code>
; <code>void CrossProduct(vecA,vecB,vecResult)</code>
: Voir [[#Le produit vectoriel (cross product)|produit vectoriel]].
: Voir [[#Le produit vectoriel (cross product)|produit vectoriel]].
; <code>void VectorRotate(in1,in2,out)</code>
; <code>void VectorIRotate(in1,in2,out)</code>
: Transforme un vecteur. Plusieurs surcharge accepte un {{L|vector}} ou un {{L|float}} pour le paramètre <code>in1</code> et un <code>{{L|matrix3x4_t}}</code>, <code>{{L|QAngle}}</code> ou <code>{{L|Quaternion}}</code> pour le paramètre <code>in2</code>.


* <code>[[UTIL_VecToYaw()]]</code>, <code>[[UTIL_VecToPitch()]]</code>
* <code>{{L|UTIL_VecToYaw()}}</code>, <code>{{L|UTIL_VecToPitch()}}</code>
* <code>[[AngleVectors()]]</code> and <code>[[VectorAngles()]]</code>
* <code>{{L|AngleVectors()}}</code> and <code>{{L|VectorAngles()}}</code>
* <code>[[VectorNormalize()]]</code>
* <code>{{L|VectorNormalize()}}</code>


== Voir aussi ==
== Voir aussi ==


* [[Wikipedia:Euclidean vector]]
* {{L|Wikipedia:Euclidean vector}}
* <code>[[vec_t]]</code>
* <code>{{L|vec_t}}</code>
* <code>[[VectorVectors]]</code>
* <code>{{L|VectorVectors}}</code>
* <code>[[Vector2D]]</code>
* <code>{{L|Vector2D}}</code>
* <code>[[QAngle]]</code>
* <code>{{L|QAngle}}</code>
* <code>[[CUtlVector]]</code>
* <code>{{L|CUtlVector}}</code>
* [http://www.siteduzero.com/tutoriel-3-8890-les-vecteurs.html Les vecteurs sur le SiteDuZéro]
* [http://www.siteduzero.com/tutoriel-3-8890-les-vecteurs.html Les vecteurs sur le SiteDuZéro]


[[Category:Glossary]]
{{ACategory|Glossary}}
[[Category:Variables]]
{{ACategory|Variables}}
[[Category:Helpers]]
{{ACategory|Helpers}}
[[Category:French]]

Latest revision as of 17:54, 18 July 2025

English (en)Deutsch (de)Français (fr)Русский (ru)Translate (Translate)

Vector est une classe C++ représentant une ligne avec une direction et une longueur, elle commence à l'origine (origin(en)) courante. En français cela est tous simplement un vecteur

Chaque vecteur contient trois vec_t(en) 'ordonnées' (ordinates). (0,20,5) signifie 20 unités(en) en face et 5 unités au dessus de l'origin courante.

Note.pngNote:La classe vector du Source Engine est géométrique et très différente du Template de la librairie standard(en), qui est du type array(en) (tableau). Le vecteur de style STL a été renommée en CUtlVector(en) dans Source.

Déclaration

Vector vecMyVector = Vector(0,20,5);
  • Le nom de classe (classname) Vector est sensible à la case.
  • Vous pouvez aussi assigner les variables X, Y et Z séparément.
  • vec (ou simplement v) comme suffixe, identifie une variable comme étend un vecteur Vector.

Orientation

Dans la majorité des cas, les vecteurs sont considérés comme étends orientés de manière 'relative' au coordonnées global. Ainsi, ils sont alignés sur les axes du monde 3D (world-axis-aligned): l'horizon ou composante X, est aligné d'est en ouest. La profondeur de champs ou composante Y, est aligné du nord au sud. L'altitude ou composante Z, est aligné de haut en bas.

Cependant dans quelques cas, le vecteur peut aussi être considéré comme étend aligné sur les axes d'un objet (object-axis-aligned) - orienté dans le sens des coordonnées et angles locaux de son parent. C'est dans ce cas que certaines fonctions sont utilisées pour appliquer une force à un objet physique. Ainsi les codeurs doivent en être conscient, et vérifier tout commentaires spécifiés quand ils sont dans le doute.

Note.pngNote:En somme, on distingue si le vecteur est propre à un objet ou non. Par exemple une porte, on détermine par le vecteur dans qu'elle sens elle va s'ouvrir et sur quelle distance. Dans ce cas là le vecteur est propre à l'objet 'porte' et considéré comme étend object-axis-aligned.

Un exemple de cela serait dans le fichier vphysics_interface.cpp pour la classe IPhysicsObject :

	// force the velocity to a new value
	// NOTE: velocity is in worldspace, angularVelocity is relative to the object's 
	// local axes (just like pev->velocity, pev->avelocity)
	virtual void	SetVelocity( const Vector *velocity, const AngularImpulse *angularVelocity ) = 0;

Pour attribuer une force world-axis-aligned (cf plus haut) à une force object-axis-aligned, vous pouvez utiliser :

	VectorIRotate( aiIn, EntityToWorldTransform(), aiOut );

Utilisation

Positionnement

Toutes les positions des entités sont stockées comme des vecteurs relatifs à leurs parent(en)s. Vous devez être familiarisé avec cette notion via le système de la grille de coordonnées cartésiennes(en).

Les vecteurs relatifs à un parent (apparentés) stockés par l'entité sont 'locaux'; Calculer un vecteur absolue relatif au monde 3D(en) requiert un peu plus de calcule. Les deux fonctions Abs ci-dessous les font pour vous, mais sont plus gourmande en ressources(en).

Mouvement

Une entité qui tente de se déplacer de la longueur de son vecteur de vélocité. Aura un code à peu près comme ça:

 Vector velocity = Vector(0,5,0); ''// 5 units/second in the +Y direction''
 
 Vector vecNewOrigin = GetAbsOrigin() + velocity * {{L|gpGlobals}}->frametime; ''// frametime is in seconds, e.g. 0.033''
 
 SetAbsOrigin(vecNewOrigin);

Noté comment frametime est utilisé pour réguler la vitesse de l'entité en fonction du temps requit pour calculer chaque frame. Regarder Multiplication scalaire pour plus de détails sur cette opération.

Comme avec l'origine, la vélocité est stockée relativement au parent. AbsVelocity représente la vélocité relative au cadre du reste du monde 3D, et c'est la méthode la plus utilisé communément.

Tracelines

Article principale: UTIL_TraceLine(en)

Tracer est le procédé qui consiste à aller d'un point A à un point B, et de trouver la première chose qui sera "touchée" sur notre chemin allant de A à B (TraceLine).

Opérations

Tous les vecteurs lors d'une opération doivent avoir la même origine(en) pour que le résultat est un sens (au propre comme au figuré). Si vous utilisez une origine local ou absolue, de cela dépends directement se que vous essayez d'obtenir.

Addition

Ajouter deux (ou plus) vecteurs les combines. Vous avez déjà expérimenté l'addition de vecteur si vous avez déjà poussé un objet avec vos mains!

Vector addition: (4,1) + (-3,1) = (1,2)

Soustraction

Soustraire un vecteur par un autre produit la différence des deux. En d'autres termes comment obtenir la position du premier vecteur, depuis le deuxième. Le résultat est donc local au second vecteur.

Vector soustraction: (2,3) - (-2,1) = (4,2)
Tip.pngAstuce:L'ordre dans lequel vous soustrayez détermine la direction du vecteur.

Multiplication

Scalaire

Multiplier ou diviser un vecteur par un scalaire(en) (nb: un int(en) ou float(en)) changera ça longueur (Mathématiquement appellé "magnitude") sans affecter ça direction.

Vector-scalaire multiplication: (1,2) x 2 = (2,4)
Tip.pngAstuce:Diviser un vecteur par sa longueur le normal(en)ise. Utiliser VectorNormalize() pour faire ça rapidement.

Produit scalaire (dot product)

Multiplier deux vecteurs normalisés puis additionné leurs ordonnés obtenues est appelé Produit Scalaire (dot product en anglais), cela permet de savoir l'angle qui sépare les deux vecteurs (Mathématiquement appelé l'argument des vecteurs). Pourquoi dire Argument au lieu d'Angle tout simplement car la valeurs obtenue est un cosinus et non pas une valeur en degrés. Si celle-ci vaut +1 alors les vecteurs sont alignés, si elle vaut 0 alors les vecteurs sont perpendiculaire l'un à l'autre, si elle vaut -1 alors les vecteurs sont opposés

Note.pngNote:Le véritable produit scalaire est obtenue uniquement quand la longueur des deux vecteurs est de 1. L'étape de normal(en)isation a été sautée dans la démonstration qui suit pour rendre l'équation plus simple. (mais les règles de positif/zéro/négatif reste applicable).
Produit scalaire de vecteurs: (2,2) x (-2,0) = (-4,0) = -4; (2,2) x (-2,2) = (-4,4) = 0; (2,2) x (2,2) = (4,4) = 8

Ce code calcule un produit scalaire avec les diverses fonctions d'aide de Source.

Vector vecTarget = GetAbsOrigin() - pTarget->GetAbsOrigin();	// Get local vector to target
VectorNormalize(vecTarget);	// Normalisation needs to be done beforehand

Vector vecFacing;
AngleVectors(en)(GetLocalAngles(),&vecFacing);	// Convert facing angle to equivalent vector (arrives normalised)

float result = DotProduct(vecTarget,vecFacing);	// Get the dot product.

if (result > 0)
	Msg("pLa cible est devant moi!\n");

Tip.pngAstuce:Il n'y a pas besoin de normaliser si vous avez juste besoin de savoir si une position est devant une autre.

Le produit vectoriel (cross product)

Le produit vectoriel ou cross product en anglais, est le vecteur perpendiculaire à deux autres vecteurs. Il est utilisé pour extrapoler une troisième dimension à partir de deux vecteurs: Le produit vectoriel d'un vecteur pointant le bas de l'axe X et d'un vecteur pointant le bas de l'axe Y, sera un vecteur pointant le bas de l'axe Z.

Si l'équation suivante est trop compliquée ne vous en faite pas, Source à des fonctions qui font ça pour vous! Soit un vecteur A et un vecteur B, ordonné en X, Y et Z. On obtient leur produit vectoriel dans un vecteur N comme suis:

N.x = (A.y * B.z) - (A.z * B.y)

N.y = (A.z * B.x) - (A.x * B.z)

N.z = (A.x * B.y) - (A.y * B.x)

Dans source il suffit de faire CrossProduct(vecA,vecB,&vecResult). Il n'est en général pas nécessaire de normaliser les vecteurs passés en argument. Il est rare que les moddeurs utilisent le produit vectoriel, comme toujours, si cela est requit, soyez conscient du niveau de mathématique requit pour comprendre ce genre d'opération.

Fonctions membres

Longueur

vec_t(en) Length()
vec_t LengthSqr()
Length() retourne la longueur du vecteur en unités(en). Cependant il est plus rapide d'utiliser LengthSqr() et de prendre la racine du résultat pour comparer .
bool(en) IsLengthGreaterThan(flValue)
bool IsLengthLessThan(flValue)
Effectuer un rapide test de longueur grâce à la fonction d'aide LengthSqr().
void Zero()
Ce qui veux dire?

Direction

void Init(vec_t X, Y, Z)
Définit rapidement l'ordonée d'un vecteur existant.
void Random(vec_t minVal,vec_t maxVal)
Attribue des valeurs aléatoire pour les trois ordonnées dans l'intervalle donné.
void Negate()
Inverse la direction du vecteur sans en affecter la longueur.
Vector Max(vOther)
Vector Min(vOther)
"Pince" les ordonnées du vecteur qu'elles soit au-dessus ou au-dessous des valeurs données. Les ordonnées ne resteront pas proportionnels (nb: La direction peu changer)

Comparaison

vec_t DistTo(vOther)
vec_t DistToSqr(vOther)
Retourne la distance entre le vecteur courant et de vOther comme un scalaire. Comme toujours, une racine (flavour?) est plus rapide.
vec_t Dot(vOther)
Retourne le produit scalaire du vecteur courant et de vOther.
Vector Cross(vOther)
Retourne le produit vectoriel du vecteur courant et de vOther.
bool WithinAABox(vecBoxmin,vecBoxmax)
Est-ce que le vecteur finit avec cetet boite? L'Argument du vecteur est local.

Casts

Vector2D AsVector2D()
Cast en Vector2D(en).
vec_t Length2D()
vec_t Length2DSqr()
Cast dans leurs équivalent standard, en ignorant l'axe Z.
Base()
Cast en vec_t(en).
À Faire: Quand résult-il?

Fonctions d'aide

Elles sont disponibles dans le fichier cbase.h.

vec_t(en) DotProduct(vecA,vecB)
Voir produit scalaire.
void CrossProduct(vecA,vecB,vecResult)
Voir produit vectoriel.
void VectorRotate(in1,in2,out)
void VectorIRotate(in1,in2,out)
Transforme un vecteur. Plusieurs surcharge accepte un vector(en) ou un float(en) pour le paramètre in1 et un matrix3x4_t(en), QAngle(en) ou Quaternion(en) pour le paramètre in2.

Voir aussi