- X +forward/-backward
- Y +left/-right
- Z +up/-down
(1,20,5) means 1 unit forward, 20 units to the left and 5 units above the current origin.
Vector vecMyVector = Vector(1,20,5);
- The classname
- You can construct it by defining the X, Y and Z member variables separately, pass a single value for all three or copying the data of another Vector.
- The prefix
vec(or sometimes just
v) identifies the variable as a vector.
A vector does not have an orientation; that is determined by the code that uses it.
In the vast majority of cases a vector will be interpreted as world axis aligned regardless of an entity's rotation, but there are few cases (e.g. applying physics forces), where they are considered object axis aligned.
- Every entity's position ('origin') is stored as a vector relative to its parent: you are likely to be familiar with this idea already as Cartesian grid coordinates. See
GetAbsOrigin()for more details.
- An entity attempts to move the length of its velocity vector once per second.
- Collision Traces
- A Traceline or -hull is fired from one point to another, detecting what it "hits" along its path.
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.
Adding two (or more) vectors combines them. You have already experienced vector addition if you've ever pushed an object with two hands!
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.
VectorNormalize()to do this quickly.
Multiplying two vectors then adding the result's ordinates produces a dot product, which when both vectors have been normalised 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 = pTarget->GetAbsOrigin() - 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");
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.
Rotating a Vector requires a matrix, so can't be done with an operation like those above. Thankfully you don't need to get involved in the gritty details: just call
VectorRotate(Vector in, QAngle in, Vector& out).
Source defines two special Vectors:
- This is used for invalid Vectors, e.g. if you need to return a Vector in a function, but something is not possible (such as the intersection-point of two parallel straight lines).
Length()returns the vector's length in units. It's faster to use
LengthSqr()and square the other value being compared.
- Helpers that perform fast length checks using
- Sets all elements to 0.
void Init(vec_t X, Y, Z)
- Quickly set an existing vector's ordinates.
void Random(vec_t minVal,vec_t maxVal)
- Randomises all three ordinates within the given range.
- Reverses the vector's direction without affecting its length.
- Clamps the vector's ordinates either above or below the given values. The ordinates won't stay in proportion (i.e. direction might change).
- Returns the distance between the current vector and
vOtheras a scalar. As ever, the squared flavour is faster.
- Returns the dot product of the current vector and
- Returns the cross product of the current vector and
- Tests whether the Vector ends within the given box. Box min/max values are local to the Vector.
- Casts to Vector2D.
- As their standard equivalents, but ignoring the Z-axis.
- Casts to vec_t*, basically the same as &vec.x or (float*)&vec.
These globals are all available through
- Divides the vector by its length, normalising it. Modifies the Vector and returns the old length.
- See #Dot product.
- See #Cross product.
void VectorTransform(Vector in1, matrix3x4_t in2, Vector out)
- See matrix3x4_t.