Skip to main content

AI Engine update - Week ending 6/13

This week, I worked on simple agent rendering: Rendering an agent as a simple circle.

I also had to implement a Matrix, in which I had to implement different functions such as
·         Translate
·         Rotate
·         Scale
·         Transform
This really helped with my 3-D math skills as I finally understood how to create, store and operate the above properties on a game object.



After that, I worked on behaviors:

Seek

Given a target point, the agent will try to move towards that point.
First, we calculate the direction we need to move in by subtracting our position from the target position, and normalizing it:
Vec2 direction = Vec2::Normalize(targetPosition - mpAgent->GetPosition());

We then calculate the velocity required by multiplying that by the max possible velocity of the agent:
Vec2 desiredVelocity = direction * mpAgent->GetMaxSpeed();

Then the force required to get to that velocity would be the difference between that and the current velocity:
Vec2 force = desiredVelocity - mpAgent->GetVelocity();

Flee

Flee is similar to Seek, except that the agent will move away from the target point.
First, we calculate the direction we need to move in by subtracting target position from our position, and normalizing it:
Vec2 direction = Vec2::Normalize(mpAgent->GetPosition() - targetPosition);
We then calculate the velocity required by multiplying that by the max possible velocity of the agent:
Vec2 desiredVelocity = direction * mpAgent->GetMaxSpeed();

Then the force required to get to that velocity would be the difference between that and the current velocity:
Vec2 force = desiredVelocity - mpAgent->GetVelocity();


I will continue to implement more steering patterns.

Comments

Popular posts from this blog

AI Controller Update - Week ending 7/18

This was another landmark week. I was finally able to get navigation meshes working with all the behaviors I’d implemented so far. To see how important this is, let’s consider an example: The follower (the smaller model) needs to get to the target position (the other character in this case). However, there is an obstacle in between. The steering algorithm doesn’t know anything about obstacles. So it will continually push the follower towards the actor, and into the obstacle. With a navmesh, we can tell the steering algorithms to follow a sequence of points in order to reach the target actor. Now, calculating this every frame is very expensive. So what do we do here? First, we raycast to the target position to see whether the follower can reach there uninterrupted. If it can, fantastic. We just ask the follower to seek to the target position. If there isn’t a direct path, we request the navmesh to provide us with a set of points that we store, and then seek to one by one. Wh...

AI Controller - Final update

I got the sample level up and running - and I'll let my video do the rest of the talking! :)

AI Engine update - Week ending 6/20

This week, I worked on rendering objects with direction and velocity. The agent is rendered as a triangular object, which points at its current heading. The green line represents the velocity of the object. The text underneath represents the speed. I worked on additional behavior, which is the arrive behavior. Unfortunately I ran into a bug, where the velocity doesn't seem to be getting updated consistently. On further investigation, it turns out that the update loop was running so fast that the delta time between frames was turning up to be 0. What confuses me is that if the delta time is 0, then the agent shouldn't be moving at all, based on these lines: Vec2 Acceleration = SteeringForce / mMass ; mVelocity += Acceleration * deltaTime ; mVelocity . Truncate ( GetMaxSpeed ()); mPosition += mVelocity ; On further debugging, I discovered that the delta time is non-zero for the first few updates (suggesting that there was perhaps some setup code ...