Above is my attempt at creating a Mass Aggregate Physics system. A Mass Aggregate Physics system is one in which objects are made up of many little masses which based on forces applied to them cause the whole structure to move and rotate. For example instead of a box being one single entity it is made up of 8 nodes all interconnected via rods. When we want the box to rotate since there is no central mass to grab and do so we apply force to a few of the 8 nodes causing it to move and rotate in a corresponding direction.
In my take on this physics system I have the follow physics types. Basic balls which can be used on their own as a single object or points in larger objects.
Springs which much be at least two connected nodes or a node and a fixed point in space. Springs have a have a certain amount of elasticity to them causing them to apply force outwards if they are compressed too close together or apply force inwards if stretched too far apart.
Bungees are another type which while much similar to springs have a minimum length before the elasticity kicks in, anything below the minimum allows the bungee to stay at rest. This can also be anchored or interconnected like the springs.
Cables which have a maximum length of which then can stretch too but apply no force inwards upon reaching that. As well no no minimum length so they can compress as much as they would like. Consider cables like a piece of rope.
And finally Rods which connect two points and keep them a set distance apart from each other.
Making the basic building blocks of the physics system wasn't too challenging, on their own I got springs bungees and cables working, however the eventual combination of the three and rods in of itself caused me many problems.
Rods being one of the building blocks and my main problem seems like the perfect place to start with what went wrong. Rods seem like a fairly simple task, keep to points no matter how they move equal distance away from each other, simple right? Not so much, my first few iterations of the Rod objects caused some quite hilarious outcomes. Upon instantiation my rods would try to resolve the collision they were having between each other because due to gravity and basic settling they either got to close to far or both. Upon resolving the collision they would fly off into the distance (staying the correct distance from each out might i mind you). While funny and a good attempt at creating perpetual energy it did not create the desired results. I then got rods to actually work when standing straight up or laying down , but upon interaction with any force being applied to them they would practically rip a whole in space and time trying to get away from each other. It seems that the algorithm that I was using to attempt to resolve the contacts had a double negative and applied forces in the same direction, however a little late in figuring this out and not knowing exactly where to change this means it stayed as a bug.
Attempting to connect multiple rods was even a worse idea. making even a simple square as stated above was way out of my reach, the structure while only needing 4 nodes needed about 24 rods to hold it together each outer wall of the cube and cross braces to make sure the cube didn't collapse in on itself. However once the rods were in place the nodes would move ever so slightly, they would all have to compensate and the cube would literally rip itself apart, and I was never sure why, which is exactly why this iteration of my physics system contains no rods.
Beyond creating the basic system with the above building blocks, the task at hand was to create a player made of these objects who could navigate through a world obstacle course created via a level editor all while collecting something and interacting with some sort of artificial intelligence.
Creating the level editor was an interesting task, due to the crunch time that this is, I took the easy route and created a text based level editor. Basically all this does is allow you to feed in objects via a text file and It will create the world around it. This was very using in setting up multiple levels like I did. because when you you completed one, all I had to do was clean up and open the next file and load them in. Another cool feature of this level editor is because when I reset the world and change levels it re reads the file, you are able to create and change levels while the game is running, which was great for debugging and creations, all you had to do was hit the reset button. An example of what one of the objects in the levels in the video looks like is below. I just read in the values line by line and create them as it goes. The labels of each item makes it quite simple to understand what each of the values do.
Bungee
x
50
y
10
z
0
radius
10
mass
5
Ball2
x
0
y
10
z
0
radius
10
mass
5
Anchored
false
spring constant
0.01
rest
100
spring constant
0.01
rest
100
Adding in collectibles was by far the easiest task, I already had basic orb collision in my engine so It was really just making a new object of a different color that when the player collided with it would disappear. In my game when the player collects all of the collectibles this is when the level is over and the next one loads in.
The final portion was the AI which I very much enjoyed creating. If you look in the video on the top of the screen is a ball that seems to be flying back and forth. What I decided to do for this part of the project is attempt to recreate the little cloud guy from original Mario games. What he does is takes a look at where you were last frame and where you are now. Calculate your velocity and then move in front of you. Upon reaching that the AI has a chance to drop a ball causing more objects for you to collide with and thus ruining your day. As you can see he kind of just picks a side when you start and hovers around there, in order to avoid edge cases when you are not moving at all and him not just dropping bombs on your head constantly. I added a little margin of error to allow the AI to always hover around one side of you.
With the task at hand "completed" I decided to take this last bit to explain where and why I think things went wrong, because as you can see in the video the world doesn't really act as well as it should, and it's in a 2 and a half D setting. Somewhere a long the line while creating these features I lost the ability for my object to draw in the Z direction. I'm not sure why but it does happen. If I try to move objects in the Z direction while they do not look like they are moving, the lines drawn between them do move, and collision between objects behave appropriately. For example, an object at Z 10 and Z 10 will collide but objects at Z 10 and Z 50 will not. I have no rhyme or reason why the objects cannot drive in the Z direction.
Another problem I ran into was way back when I first created my springs and bungees I had a weird bug where they would always gravitate around the origin of my world (0,0,0) I never really questioned it and moved on because I had bigger fish to fry, but now that I tried to make a world full of these objects I ran into some obvious problems. Upon placing spring objects anywhere in the world too far away from 0,0,0 via my level editor when the game runs they will fly back at max speed toward 0,0,0 destroying and knocking away everything in their wake. I have narrowed this down to a bug in my spring force code which somewhere some how chose a fixed point of 0,0,0 to be bound to.
These bugs made a full world quite impossible to create which is why I made a few sets of levels which allowed to show off each part working on its own and still giving the player a decent feel of progression and what type of interactions they would expect to encounter in a Mass Aggregate world.
No comments:
Post a Comment