Welcome, Guest. Please login or register.

Login with username, password and session length

 
Advanced search

1411283 Posts in 69325 Topics- by 58380 Members - Latest Member: bob1029

March 29, 2024, 02:14:45 AM

Need hosting? Check out Digital Ocean
(more details in this thread)
TIGSource ForumsCommunityDevLogsGearBlocks - Build working physics based machines and mechanisms [EARLY ACCESS]
Pages: 1 ... 5 6 [7] 8 9 ... 12
Print
Author Topic: GearBlocks - Build working physics based machines and mechanisms [EARLY ACCESS]  (Read 51521 times)
dangersam
Level 2
**



View Profile WWW
« Reply #120 on: February 19, 2017, 05:04:00 PM »

I've been playing around with a translucent PBR shader in GearBlocks over the weekend. It's "paintable" like other materials except the paint colour is used as a tint. Should work nicely for glass, transparent plastic etc!



Logged

dangersam
Level 2
**



View Profile WWW
« Reply #121 on: February 28, 2017, 05:55:24 PM »

OK, time for a long overdue GearBlocks progress update.  As I've mentioned in previous posts, I wanted to improve the construction controls, to try and make them a bit more approachable and accessible, and this is what I've mostly been working on over the past couple of months.

Failed ideas

I wanted to explore some new ideas in an attempt to improve part positioning and alignment, and also part resizing.

So I tried making a prototype of a "snap to" grid aligned to the overall frozen construction (instead of to the currently highlighted part as it is now).  While the player is positioning the selected construction ready for attachment, I had a 2D planar grid aligned to the frozen construction that the selection snapped to at unit intervals.  The player could then move this plane up and down along its normal (also at unit intervals) using the mouse wheel, thereby allowing snapped positioning in full 3D space.  There would also need to be some provision for snapping to half unit intervals, although I didn't get that far with it.  This seemed promising initially, but what killed the idea for me in the end was the realisation that (unlike the current system) it doesn't easily allow for attachment at arbitrary angles, everything has to be aligned at 90 degree intervals relative to the frozen construction.  At least I couldn't think of a practical way around this, and I certainly didn't want to make it less flexibile than what I already have.

As for part resizing, I thought about separating it out into another tool (with handles that you drag around to resize the part), but not only is this more complicated to implement, I actually think it would be less convenient to use.  Every time you want to resize a part you'd have to deselect it, switch to the resize tool, do the resizing, switch back to the builder tool, and select it again.

So in the end I decided against making any radical changes to the current construction controls, and instead focus on improving what's already there.  Let's go over the changes I ended up making.

Construction alignment

One issue with positioning parts is that the alignment grids aren't always easily visible.  Also, because they're drawn on top of the parts themselves, it sometimes makes it hard to tell which parts are in front of each other, or even which part you're about to attach to.  So I changed the grid textures to make them clearer, and modified the shader to fade them out slightly where drawn "behind" objects.  You can see the difference between the old and new grid below.





Another problem is that when you're aligning parts together, you don't know where the individual attachments will be created.  So now during alignment, indicators are shown for the attachments that will be created, an example of this is shown below.



Lastly, rotating the selected construction can be kind of awkward at times, and I wanted to see if could improve this in any way.  I tried making the rotation be limited to one axis at a time during alignment, and that turned out to help a quite lot because it prevents "drift" away from the player's intended rotation.

Part resizing

One of the main problems with the current resizing controls is that they're non-obvious, particularly to new players, because there's nothing showing them what to do.  As a first step towards improving this situation, I've now added a resize indicator that shows the available resizing directions (colour coded for the horizontal and vertical directions).



I'm also going to add a new tool UI display that (among other things) will show which keys to use to resize in each direction.  Hopefully both of these changes together will make resizing a bit clearer for the player.

Attachment indicators

The attachment indicators also suffered from not being very visible a lot of the time, so I modified their textures too, and also tweaked them to ensure visibility from all angles.  Here’s an example showing before and after these improvements.





Other improvements

I've also worked on several other bits and pieces, for example:-

  • More user settings (such as mouse sensitivity for selection translation and rotation).
  • Better in game context sensitive hints.
  • Lights can now (optionally) have a key bound to switch them on and off, just like motors.
  • The construction frozen state is now saved / restored from saved games.
  • A whole bunch of bug fixes (many of these you guys found and reported back to me, so thank you!)

Next up

I'm fairly happy with how things turned out after the changes I made, yes the construction controls could still be better, but they're acceptable, and at this point I need to move on to other stuff really.  There are one or two more small tweaks and bug fixes to do, but apart from that I'm done with the controls and ready to tackle the next thing.

I want to get another demo build out fairly soon, but I still have a laundry list of small tasks to sort out before I can do that, so those are what I'll be looking at next!
« Last Edit: February 28, 2017, 06:16:33 PM by dangersam » Logged

dangersam
Level 2
**



View Profile WWW
« Reply #122 on: March 11, 2017, 09:13:36 PM »

Over the last couple of weeks I've done some more work on the in game UI.

I've removed the old text overlay that showed the name of the highlighted part, as it was positioned near the cursor and kind of in the way.  Now I have a new overlay in the bottom right corner that shows not only the part name, but other details such as its mass, whether it's paintable or resizable, and info on its behaviour status.



I've also added a similar overlay for when you're hovering over an attachment in a frozen construction.  It displays the available attachment types that you can cycle between (highlighting the current attachment type), and it’ll also show info on other things like attachment integrity (if damage is enabled).



During part resizing, rather than add yet another UI display to show which keys to use to resize in each direction (as I was originally thinking), I decided instead to just colour code the relevant parts of the hints text.



Finally, to help the new UI elements fit, and clean up the look of the UI generally, I've also made the whole thing scale based on the screen dimensions.  This means that (in full-screen mode), the UI elements appear the same size regardless of the screen resolution.  I think this is a big improvement, especially at lower screen resolutions.
Logged

dangersam
Level 2
**



View Profile WWW
« Reply #123 on: April 17, 2017, 05:08:16 PM »

Here's just a brief update on what I've been up to over the past few weeks.  Most of the work has been focused on further improving the usability of the game (better UI, controls, customisation, etc.)

Construction controls improvements

I've redone the part resizing input code so that now when you press a resize key it responds immediately (before it was kinda sluggish to respond).

I've also made a tweak so that you can now freeze the selected construction in place while aligning to another construction, this can be useful to check positioning and so on before committing to attachment.

Configurable key and mouse button bindings

The main thing I've been working on recently is a complete overhaul of the input system.  You can now fully customise key (and mouse button) bindings to the various actions in the game.  There's now a new tab in the controls settings where you can set this up.  You click the button for the action you want to configure, it'll then wait for a key press, that key then getting bound to the action.



I've also modified the player controllable parts (e.g. motors) that have configurable key binding to work in the same way.  This means you can now bind any keys to them, not just letters and numbers.

The only thing still left to do here is to allow configuration of joystick / controller inputs, something I'll revisit at a later date.

Improved graphics settings

The other customisation improvement I've made is to the graphics settings.  I've done away with the (vague and too high level) "quality settings", and set up proper options that'll give you more fine grained control when configuring the graphics quality vs. performance of the game.



Other things

Some other bits and pieces I've also done:-

  • More UI design tweaks and improvements.
  • Better audio mix, updating sounds, etc.
  • Various bug fixes.

I'm working hard on getting another demo release out so that you can try all this new stuff out.  Unfortunately there always seems to be something that gets in the way!  Currently I'm in the middle of upgrading to Unity 5.6 which has broken some rendering stuff, so that's what I'm working on right now, hopefully I'll get this sorted soon.
« Last Edit: May 18, 2017, 12:35:21 PM by dangersam » Logged

dangersam
Level 2
**



View Profile WWW
« Reply #124 on: May 18, 2017, 12:38:12 PM »

Gah, I can't believe it's been a month already since the last blog post!  It's been a frustrating time to be honest.  I've been planning on setting up a company for a while, to put GearBlocks on a more official footing (it's something I should have done a long time ago really).  The trouble is I'm having a hell of a time trying to think of a name for the company (all the ideas I've come up with seem to be already taken)!  It seems ridiculous that a relatively trivial thing like this is holding me up, but hopefully I can figure it out soon and move on.

In the meantime I have made some progress with the game though.  The Unity 5.6 upgrade is now done, the rendering issues I was having weren't too bad to sort out in the end.  Also, I was tired of having old placeholder part assets still left in the game, so I've finally removed / replaced / reworked the last of these.

These are the new seat models I've made so far, I plan on adding more types & variations of seat later (any suggestions welcome!)



Here are the new lights (again, at some point I plan on adding more styles / types of light).  Their lenses are now paintable, so you can have any colour lights you like!



It was a small change to make the wheel rims paintable too, so I decided to do that while I was at it.



Well, the next demo release is pretty much ready to go now, it's just waiting on me getting the company set up, as I want to have that all sorted first!
« Last Edit: May 18, 2017, 12:52:16 PM by dangersam » Logged

Zireael
Level 4
****


View Profile
« Reply #125 on: May 19, 2017, 01:33:29 AM »

Looks spiffy! Is it a sandbox? What can I do with the machine I've built?
Logged
dangersam
Level 2
**



View Profile WWW
« Reply #126 on: May 19, 2017, 11:56:16 AM »

Looks spiffy! Is it a sandbox? What can I do with the machine I've built?

Thanks!  Yeah, it's just a sandbox at the moment.  I've been meaning to work on other gamemode(s) for ages, but there always seems to be other stuff I need to do first, hopefully I'll get there eventually!
Logged

dangersam
Level 2
**



View Profile WWW
« Reply #127 on: May 20, 2017, 10:17:52 PM »




Playing around in GearBlocks today, built a tractor with a working piston engine & push rod steering. It could do with some proper wheels and the steering would work better with the ball & socket connectors, but I was limiting myself to parts available in the demo.
Logged

dangersam
Level 2
**



View Profile WWW
« Reply #128 on: June 16, 2017, 03:53:05 PM »

Selection points

Over the last few weeks I've been working on fixing something with the construction controls that’s been bugging me for ages.  I wasn't happy with the range of positions at which you could select a part, you could select it anywhere within its bounds, which wasn't really restrictive enough.

Here's an example.  You could select anywhere on a wheel, even though it only has one point that can attach to anything.



Much better to restrict the selection point to always be at this attachment point as shown below, that way it feels more natural when attaching the wheel to another part.



This next example is even worse.  You could select anywhere on a seat, and then translate it so that the selection point was completely outside the seat which is just plain stupid.



So now I restrict the selection point to be somewhere in the region on the bottom of the seat where its attachment points are, so you always have it selected in a suitable place ready to attach to another part.



To accomplish this I had to rework some code so that it now automatically calculates the selection region based on where all the part's attachment points are located.  The upside to this was that I could do away with explicitly specifying the allowed translation directions on each part.  The less I have to manually setup per part the better!

I also had to implement some new math functions to find the closest point on the part's selection region to the player's eye "ray".  Took a while to do, but it's never a bad thing to add more stuff to my math toolkit I suppose, could come in handy for other things in the future.

All this took way longer than I expected, it was only supposed to be a couple of day's work, sigh.

Prop parts

I've also added some new "prop" parts.  Props are a new category of part that are the simplest objects in the game, they don't have a behaviour and they don't attach to any other part.  The idea is that they can be used with the machines and vehicles you build or placed in the world to set up a scene to play in.  For example, traffic barriers could be laid out to form a race track, the ball could be used in a Rube Goldberg machine.



As with all the other parts, I’ll be adding more props as I go, any suggestions for these are welcome!
Logged

dangersam
Level 2
**



View Profile WWW
« Reply #129 on: June 26, 2017, 05:13:17 PM »

Last week I decided to take another look at the wheel physics implementation, in particular the tire friction model.  First let's quickly recap how the wheel physics works in GearBlocks.

Wheel physics recap

Every update I find the contact point on the ground directly below the wheel and position a configurable joint there.  This joint is then connected to the wheel at the closest point on its outer edge to the contact point on the ground.  The joint has a linear limit set up to prevent the wheel going below the ground, which provides the wheel to ground collision response.

For friction between the tire and ground, I set up the configurable joint’s velocity drive to constrain the wheel's velocity at the contact point to zero, with the maximum force on the drive being set to the friction force.  To calculate the friction force, I use a method inspired by the Coulomb damping model, where the friction force equals the product of a friction coefficient and the normal force at the contact point (i.e the force preventing the wheel from sinking into the ground).

Previous tire friction hack

To find the normal force I need to know what force the configurable joint's linear limit is applying to keep the wheel above the ground.  However, it used to be that in Unity there was no way to access this (even though it was available in PhysX), so I had to estimate the normal force by taking the total mass of the construction, dividing it by the number of wheels, and multiplying it by the acceleration due to gravity.  Basically a total hack, because it assumed the vehicle's weight was always distributed exactly evenly over each wheel.

Improved tire friction

Well the good news is it turns out that fairly recently the joint force was made available in Unity (via Joint.currentForce), so I've now switched the implementation over to use this to find a proper normal force.  This means that in a vehicle, weight distribution now affects tire grip, and because the normal force is now being calculated dynamically, weight transfer also affects grip in the way you'd expect, which is pretty cool.  This all sounds great, and is a definite step in the right direction, but there's a problem.

Formula magic

By using Coulomb damping I'm effectively assuming that tires are rigid (i.e. non-elastic) which of course they're not.  In reality a tire's grip changes depending on how much it is sliding across the ground (tires actually develop peak grip when sliding slightly).  Not only that, the longitudinal (forward and back) and lateral (side to side) grip of a tire behaves slightly differently.  So most driving simulations instead use some form of "friction curves", equations that you plug slip amounts into and get friction forces out.  The industry standard is the Pacejka tire models, sometimes known as "magic formulas", these are empirical models that have been made to fit real world measured data, the equations themselves don't have any basis in real physics as far as I can tell.

Sounds simple enough, so why not use the magic formulas?  Well, after looking into this for a bit, I can see several problems:-

  • 1. The equations for the Pacejka curves themselves are complicated and have a ton of tuning parameters, something I'd prefer not to have to deal with.  Probably overkill for what I need anyway.
  • 2. The slip values used to lookup into the curves are actually slip ratios.  The upshot being that at low velocities numerical instability becomes an issue (and at zero velocity you've got a divide by zero - the slip ratio is undefined!)
  • 3. Because you need to evaluate longitudinal and lateral slip separately, there's the question of how to combine the resulting separate friction forces.  You can't just add them together because a tire can only develop so much grip at any one time, the more longitudinal grip you "use up", the less lateral grip is available, and vice versa.  This effect is sometimes known as the tire's "traction circle".

I'm sure there are ways around all of these problems.  The Pacejka equations could be substituted with something simpler for example, and I've seen various ideas out there that attempt to properly combine longitudinal and lateral slip.  The slip ratio numerical instability issue I'm less sure about at the moment, apparently a lot of driving sims switch to another simpler friction model at low velocities to get around it, seems a bit hacky though.

Another related issue is that I'm not even differentiating friction levels between different surfaces (e.g. tarmac vs. dirt) yet, so perhaps a realistic tire friction model isn't worth it at this point?  Anyway, something to keep thinking about and revisit again in the future.
Logged

dangersam
Level 2
**



View Profile WWW
« Reply #130 on: July 15, 2017, 07:17:34 PM »

So, um, that demo release I've been promising, where is it you might ask?  The good news is, it's ready to release (has been for a while actually).  The last thing was to set up an installer for it and that's all done now (if you're wondering, I used Inno Setup for this, found it a super easy tool to use, with great results!)

Unfortunately, I can't release it just yet as I'm still working on getting my company set up.  This is turning out to be more complicated and expensive than I first realised.  Incorporating the company itself is easy, but because I've already been developing GearBlocks for a while, I'll need to transfer GearBlocks IP to the company, which complicates things and adds to the cost (accountant fees on top of the lawyer fees!)  Anyway, I'll keep plugging away at this and hopefully get it done in the next week or two.

In the meantime I've been adding more parts - some new sliding rack gears with integrated ball joints / hinges (makes for neater steering systems), more lights, and a seat.  I've also implemented limited slip functionality in the differential gear, with configurable "locking strength", should keep that wheel spin under control!

I plan on adding various types of sloped / curved beams and plates to the game, this will make constructions look a lot better (and save on the number of parts needed in a lot of cases).  Next week I'll start work on what should be the simplest of these, a resizable sloped beam.
Logged

dangersam
Level 2
**



View Profile WWW
« Reply #131 on: July 30, 2017, 04:17:26 PM »

Here's what I've been up to over the last couple of weeks.  I'm still working on the company set up stuff, it's unfamiliar territory for me, so I had to do a bit of research and get advice from some people.  I won't bore you with the details, but it seems there's no getting around the complexities that require both an accountant and lawyer.  This is going to cost me a lot of money, so I want to be sure before going ahead with it!

Upcoming demo

I'll upload the demo update as soon as the company is sorted (should be soon now), but in the meantime, here's a sneak peak at the changes that will be in it:-

  • Improved builder tool controls and usability:-
    • Changed alignment and attachment indicators for improved visibility and clarity.
    • Improved part selection (restricting selection location to where part can be attached).
    • Better selection rotation behaviour during alignment.
    • Improved part resizing response to key presses.
    • Added part resizing indicator to show available resize directions.
    • During alignment attachment indicators are now shown for any attachments that will be created.
    • Selected construction can now be frozen in place during alignment.
  • More user configurability:-
    • Configurable key bindings for the various actions in the game.
    • Replaced single graphics "quality level" setting with individual settings for more fine grained control.
    • Added many other options (such as mouse look sensitivity and invert, camera FOV, etc.)
    • Improved sound options (volume controls and speaker configuration).
  • UI improvements:-
    • Improved screen layouts and UI elements.
    • UI is now scaled based on screen resolution.
    • New part and attachment info UI overlays.
    • New game stats UI overlay.
    • Improved in-game context sensitive hints.
  • Updated and improved parts:-
    • Improved part behaviour key binding.
    • Differential gears now have limited slip behaviour, with tweakable "slip limit strength".
    • Lights can now (optionally) have a key bound to switch them on and off, just like motors.
    • Beams now resizable down to 1 unit in length, and plates from 1x1 to 25x25 units in area.
    • Better wheel friction behaviour.
    • Increased max spring rate and damping values for spring dampers.
    • All part models (except wheels) now textured.
    • New light parts (now with paintable lenses).
    • New seat models (replacing old ones).
    • Wheel rims now paintable.
  • Rendering changes:-
    • Construction materialise / dematerialise effect.
    • Part paint application fade in / out.
    • Corrected part paint colour (de-gamma'd, it now visually matches colour shown in UI).
    • Upgraded time-of-day system.
  • The construction frozen state is now saved / restored from saved games.
  • New and improved sound effects (toolbox, footsteps, ambient loop).
  • Minor tweaks to desert proving ground map.
  • Bug fixes.

As usual I've updated any parts that were already in the demo, but I'm not adding any additional ones, all the new parts I'm making are for the full game only!

Slopes and wedges



On the subject of new parts, I've now implemented resizable sloped beams and plates, as well as resizable wedge plates.



Designing their shapes was a bit of a challenge because I had to find a compromise between these three competing requirements:-

  • 1. Be easily representable by box colliders for efficient physics.
  • 2. Have plenty of room for attachment points.
  • 3. Look good when combined with other slopes, plates, etc.

The wedge shape was the trickiest to represent with box colliders.  I contemplated using a convex mesh collider for it, but I wanted to avoid this as they are generally less efficient for physics, and I also have part intersection tests in the game that only work for primitive colliders.  So instead I created a system to dynamically add box colliders, three for the wedge edges, and then recursively adding more to fill in the wedge interior (the larger the wedge, the more interior colliders are needed).  An example of this can be seen below.



All resizable parts in GearBlocks use procedurally generated meshes, so I had to implement mesh generation for these new slope and wedge parts.  This wasn't too difficult but did require a fair bit of refactoring of my procedural mesh system to allow for these more intricate shapes.

Here's a comparison of the Desert Buggy construction, the original version vs. one I made using the new slope and wedge parts.



Not only does the slopes and wedges version look way better, it uses nearly 50 fewer parts than the original!

In the future I want to add a compound sloped plate (i.e. a "corner" piece), as well as curved beams and plates.  The trouble is, the colliders for these will be even more tricky to set up.  I might need so many box colliders to represent these shapes that it wouldn't be practical, so I may well have to resort to convex mesh colliders for these.  Anyway, something I'll come back to later.

Construction interface problems

The sloped plate part is the first part in the game that is resizable along all three axes.  Unfortunately this particularly highlights the awkwardness of the current part positioning and resizing interface.  I'm not sure what I'm going to do about this yet, but I think I'll have to revisit the construction controls yet again.  There has to be a way I can make this better, but I'm just not seeing it right now!
Logged

dangersam
Level 2
**



View Profile WWW
« Reply #132 on: August 30, 2017, 10:59:38 AM »

New demo build



Well, at long last the new demo build is out!

This dev diary highlights some of the changes:-




SmashHammer Games

My company is now incorporated, SmashHammer Games is born!  I’m still waiting on the accountant to do his part of the process, hopefully this will be sorted soon, but I don’t think this should hold me back from moving forward with the game in the meantime.

Bugs and memory leaks

I was actually ready to release the demo a couple of weeks ago, but I was doing some last minute testing, and noticed some performance slowdowns in certain situations (for example, when highlighting a part).  I also noticed some memory leaks and several bugs that I hadn’t spotted before, not good!

So I decided to hold off releasing it, to fix these issues first.  This ended up requiring fairly significant refactoring and reworking of some of the code, so took quite a while unfortunately.  Oh well, at least it’s done now!

Saved file location

The saved file locations have changed (they’re no longer in game folder). The new locations are:-
  • Saved games: %USERPROFILE%\AppData\LocalLow\SmashHammer Games\GearBlocks Demo\SavedGames
  • Saved constructions: %USERPROFILE%\AppData\LocalLow\SmashHammer Games\GearBlocks Demo\SavedConstructions

Saved games and constructions from the previous build (0.4.6095) should still load, but you’ll need to copy them into these new locations.

« Last Edit: March 24, 2018, 04:02:43 PM by dangersam » Logged

dangersam
Level 2
**



View Profile WWW
« Reply #133 on: October 02, 2017, 12:11:06 PM »

It's been a few weeks since the demo release, so it's high time I think for an update on what I've been working on since then!

Rotation controls

As I've mentioned in the past, I'm still not entirely happy with the construction interface.  One aspect of this is the way you rotate the selected part while aligning it to another part prior to attaching it.  The current method of using the mouse to rotate around various axes is OK once you get used to it, but I worry that it's a bit awkward to use, particularly for people new to the game.

So I tried prototyping a system where you use a key to cycle between the available orientations.  The trouble is, there can be up to 24 possible orientations (e.g. 6 sides on a block, and 4 orientations per side, so 6 x 4 in total).  I found this to be way too many to cycle between and was rather frustrating to use.

So I tried breaking it up into cycling between alignment axes (e.g. the 6 sides on a block) with one key, and cycling between the 4 possible orientations around the current alignment axis with another key.  This was a bit better than using just one key, but still didn't feel good to me.  Perhaps this was because it was sometimes hard to tell which way the part had just rotated, or which way it was about to rotate on the next cycle.

I'm not sure that these ideas offer much, if any, improvement over the current mouse based method of rotating.  Oh well, another failure!  I guess you have to try these things, but I'm gonna leave this for now.

Game events

In order to keep the different code modules in GearBlocks decoupled from each other, I used messages (i.e. Unity's SendMessage) to communicate between them.  I wasn't that happy with the way SendMessage uses a string lookup for the method name though - not very efficient, and there's the possibility for name mismatches.

So I switched all of these messages over to use Unity's event system.  Events are now specified in interfaces that derive from IEventSystemHandler, and any code that needs to receive a particular event implements the relevant interface.  To send an event to a game object, I use Unity's ExecuteEvents helper functions.  I created a system that multiple game objects can register themselves with to receive a particular event, to allow for efficient event broadcasting.

UI events

Not to be confused with the event system, Unity also has something called UnityEvents.  These are great for when you want to hook up event handlers to events in a scene or prefab, rather than via code.  I found these perfect for my UI code, so I switched this code over from using C# events to instead use UnityEvents.

Code architecture

The GearBlocks code was long overdue for some reorganisation, in particular I wanted to divide all the modules up into relevant namespaces.  This is really valuable because it can highlight bad or unexpected code dependencies, and helps enforce a clear code hierarchy.  Once I did this I found one or two suspect dependencies that I had to fix, but nothing too bad fortunately.  It definitely feels better to have the code nicely organised now!

Worm gears



Finally, last week I implemented worm gears in the game.  Happily, my plan for how to set up the physics constraints for this worked out first time!  The implementation still needs one or two tweaks, but I'm pleased with how it turned out.  As part of this effort I also simplified the existing gear engagement code somewhat, which should make it slightly more efficient.
« Last Edit: November 21, 2017, 05:14:30 PM by dangersam » Logged

dangersam
Level 2
**



View Profile WWW
« Reply #134 on: November 21, 2017, 04:52:48 PM »

Apologies for the lack of updates lately!  I've been working on implementing pulleys and belts in the game, and I was hoping to get them finished before posting an update.  However, as always seems to be the way, they're taking longer than I expected.  They're not quite done yet, but I have made enough progress now that it's worth talking about where things are at.

Pulley physics

The first thing I had to figure out was how to physically constrain a pair of pulleys together such that they would transfer motion and torque correctly.  My plan was to use PhysX constraints (as exposed by Unity's ConfigurableJoint) to accomplish this, in the exact same way I do for gears.

However, pulleys differ from gears in two important respects:-

  • 1. Pulleys transfer motion and torque over a distance, through the belt that connects them (unlike engaged gears, which must always be adjacent to one another).
  • 2. A pair of pulleys linked by a belt rotate in either the same direction or opposite directions, depending on whether the belt is in an open or cross configuration respectively (unlike a pair of engaged gears, which always rotate in opposite directions).

The first idea I tried was to set up a constraint whose anchor points were positioned on the edge of each of the pulleys, with motion locked along the tangent vector as shown below for two pulleys A and B:-



However, this didn't work well at all because the constraint anchor points were separated by such a long distance.  The pulley motion was unstable at anything other than very low RPMs.

So the next approach I tried was to instead calculate the two circles centered on each of the pulleys, whose radii are in the same proportion as the pulley's, and whose edges touch each other.  Then I placed the constraint anchors on the edge of these circles, represented by the dotted lines in the diagram below for the two pulleys A and B (again, motion is locked along the tangent vector):-



Note that these dotted circles are only used to position the constraint anchors, they aren't visible and don't interact with the world in any other way!

This method seems to work pretty well, it also easily allows for a cross configuration belt in a similar manner (by calculating proportioned circles whose edges instead touch in between the two pulleys, and positioning the anchor points where they touch).

Implementing pulleys in game

Actually getting the pulleys functional in the game required a lot more work beyond just the physics constraints.  I wanted to allow the player to link an arbitrary number of pulleys together in whatever order they like, to form a chain that determines the route the belt takes through the pulleys.

For this I created infrastructure to associate or "link" parts together (or more specifically: link their part behaviours together).  This needed to generalise beyond just pulleys, because I plan on also using it to link other parts together in the future (e.g. batteries, switches, motors, and eventually, more advanced control systems).  It also needed to facilitate restrictions being applied (for example, in the case of pulleys, only allow linking if the pulleys are coplanar, and only allow each pulley to be linked to a maximum of two others).

Based on the order the pulleys are linked together, I also implemented a system to automatically calculate the belt routing (i.e. which side of each pulley the belt should go), which is then used to determine whether to use an open or cross configuration for the constraint between each pair of pulleys, as well as for positioning the visual representation of the belt.

I wanted pulleys to be able to move around slightly when the construction is unfrozen, but obviously there's only so far a belt can plausibly stretch!  So I wrote some code to deactivate the belt (both constraints and rendering) when any of the pulleys move too far from their original position, giving the appearance that the belt "broke".

This work is complete now, and the pulleys are working in game.  There are still a couple of major pieces left to do however:-

  • 1. Right now the links between the pulleys are hard coded just so I have something to test with.  I still need to make a linker tool to allow the player to create and destroy the links themselves, as well as a UI to show these links.
  • 2. Currently I'm just using debug draw lines to visual represent the belt, so I need to implement some code to generate a proper render mesh for the belt.

But for now, here's an example of some pulleys linked together, the yellow debug lines showing the links, and the black ones representing the belt:-



So lots left to do, but this should be really cool once it's done, and I'm excited about the possibilities that the linker tool will allow for with other parts in the future!
Logged

dangersam
Level 2
**



View Profile WWW
« Reply #135 on: January 29, 2018, 02:26:04 PM »

Part 1 of a series of videos demoing some of the fantastic GearBlocks community builds from last year.  I meant to do this at the end of the year, but I was working on adding a third person camera to the game and I wanted to wait until that was in, as it better shows off these creations!

Parts 2 and 3 will be coming soon…


Logged

dangersam
Level 2
**



View Profile WWW
« Reply #136 on: March 01, 2018, 12:56:51 PM »

New demo build 0.5.6628

Time for another long overdue demo release, and an update on what I've been working on recently!

Linker tool

After the last update where I talked about the pulleys and linker tool that I was working on, I have since completed the first pass implementation of the linker tool, and links between pulleys can now be set up by the player (rather than being hard coded).

However, the linker tool goes far beyond just pulleys and belts, my intention is that it'll be a general way to associate various part behaviours together (e.g. batteries, switches, motors, and eventually, more advanced control systems), and this introduces the one major wrinkle I still have to figure out.

The thing is, parts can potentially have multiple behaviours associated with them, which means in theory there could be multiple links between two parts.  I need to decide whether to either prevent multiple links (and in which case, how to do this in a way that makes most sense), or allow for them (in which case, how to represent them to the player via the UI, and if the player should have the ability to create links between individual part behaviours).

I also still need to add UI indicators, both to show those links already existing, and a link as it's being added or removed (right now I'm still using debug lines).

At this point I decided to have a break and work on some other stuff instead, but I will be getting back to the linker tool very soon.

Third person camera



I've now added third person cameras to the game, both for when the player is walking around, and for when they're seated.  I debated doing this for a while actually, because I don't currently have a proper player model, but I finally relented mainly because it's so much fun to be able to see vehicles from the outside as you're driving around!

The player models and animations I'm using are just placeholders that I put in ages ago for the prototype multi-player mode.  Of course this now forces the issue - I now have to decide what the player character(s) should look like, as well as source the models for them, and put in better animations.  Looks like I've just created a load of more work for myself!

Wheel physics revisited



OK, this is the big one.  It wasn't supposed to be a big deal, but ended up taking several weeks to sort out!  I wanted to build on the "proving ground" aspect of the desert map in the game, so I added some bumps and ramps (for testing vehicle suspension and so on).  However this highlighted a significant problem with the wheel physics.

Let's briefly recap how the wheels worked up until this point.  First the wheel finds where it contacts the ground, by firing a Raycast towards it (perpendicular to its rotational axis) to find a contact position and normal.  Then, it uses a ConfigurableJoint connected to the wheel's rigidbody, that every update gets repositioned using the contact data, and has a linear limit set up to provide the collision response.  If you're interested, I did a detailed write up on this a while back: https://forums.tigsource.com/index.php?topic=35532.msg1017068#msg1017068

Using a Raycast to find the ground contact point was acceptable on terrain with a smoothly changing gradient, but fails once other collision shapes besides the base terrain are introduced (such as boxes, spheres, etc.) for the wheels to roll over.



You can see here in this example that the Raycast can't "see" the box, so the wheel inter-penetrates it.  But worse, if the wheel continues to move in the direction shown, the Raycast will eventually hit the box, causing the contact point's height to change instantaneously, pushing the wheel up with a large impulse.

So I wanted to come up with a new technique to find the contact point that would meet some important criteria:-
  • 1. It should ensure that the contact point's position changes smoothly with no discontinuities.
  • 2. It should allow the wheel to accurately roll over box, capsule, and sphere colliders.
  • 3. It should not change the wheel's behaviour on the base terrain (this can be very sensitive, particularly for vehicles traveling at high velocities).
  • 4. It should not incur any additional performance cost over the existing solution.

I experimented with many alternative ideas, including using a bunch of BoxCasts to approximate a cylindrical shape, but everything I tried failed one or more of these criteria.  That is, until I eventually settled on using a single CapsuleCast in the downward direction, whose radius is the same as the wheel's.

However this clearly has similar problems to just simply using a CapsuleCollider for the wheel.  For example, if the wheel is tilted to one side relative to the ground, we get a contact point outside of the wheel, coming from one of the capsule's "end caps".  To get around this, I effectively clamp the contact point to be within the wheel's outer rim, as shown in the diagram below (this time viewing the wheel end on):-



This assumes that the terrain's gradient doesn't change too much between the found contact point and the final clamped point!

Another problem is shown here, where the CapsuleCast would find a contact point on the box in this example, not the point on the ground that we actually want:-



To get around this, I simply discard any contacts coming from colliders outside the planes indicated by the dashed lines in the diagram above.  So in this example the box's contact point would be discarded, and the ground contact point is used instead.

So all in all, this technique is a bit of a kludgy approximation of a true cylindrical collider, but it actually seems to work quite well.  I'm pretty happy with the results!

Other stuff

I've also done load of code refactoring, bug fixes, UI improvements, rendering improvements (post processing effects, lighting), and other miscellaneous stuff over the past few months.  Check it all out in the new demo build, have fun!

« Last Edit: March 24, 2018, 04:02:26 PM by dangersam » Logged

dangersam
Level 2
**



View Profile WWW
« Reply #137 on: March 03, 2018, 01:03:29 PM »

Here's part 2 of this player creation's series, some very cool stuff in this one. The final part will be uploaded very soon.


« Last Edit: March 10, 2018, 01:09:47 PM by dangersam » Logged

dangersam
Level 2
**



View Profile WWW
« Reply #138 on: March 10, 2018, 01:06:12 PM »

The last video in this series showcasing GearBlocks player builds from last year, this one themed mostly around cars and trucks.


Logged

dangersam
Level 2
**



View Profile WWW
« Reply #139 on: March 24, 2018, 03:41:48 PM »

Wow, the past few weeks have been rough as far as productivity goes!  First my PC blew its power supply, so I couldn’t work for a couple of days while I was waiting for a new one and then installing it.  Then this week I was totally wiped out by a nasty cold and got pretty much no work done all week.  I guess that’s the way it goes sometimes, really frustrating though.



Anyway…I have now finished the pulleys and belts, barring a few minor bugs here and there.  The belt rendering is now done and working nicely, the belt automatically routes its way around pulleys based on how they are linked together, and seeing the belt really makes the behaviour of the pulleys appear more convincing.  Have to say I’m pretty pleased with how it all turned out!



I’ve also added a “pulley whirr” sound that changes based on the pulley’s RPM, and a “belt snap” sound for when the belt breaks (this happens when pulleys move too far from their original position).  These details all add to making the pulleys and belts seem “real”!
Logged

Pages: 1 ... 5 6 [7] 8 9 ... 12
Print
Jump to:  

Theme orange-lt created by panic