SFML community forums

Help => General => Topic started by: Student555 on September 14, 2016, 06:12:14 am

Title: Facing in the direction of velocity vector
Post by: Student555 on September 14, 2016, 06:12:14 am
Currently have an ai agent that moves along a certain path. But currently have no idea how to rotate the agent to face the direction it is moving in.  The heading vector is calculated the following way (along with Side vector )

Code: [Select]

if(MagnitudeOfVector(m_Velocity) > 0.00000001)
{
CurrentHeading = NormalizeVector(m_Velocity);

Side = Perp(CurrentHeading);
}


Code: [Select]
const sf::Vector2f vMath::Perp(const sf::Vector2f & vec)
{
return sf::Vector2f(-vec.y, vec.x);
}


The agent is an SFML drawable entity, and the above code is in an Update function that calculates the steering behavior.  Below are images of what I'm talking about. Where the green vector is the direction in which the agent is heading and the orange is where the agent is facing.

If anyone can point me in the right direction with pseudo code that would be helpful.
Title: Re: Facing in the direction of velocity vector
Post by: dabbertorres on September 14, 2016, 06:42:42 am
Remember that a (2D) vector can be thought of as a triangle on a plane.

y
|\
|  \
|    \  -> vector
|     \
|___\
x     ^
        angle

angle = arctan(y / x)

Gotta remember your trigonometry. Turns out it's useful. Sometimes. :)

(click to show/hide)
Title: Re: Facing in the direction of velocity vector
Post by: Student555 on September 14, 2016, 08:52:31 am
dabbertorres, works great for diagonal movement! But it doesn't work for horizontal and vertical.  The agent moves along a varied path (Like the image attached). If I remember correctly from trig, I would have to use asin and acos (y and x respectively). I have tried that and does not seem to work properly, especially since the built in functions only have one parameter.
Title: Re: Facing in the direction of velocity vector
Post by: dabbertorres on September 14, 2016, 07:54:49 pm
The following code is rotating a shape to 45 deg and 90 deg correctly.

(click to show/hide)

Can you make a minimal example (ie, similar to the code I put above) of what you are doing?
Title: Re: Facing in the direction of velocity vector
Post by: Student555 on September 16, 2016, 04:52:25 am
Sorry, I managed to erase it and came up with another technique. I then managed to see the code that you posted and wanted to implement that in my code. Only in mine, I'm trying to have the line align in the direction of movement. That way I can subtract one point with another to get the difference, then normalize it as a vector, then apply the atan2 function. Problem is I'm having trouble getting there.

(Agent Update)

Code: [Select]
if(MagnitudeOfVector(m_Velocity) > 0.00000001)
{
CurrentHeading = NormalizeVector(m_Velocity);

lineHeadingVector[1].position = sf::Vector2f(getPosition().x * CurrentHeading.x, getPosition().y * CurrentHeading.y);
lineHeadingVector[1].color    = sf::Color::Red;

Side = Perp(CurrentHeading);
}


I know this is incorrect, but I cannot for the life of me think of a better way
Code: [Select]
sf::Vector2f(getPosition().x * CurrentHeading.x, getPosition().y * CurrentHeading.y);
What do you think?
Title: Re: Facing in the direction of velocity vector
Post by: dabbertorres on September 16, 2016, 06:47:30 am
Ah, I think I see what you're trying to do.

Instead of this:
sf::Vector2f(getPosition().x * CurrentHeading.x, getPosition().y * CurrentHeading.y);

You're looking for this:
getPosition() + CurrentHeading * DesiredLengthOfFacingArrow;

You may want to brush up on some of your vector math.

Side note: you can do "code=cpp" instead of just "code" to get syntax highlighting.
Title: Re: Facing in the direction of velocity vector
Post by: Student555 on September 22, 2016, 06:36:24 am
Thanks dabbertorres, have it working.

I only have one more question what is the difference between setRotation and rotate functions. From the documentation, setRotation is to set the orientation, but aren't you doing the same thing when you use the rotate function (Rotate the object)? 
Title: AW: Facing in the direction of velocity vector
Post by: eXpl0it3r on September 22, 2016, 07:49:13 am
They can have the same effect, but setRotation() takes an absolute value (set the rotation to e.g. 45°), while rotate() uses a relative value (add e.g. 45° to the current rotation).