If you understand unitizing vectors and vector subtraction, then this will be incredibly simple.
Let's imagine our player is standing at position (10, 4, 7), and an enemy is standing at position (5, 9, -9), and we want to find the direction from the player to the enemy. To do this we first subtract the player's position from the enemy's position, and this gives us the vector from the player to the enemy.
(5 - 10, 9 - 4, -9 - 7) = (-5, 5, -16).
Now we simply unitize this vector and we have our direction.
Get the length of the vector √(-5 * -5 + 5 * 5 + -16 * -16) = √(25 + 25 + 256) = √306 = 17.4928556
Now using the inverse of length we can get unitize the vector:
Inverse length = 1 / 17.4928556, or 0.05711619.
Multiple inverse length by each element of our vector:
( -5 * 0.05711619, 5 * 0.05711619, -16 * 0.05711619 ) = ( -0.28583097, 0.28583097, 0.91385904 )
The code for this is very simple, we'll use the Unitize() method from our previous blog post, which is this:
inline void Vector3::Unitize() { const float inverseLength = 1.0f / GetLength(); x *= inverseLength; y *= inverseLength; z *= inverseLength; }
Here's our simple function from getting the direction from the first point to the second:
Vector3 GetDirectionFromFirstToSecond( const Vector3& first, const Vector3& second ) { const Vector3 differenceVector = second - first; differenceVector.Unitize(); return differenceVector; }
Here's what the original sample vectors about would look like in code:
Vector3 playerPos = (10, 4, 7); Vector3 enemyPos = (5, 9, -9); Vector3 dirPlayerToEnemy = GetDirectionFromFirstToSecond( playerPos, enemyPos ); // dirPlayerToEnemy is ( -0.28583097, 0.28583097, 0.91385904 )
No comments:
Post a Comment