I got a bit excited today when a Bot walked up stairs and back down again. I had not attempted to force the AI controlled Bot to do this.
This was a scenario I needed to test with my new collision model but the Bot did it on its own :-)
A few weeks ago I identified that my previous design was not detailed enough to allow the characters to walk through doorways cleanly and completely failed if that doorway also included steps or was already on top of a structure.
For the last three weeks I have been coding and testing an improved version. Physics engines are surprisingly difficult. It should just be a bit of maths but the complex tiny reactions regularly produce unexpected and frustrating results. I got there in the end.
Instead of sharing collision bounds with the projectile impact code, the new movement system relies on a separate pre-calculated detailed grid. This acts like a height map just for the areas of the map that contain structures. If there are no structures the player must be standing on the less detailed terrain.
I like the feel of the typical sliding sphere response but I was trying to avoid having to create, store and load oriented bounding boxes (OBB) for every structure. This needed some thinking about. The goal was to be able to give a reasonable collision response with the minimum of data needing to be loaded by the Xbox. File loading on the Xbox is relatively slow and most games take a long time to load their levels. This is inevitable but with careful design I can minimise it.
I like the use of grids because it only needs a very quick bit of maths to determine which grid any location falls in to. The new design stores only three bits of information in those grids and only stores it where it is not the default.
I automatically calculate the highest point of any structure in each grid square. I can then manually set an additional floor level and clearance height for any building that can be walked through. This only needs to be where the structure has a solid ceiling.
Interior scenes will have ceilings that do not collide so the floors in these areas will calculate automatically. It only tends to be doorways that have to be done manually. I spent much of the last few weeks trying to automate this calculation but the results were never robust enough. Either they collided where they should not or worse they allowed a character to fall through a floor!
In-game it is fairly quick to calculate the slope between where the character currently is and the most appropriate floor in the grid they are moving to. If it is too steep then the entity cannot move there.
The design took a bit of tweaking to make sure that all edge cases were accounted for with the minimum of calculations but after a lot of frustration the end result has been performing well.
Artificial Intelligence (AI)
I gained some advantages from the new pre-calculations which are used to speed up the generation of the navigation mesh used for the AI. The most notable is that the cover height is automatically available to me rather than the long calculation I had to do previously.
I was also able to create a much more reliable test to check if any path could be walked by a Bot. This now matches the results that the entity gets when moving so there is much less chance of getting stuck and most importantly it checks the floor level. This is what allowed an AI controlled entity to finally walk up the stairs and through doorways.