Fr/Vector: Difference between revisions
m (gramar and style) |
(gramar & positionnement) |
||
Line 5: | Line 5: | ||
'''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 ([[origin]]) courante. En français cela est tous simplement un [http://fr.wikipedia.org/wiki/Vecteur vecteur] | ||
Chaque 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. | ||
{{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 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.}} | ||
Line 23: | Line 23: | ||
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 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. | ||
{{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 39: | 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]. | |||
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]]. | |||
* <code>[[GetAbsOrigin()]]</code>, <code>[[SetAbsOrigin()]]</code> | * <code>[[GetAbsOrigin()]]</code>, <code>[[SetAbsOrigin()]]</code> |
Revision as of 09:17, 15 April 2009
Article en cours de traduction
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 vecteur
Chaque vecteur contient trois vec_t
'ordonées' (ordinates). (0,20,5)
signifie 20 unités en face et 5 unités au dessus de l'origin courante.

CUtlVector
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 simplementv
) comme suffix, identifie une variable comme étend un vecteurVector
.
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 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.

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 relatif à leurs parent. Vous devez être familiarisé avec cette notion via le système de la [[coordinates|grille de coordonées cartésiennes].
Les vecteurs relatifs à un parent (apparentés) stockés par l'entité sont 'locaux'; Calculer une un vecteur 'absolue' relatif au monde 3D requiert un peu plus de calcule. Les deux fonctions Abs ci-dessous les font pour vous, mais sont plus gourmande en ressources.
Mouvement
An entity attempts to move the length of its velocity vector once per second. The code looks something like this:
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 SetAbsOrigin(vecNewOrigin);
Notice how frametime
is used to regulate the entity's speed regardless of how long each frame takes to calculate. See scalar multiplication for more detail on the operation.
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.
Tracelines
Article principal: TraceLines
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).
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.
Addition
Adding two (or more) vectors combines them. You have already experienced vector addition if you've ever pushed an object with two hands!
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.

Multiplication
Scalaire
Multiplying or dividing a vector by a scalar (i.e. an int or float) will change its length (sometimes called "magnitude") without affecting its direction.

VectorNormalize()
to do this quickly.Produit scalaire (dot product)
Multiplying two vectors then adding the result's ordinates produces a dot product, which when both vectors have been normalised (see above) is equal to the cosine of the angle between the two vectors.
One use of a dot product is to tell how closely the two vectors align. +1 means a match, 0 means they are perpendicular to each other, and -1 means they are opposed.

This code calculates a dot product with the aid of Source's various helper functions:
Vector vecTarget = GetAbsOrigin() - pTarget->GetAbsOrigin(); // Get local vector to target VectorNormalize(vecTarget); // Normalisation needs to be done beforehand Vector vecFacing; AngleVectors(GetLocalAngles(),&vecFacing); // Convert facing angle to equivalent vector (arrives normalised) float result = DotProduct(vecTarget,vecFacing); // Get the dot product. if (result > 0) Msg("pTarget is in front of me!\n");

Le produit vectoriel (cross product)
A cross product is a vector perpendicular to two input vectors. It's used to extrapolate a third dimension from just two: the cross product of a vector pointing down the X-axis and a vector pointing down the Y-axis is a vector pointing down the Z-axis.
The equation is fiddly and doesn't have to be learnt; just use CrossProduct(vecA,vecB,&vecResult)
. There generally isn't any need to normalise the input vectors. Most modders will likely only use cross products rarely, if ever - but if required, be aware that a moderate amount of math is required to properly understand this operation.
Fonctions membres
Length
vec_t Length()
vec_t LengthSqr()
Length()
returns the vector's length in units. It's faster to useLengthSqr()
and square the value for comparison, however.bool IsLengthGreaterThan(flValue)
bool IsLengthLessThan(flValue)
- Helpers that perform fast length checks using
LengthSqr()
. void Zero()
- Guess what?
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'interval donné.
void Negate()
- Inverse la direction du vecteur sans en affecter la longueur.
Vector Max(vOther)
Vector Min(vOther)
- "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)
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.
vec_t Length2D()
vec_t Length2DSqr()
- Cast dans leurs équivalent standard, en ignorant l'axe Z.
Base()
- Cast en vec_t. À Faire: Quand résult-il?
Fonctions d'aide
vec_t DotProduct(vecA,vecB)
- Voir produit scalaire.
void CrossProduct(const Vector& a, const Vector& b, Vector& result )
- Voir produit vectoriel.