Well, the short version is that I have a very basic collision detection and response system working. My test scene has a sphere that I can move left or right. If the sphere hits a triangle it slides along the surface of the triangle. I even put two triangles with different slopes next to one another and the sphere slides along one then changes pace slightly as it slides along the other. I simplified the code from the Faurby paper I was using and there’s probably some stuff I’ll find out later I’m missing, but the basic concept is working.
My next step is to generalize to code to handle meshes instead of individually defined triangles. This is “narrow phase” collision detection and is relatively expensive to calculate, so I’ll need a broad phase scheme as well. Fortunately, THREE.js includes a utility to generate an axis aligned bounding box around a mesh and these are pretty easy to use to eliminate most geometry from consideration during the broad phase.
I’m still plugging away at getting a functioning collision detection system built. So far the collision detection part seems to be working somewhat reliably, but the collision response part is still largely non-existent. March 1 is still a reasonable timeframe and even though this is slowing things down somewhat it could definitely be time well spent if I can get this working.
After admitting I was stalling by working on putting some grass into the game, I’ve now stalled some more to improve that process. Now instead of “solid” grass I can make double sided flat grass and it shows up correctly. As a result, a chunk of grass that looks virtually identical to the solid grass but is actually made of double sided triangles has just 15 faces. I can pare that down some if I make the grass model a little simpler, so I’ll make some other grass models at some point that are just dead simple. I used the tags feature in BabylonJS to accomplish this. Flat geometry can now be tagged as “doublesided” and when the model is loaded its material type will be converted to double sided by turning off backface culling. Backface culling should remain on for most objects for performance reasons, but the ability to selectively turn it off on objects modeled in Blender is very useful.
I’ve been looking at the controls in BabylonJS and so far I’m not a fan. The engine does a lot for you, which is good, but it also hides a lot of the details behind poor documentation, which is not good. There’s a whole action manager system that seems very confusing at the moment. If I try to just put in a good old fashioned addEventListener for mousedown or mouseup I get very weird results. It will pick up left mouse clicks if the right mouse is down, but not otherwise, which is frustrating.
So, I’m going to punt. The controls are good enough for now and I’m going to move onto other things. Eventually I may not even use BabylonJS. I would actually much prefer to use THREE but as it’s not a game engine there are some features it just doesn’t have. Or maybe I’ll eventually figure out BabylonJS well enough to use it correctly, but I have definitely found myself frustrated by things in BabylonJS not working the way I want to and the root cause seems to be hidden from me. That sounds like some kind of conspiracy, but it’s not that. The engine just tries to do a lot for you and if you don’t use it correctly it doesn’t throw an error, it just doesn’t do what you want. I’ll come up with my next steps and post them here soon.
The truth is that I really don’t want to dig into the camera controls for the game. Since I’m using a FollowCamera it does a lot of the work for me but also sort of hides most of the details. For instance, I was trying to do some very basic mouse event capture and was getting weird results. I can only assume this is because BabylonJS is capturing mouse events as part of the FollowCamera, but I don’t really know. What’s happening is probably well documented somewhere but I haven’t taken the time to dig in and find out yet, so for now it’s a little frustrating. I didn’t really get anything done last night because there was a car wreck at the entrance to the neighborhood where I live and it took out the power for a big chunk of the night.
So, a distraction. The game needed some grass.Isn’t that maybe the most realistic grass you’ve ever seen in your life, including times you’ve seen actual grass with your actual eyeballs? It’s 24 triangles and, of course, no collider. So I can add a ton of these to the game without affecting performance much. Why, you ask, not just use a texture on a plane? After all, that’s just 2 triangles. True, but I’m trying to stick to a “materials only” style for performance reasons. This model is actually a solid object with volume. I may try to make some other grass that’s just a double-sided flat mesh. I know BabylonJS can handle double-sided materials, but I’m not 100% sure how to tell it in Blender that’s what I want. Also, I may eventually make an exception to the no textures rule for simple elements like this since I can keep the texture sizes very small. We’ll see.
Last night I made a simple, bad run cycle for my test character and put it in the game. I then updated the game so that the player only “runs” when he is moving. The animation is still very rudimentary in that it just starts when you move and stops when you stop. There’s no blending to make it smoothly transition between idle and running or anything fancy like that. It’s a very basic start, but it’s a start.
My development schedule from back on February 1st hasn’t gone exactly as planned. I have basic multiplayer in place, and I’ve been improving Penrith Forest here and there, but I’ve done nothing with the camera controls or jumping. Instead I’ve been working on this animation stuff. I’ve also reorganized all of the code into a format that’s easier for me to work with. I don’t really want to mess with the camera controls or jumping since both open a can of worms, but I guess I will since it has to be done eventually.
I spent some time today trying to do a really basic animation for my player character. I had to go back and brush up on my Blender rigging skills but I managed to make a truly horrible animation that loops for your player in the game.
I fully realize that it’s hard to tell from these two images that any animation is happening at all, but trust me, the player now does this terrible flailing kick and arm waiving motion that makes no sense. Fortunately, my goal was not to create something believable as character movement, but just to have the character move at all and I accomplished that. Using animations in BabylonJS isn’t too complicated as long as you get the export out of Blender done correctly, so in the near future I’ll try to make an actual walk/run cycle along with an idle animation and maybe even an attack animation. Then I’ll try to do some animation blending so that you can run and attack at the same time.
Bonus: you can see the new spooooooooky tower off in the fog in the images above.
I made a huge tree.You can see the tiny character reference next to it. Now I’m going to stick a bunch of these into Penrith Forest.
As of now when a client disconnects the player disappears from the world. I realize this is not a big thing, but it definitely adds some “realism” to the world to not have disconnected players just hanging out in the world. I’ll add some new assets to Penrith Forest this week then see what’s next.