[ONG] Offroad Racer - Indie Game Dev Log

1
polycounter lvl 3
Offline / Send Message
defragger polycounter lvl 3
hi guys,

we (my brother and I) are working on a game project which by the way is not called offroad racer but we cant tell you the name of the game yet. We would like to share some insights and behind the scenes because basically, why not. There is no big company attached ... no nda´s and stuff. I learned so much reading this kind of topics on polycount that I feel like maybe this will help someone somehow or at least be entertaining for the real game developers who will probably laugh at our mistakes. ;)

....well, who are you people?

We are 30 and 28 years old and have been working in military software development in germany for some time. I did a brief stint in game dev but sadly game companies in germany tend to like browser games very much.

....so?

We love games and we love developing games and the technology behind them even more. So we both quit our jobs and are working on this project fulltime now .... YAY!

....good for yeee! How is this supposed to work then?

We are planning on releasing our game on steam later this year. Since we are only two guys doing all the work and also developing our own engine this is a massive task.

....wait, you chumps are developing your own engine??

Developing the entire engine will be great, my brother said. It will be fun, he said. Yeah, but seriously it already starts paying off with the suspension animation, driving physics, wheel blur .... local splitscreen playing online and whatnot. But I dont want to bore you with details at this point.

....yeah, now show some pictures! And after reading your freakin life story they better be good -.-

Thanks for reading and keep in mind that we are still very much working on this so most is alpha, alpha. Like proper alpha!

High-poly renderings (more on artstation):




The car is pretty much modular. This is a bake check of the mainframe module (low-poly plus normal) baked with knald:


I purchased this awesome kit http://mvhaitsma.artstation.com/projects/Wdzqv and also the one with the cables.
And used it whenever possible:


I also purchased the "325 hard surface alphas". Unfortunately I couldnt use them as much as I had hoped, but still.

And here are some ingame shots (ignore terrible sky):








suspension at work (ignore terrible ground texture):


driving with oversteer through power and opposite lock:


suspension rigging:


car inside engine editor:


Will post more in the future!

Replies

  • defragger
    Offline / Send Message
    defragger polycounter lvl 3


    This is the mainframe module albedo texture. We use a color key method after dxt compression to pick basically any color for the colorable (green) parts without loading different textures.




  • defragger
    Offline / Send Message
    defragger polycounter lvl 3
    first try on exhaust flames



    I have no idea how to do these effects properly so I downloaded a video of a bonfire and extracted few frames and built a simple atlas texture. The texture is LDR so we use an emissive value.



    The atlas is mapped to a simple poly cross (which looks ridiculously stupid btw). Will have to do something about this. :|



  • defragger
    Offline / Send Message
    defragger polycounter lvl 3
    hi guys,

    The car consists of five modules. Texturing was done using quixel. It took about 50-60 hours.

    - cockpit
    - mainframe
    - suspension_front
    - suspension_rear
    - wheel


    (AO rendered in Max from this scene. Thats why the inside of the wheels are missing. Didn´t want AO on the suspension parts)

    Every module has its own texture and was textured seperately using Quixel.
    Therefore I assembled a small library of custom materials inside Quixel so that every module looks similar.


    (16 custom mats have been used for the entire car. Including dirt and sand)

    Obviously I used mat ID´s to apply the base materials automatically
    This is what the mat ID´s look like. I did a quick render to texture inside max with scanline renderer to translate them into input maps to use with quixel.



    UVs were auto packed using maya. After months of retopology I REALLY did not want to do this manually too.

  • s1dK
    Offline / Send Message
    s1dK polycounter lvl 6
    This is freakin awesome, can wait to see more, subscribed.
  • defragger
    Offline / Send Message
    defragger polycounter lvl 3
    sorry that the thread is such a mess!
    I´m just throwing stuff in that might be interesting. We have tons more. Let me know what you think or what you would like to see. C&C Welcome !!

    Doing actually working offroad suspension was pretty difficult. All the pivot points and length have to match. I did tons of research on this topic. Watching videos about camber change on suspension travel and whatnot.





    Also the camber should increase slightly as the wheel travels up as seen below. At first we encountered a lot of negative camber on wheel travel which looked really goofy because the upper and lower control arms were not parallel.




    The animation is split inside the engine and then blended according to steering input and physics (spring compression)


  • defragger
    Offline / Send Message
    defragger polycounter lvl 3
    hello polycount,

    With an open wheel car like this we decided that it would be mandatory to have a proper radial motion blur for the wheels. It turned out really great IMHO. We are using a custom blurcage mesh that fully encloses the wheel to achieve this.




    The blurcage could use some polycount fix up :p

    c&c welcome as always!
  • AtticusMars
    Offline / Send Message
    AtticusMars greentooth
    Really cool, love the design and the amount of detail you put into the suspension. Wish I had more substantive feedback but seriously, awesome work...

  • Raffles
    Offline / Send Message
    Raffles vertex
    Kudos to the highly realistic suspension model you've built. I'd love to read more details about the suspension and physics.

    I'm in the same boat as you, I've built my own graphics and physics engines for my first mobile game. I agree it sounds great at first, and simple enough, but the work is just relentless - even once it's working well, you realise you have to implement every extra little thing you want :)

    How does the blurcage work btw? This is the first time I've heard the term.
  • defragger
    Offline / Send Message
    defragger polycounter lvl 3
    thank you! Appreciate it!

    Here is a small glance at the first race track level. My personal best time is 1:22 min so far :D



  • defragger
    Offline / Send Message
    defragger polycounter lvl 3
    Raffles said:
    Kudos to the highly realistic suspension model you've built. I'd love to read more details about the suspension and physics.

    I'm in the same boat as you, I've built my own graphics and physics engines for my first mobile game. I agree it sounds great at first, and simple enough, but the work is just relentless - even once it's working well, you realise you have to implement every extra little thing you want :)

    How does the blurcage work btw? This is the first time I've heard the term.

    thank you!

    My brother does all the programming. I´m just the artist. I will ask him to answer your question about the blurcage. We use the bullet physics engine but he heavily modified it.

    These are the exposed parameters to setup the car handling:



  • defragger
    Offline / Send Message
    defragger polycounter lvl 3
    hi guys,

    just want to show you something thats barely visible in-game but quite some time went into this. :s



    screenshot from 3do while quixeling this up:



  • miezis
    Offline / Send Message
    miezis polycounter lvl 4
    Wonderful detail! And that's a lot of work. 6000 working hours... that's more than two full years of 9-5 with no weekends. Holly molly...
  • defragger
    Offline / Send Message
    defragger polycounter lvl 3
    miezis said:
    ... that's a lot of work. 6000 working hours... that's more than two full years of 9-5 with no weekends. Holly molly...
    Thanks a lot!
    Yes it has been a ridiculously stupid amount of work so far. I did 9-5 for the cash and 6-2AM of this after. Spent almost every weekend and used all regular vacation and four weeks of additional unpaid vacation 11-4AM every day.
    Thats why we had to go fulltime. After some time its just impossible to carry on.
  • Kroma!
    Offline / Send Message
    Kroma! polycounter lvl 4
    This looks really cool, I love the progression you've shown. Those UVs! Following this thread :smiley:
  • Asura
    Online / Send Message
    Asura polycounter lvl 3
    Subbed to this thread. Everything here looks dope! Also massive kudos to the suspension rig and materials :)


  • Makkon
    Offline / Send Message
    Makkon greentooth
    I love everything in this thread. Excited to see more in the future. Delicious hard surface modeling!
  • Grubber
    Offline / Send Message
    Grubber polycounter lvl 8
  • defragger
    Offline / Send Message
    defragger polycounter lvl 3
    Thank you so much! Really appreciate it!

    I will get back to the car but would like to show you construction of racetrack #1 for now.
    There still is a lot of work to do but we got rid of the dynamic blue sky and added a nice HDRI skydome that added a lot of atmosphere already.



    I started drawing a track layout with photoshop. Took it to 3dsmax and did a quick reconstruction using bend modifier on basically bunch of planes.



    I sculpted in the height differences that I wanted and did a lot of play testing to make sure every corner is rewarding and a little bit challenging. Also to ensure the whole track has nice variations and is not to much of a challenge if that makes sense.



    ... rendered a heightmap of that.



    Plugged that into Worldmachine. Did a simple overlay and painted the ridge and mountains in Worldmachine.
    I´m using the AMAZING TeTo texture toolbox by Iri Shinsoj for splatmap creation and a unique basemap for large scale color-variation.
    https://www.artstation.com/artwork/teto-the-texture-toolbox



     I took the terrain to ZBrush after because it lacked a lot of detail right next to the track. There were nice big mountains and stuff but no mid size details near the track. This is what it looks like after few hours of ZBrush treatment:



    Now I´m retopologizing everything because it´s basically a heighfield and we dont want that for performance reasons. I strive for a nice transition between track and terrain a la GTA5. Already spent hours examining that :D


  • defragger
    Offline / Send Message
    defragger polycounter lvl 3
    We just had a tremendous amount of fun racing online until it resulted in some terrifying accidents. :D
    Most panels on the car are rigged so I hope we will be able to shed off parts and have visible damage soon.


    The gorge needs a bridge that has not been modeled yet. Collision only for now.


    ... overcooked it while catching up

  • Gazu
    Offline / Send Message
    Gazu polycounter lvl 5
    Man this looks pretty promising!
  • martygalinskas3d
    Offline / Send Message
    martygalinskas3d polycounter lvl 2
    it looks like the cars are understeering a lot, will you have a hand brake or a rear bias brake system to allow for more oversteering? i'd look at a lot of WRC (world rally cross) footage to see how the cars handle dirt. Another good point of reference would be trophy truck racing because of how similar the suspension travel is on those vehicles to yours.

    This looks really great so far and i love games like this. 
  • Chimp
    Offline / Send Message
    Chimp greentooth
    Looks promising, will be following it :)
  • orontes
    Offline / Send Message
    orontes triangle
    Hi everyone. Thanks for the encouraging feedback.

    I just wanted to explain a little more regarding the blurcage. The basic idea i got while reading "Shader X6 Chapter 3.4 Per-Pixel Motion Blur for Wheels by Damyan Pepper from Black Rock Studio". It describes the concept of a radial blur very well. They use a cylinder as proxy geometry for the blur direction, but for us this wasn't sufficient. So we turned up with our so called blurcage as shown above. The blurring itself is more modern and similar to "SIGGRAPH 2014 Next Generation Post Processing in Call of Duty: Advanced Warfare". We render the wheel like everything else in the deferred path while marking it with a special material id. Afterwards we copy just the wheels to a half resolution buffer. From there it gets blurred and blended over the scene in one go with the blurcage used as proxy geometry.

    Regarding the over and understeer we tried many many things including first hand real world driving with an FR drive train and much power :) Our first in game physic was indeed like an Understeer Simulator 2017. But i think we now have a more balanced driving and we also did a handbrake for the fun and the real pros. I love rally cross and it was in fact one of our inspirations for this game but you rarely see a real world driver going much too fast into a corner and facing unrecoverable understeer even though it would happen if he did. We plan to get a closed demo out soon to get more feedback on the driving itself.
  • jaker3278
    Offline / Send Message
    jaker3278 polycounter lvl 4
    Really great work, the suspension looks great, Will this be available online? 
  • plord
    Offline / Send Message
    plord polycounter lvl 3
    This looks awesome! Thanks for sharing the 'how-to' :smiley:
  • Polygons-Pusher
    Offline / Send Message
    Polygons-Pusher polycounter lvl 6
    just wow, the design of your vehicle and hard surface is just awesome =). Can't wait to see the alpha !

    Did you and your brother thought about doing a track editor directly in the engine so that you don't hassle too much if you need to do quick changes ?
  • defragger
    Offline / Send Message
    defragger polycounter lvl 3
    just wow, the design of your vehicle and hard surface is just awesome =). Can't wait to see the alpha !

    Did you and your brother thought about doing a track editor directly in the engine so that you don't hassle too much if you need to do quick changes ?

    Thank you :smiley:

    Yes we thought about a track editor. At this point it is possible to vertex-snap track modules together in engine.
    We decided against a "full on track editor" because its a lot of work and we dont consider it that beneficial at this point. We would like to give an open track editor to the gamers but thats far down the road.

    Our priorities are:

    - gameplay (fun single- / multiplayer online game)
    - stability and performance (linux / windows, 4k resolution)
    - the best gfx we can achieve (need to stick out on steam)
    - get it out on steam 2017

    Everything beeing equally important we have to be careful with new features and cut down on quantity. We think / hope that this is more gamer focused and hopefully will be rewarded in the end.
  • defragger
    Offline / Send Message
    defragger polycounter lvl 3
    hi guys,

    have been working on foliage and environment lately. Also did some new screenshots today. More over on ArtStation https://www.artstation.com/artwork/A5GVy




  • Froyok
    Offline / Send Message
    Froyok Polycount Sponsor
    Super work !
    I caught it up on ArtStation, will follow more on Polycount now. :)
  • Finalhart
    Offline / Send Message
    Finalhart polycounter lvl 3
    Wow, those vehicles have really interesting shapes, subbed for more! Love watching projects like this
  • defragger
    Offline / Send Message
    defragger polycounter lvl 3
    Froyok said:
    Super work !
    I caught it up on ArtStation, will follow more on Polycount now. :)

    ah damn, now I feel bad for not using Substance on this one ... :smile:
  • kanga
  • Techart
    I would definitely play this game.. great work so far guys!
  • chinomaker
    Offline / Send Message
    chinomaker triangle
    Keep up the great work! 
  • HansEberhart™
    Great nice work indeed. And I love the fact that you mentioned support for Linux. Is there a way to get more information about your engine? I already spotted GTK+/QT with the Adwaita theme.
  • defragger
    Offline / Send Message
    defragger polycounter lvl 3
    Great nice work indeed. And I love the fact that you mentioned support for Linux. Is there a way to get more information about your engine? I already spotted GTK+/QT with the Adwaita theme.

    It is in fact at home under Linux. My brother did a windows port for the editor and game. I hope my brother will post a little bit more details about the engine.
  • sadpunk
    Offline / Send Message
    sadpunk polycounter lvl 2
    Well If I'm gonna raise my head above the parapet (first ever post here) it should be for something truly inspirational and great like this. 

    Excellent community spirit shown with you guys sharing your development endeavours. 

    As a long time developer, mainly in the racing genre, this is very inspiring to me personally and I am very envious of the fact you are working together as brothers. Perfect scenario. 

    Keep up the great work and the excellent posts to this thread. 
  • HAWK12HT
    Offline / Send Message
    HAWK12HT polycounter lvl 5
    You guys rock oh boy oh boy how did I miss this!!!! I am just soaked up in your suspension rig and attention to detail! 
    Again all the best for final launch :) 
    I am Fahad from Artstation btw :D 
  • HansEberhart™
    Your engine sounds really impressive. As specially for a two person project. I used GTK3 for some small python programs as well (Mostly for a custom UE4 launcher because epic doesn't provide the launcher on Linux :/). But I didn't knew it could handle a whole engine.
    Do you have a twitter account? I would love to be kept up to date with this project,
  • Ckafee
    Offline / Send Message
    Ckafee vertex
    i love your work. you are reall talented. I was wondering if you could make a tutorial/breakdown on how to make such complicated rigs and get them in the engine. and how to get the dynamics damage you were talking about earlier?
  • ikkyu71
    Hallo ihr beiden, sieht alles fantastisch aus.  o==(========>   weiter so !!      : D
    Grüsse aus Warthausen !
  • defragger
    Offline / Send Message
    defragger polycounter lvl 3
    @ikkyu71: Danke! Grüße an alle!

    @Ckafee: Thank you!

    I recorded a video "tutorial" about the suspension rigging & animation today. Sorry for my awful english :smile:

  • Ckafee
    Offline / Send Message
    Ckafee vertex
    defragger said:
    @ikkyu71: Danke! Grüße an alle!

    @Ckafee: Thank you!

    I recorded a video "tutorial" about the suspension rigging & animation today. Sorry for my awful english :smile:

    I could follow everything, really impressive! most of the look ats and IK sovlers are script in engine again right?
  • defragger
    Offline / Send Message
    defragger polycounter lvl 3
    Ckafee said:
    I could follow everything, really impressive! most of the look ats and IK sovlers are script in engine again right?

    no, typically everything gets baked to keyframes when exporting as FBX file. The engine doesnt have to deal with IK or anything. On export there is one key placed for every frame with all bone tranformations as fixed values.
  • Ckafee
    Offline / Send Message
    Ckafee vertex
    defragger said:
    Ckafee said:
    I could follow everything, really impressive! most of the look ats and IK sovlers are script in engine again right?

    no, typically everything gets baked to keyframes when exporting as FBX file. The engine doesnt have to deal with IK or anything. On export there is one key placed for every frame with all bone tranformations as fixed values.
    but if you do it that way, you dont have the dynamic physics in engine right?
  • defragger
    Offline / Send Message
    defragger polycounter lvl 3
    Ckafee said:
    but if you do it that way, you dont have the dynamic physics in engine right?

    ehrm... lets make a very simplified example:

    Front right wheel hits a rock. Physics "says" the front right wheel has traveled up 20%. Engine plays animation clip "spring_FR" to frame 15 which equals 20% up movement. Of course this happens live so the suspension matches to the wheel at all times. Now lets say the player is also steering to the left at the exact same moment the wheel is hitting that rock. Now we also need to play animation clip "steer" to frame 63 but since the wheel has also traveled up it needs to be blended with the animation clip "spring_FR".

    So in other words the suspension is just reacting to the physics.

    It is a lot more complicated than that but lets keep it simple for now.
  • orontes
    Offline / Send Message
    orontes triangle
    Yes that's right.

    So how do you get all this into the engine together with real physically moved and steered wheels?

    The way it works is basically this:
    The whole suspension with the spring and all gets set up and animated in 3ds max. Nothing of this is exported directly to the engine. Instead the full travel way for steering as well as suspension movement is baked as ready made key frame animation data together with the bones. This gets exported the exact same way as mocap data. It is a skeleton of bones with there associated vertex weights plus one list of key frames consisting of one transformation per bone per key frame. So you can simple play this back in the engine. Just hit play and you see the suspension moving from full up to full down and afterwards from full left to full right.
    The individual clips get set up in the engine so the scripting knows from which key frame to which you have which animation. You can see this on one of the screenshots above.

    Then comes the trick:
    One special helper point is exported like a normal bone together with this data. This special bone is detected by the engine by its name. It follows the wheel throughout the animation. So it always represents the final position and orientation of the wheel axel for every key frame. The engine now creates a mapping from key frame to final axel transformation by playing back the animation once and recording the position and orientation of this helper bone. If you now inverse this mapping (if you want by searching through it for a specific result value) you know which key frame you have to use to get lets say 10% steering left. This way you can take the needed wheel position from the physic and set the fitting key frame from the animation data. Voila you have a traveling suspension.

    Now comes the problem:
    It gets tricky when you want both, traveling suspension, as well as steering at the same time on the same wheel. Then you have one key frame for the suspension to travel 20% in and another one for it to steer left 10%. You have to use them both at the same time now. This is no problem as long as the two animations affect a different set of bones like for a character when the run animation is played on everything below the waist and the shoot animation on every bone above. In our case this is unfortunately not a solution cause both animation frames affect exactly the same bones.

    And the solution:
    We export a special neutral position on key frame 0. This neutral position has no steering and mid suspension travel. It doesn't belong to any animation directly. It is just used as a reference. When we want to have an animation that does both, steering and travel, we do the following. We subtract the bone transformations of the reference pose from our steering and travel animation transformations. So we have two sets of bone transformations representing the delta between the reference pose to the wanted steering and travel pose each. Now it is just adding everything together. Reference pose plus steering delta, plus travel delta. Voila you have both at the same time.

    This works well but not 100% exact. To not have the wheel look a bit loose on the axel but instead like a fully rigid thing we place it at the helper point and not at the "should be position" that was coming from the physics and was our original input to all of this. This has the nice side effect of giving us the correct camber and inward movement which is not provided by the physics engine.

    Hope i didn't bore you with to much technical stuff here :)
  • Ckafee
    Offline / Send Message
    Ckafee vertex
    defragger said:
    Ckafee said:
    but if you do it that way, you dont have the dynamic physics in engine right?

    ehrm... lets make a very simplified example:

    Front right wheel hits a rock. Physics "says" the front right wheel has traveled up 20%. Engine plays animation clip "spring_FR" to frame 15 which equals 20% up movement. Of course this happens live so the suspension matches to the wheel at all times. Now lets say the player is also steering to the left at the exact same moment the wheel is hitting that rock. Now we also need to play animation clip "steer" to frame 63 but since the wheel has also traveled up it needs to be blended with the animation clip "spring_FR".

    So in other words the suspension is just reacting to the physics.

    It is a lot more complicated than that but lets keep it simple for now.
    Allright i get, and your friend explaned it even indepth. Really interesting to read. Now the following question, if you would (and i say would) script the solvers and the look ats in the engine could you get it 100% perfect to as it is in 3dsmax? and if yes why wouldn't you do it through physics?

    @orontes Great explanation, didnt bore me at all! You guys earn respect:D
1
Sign In or Register to comment.