Jump to content
  • Advertisement
  • 01/28/19 02:11 AM

    XM-03 3D Model Workflow

    Visual Arts

    GameDev.net

    Hey! My name’s Tim Trankle and I’m a 3D Artist for Pixelmatic.

    My most recent task was to create the XM-03 Hornet for Infinite Fleet.  I overhauled our 3D asset production workflow to take advantage of new tools and techniques to keep our visuals on the cutting edge. The new workflow has really taken our ships to another level and I’d like to show you just how I make them.

     

    The Model

    Every ship model has to start somewhere, and I usually start a ship by making its most recognizable features. In the case of the Hornet, that would be the energy-sapping arms and the wings. They contribute heavily to the silhouette and help guide the overall shape.

    model1-01.png

     

    While I’ve worked with several modelling packages, my go-to for hard surface work is Blender. This is because its modifier toolset is great for creating detail in a non-destructive way and the modelling tools themselves are built for making meshes quickly. It also has great addon support for extending its functionality and there’s one addon that was crucial to this ship’s production that I’ll talk about in a little bit.

    For hard surface modelling, I usually like to start with a single polygon plane and build my way up from there. I find that it allows for the most flexibility when creating more unusual shapes. For the Hornet, nearly every large component that wasn’t based on a cylinder started its life as a single plane.

     

    FinishedLowPoly-01.png

     

    Here, all of the components are finished, but the polygons need to be smoothed. Right now, you can see that they are all hard shaded and identifiable. Typically, the solution to this is to create Smoothing Groups where some edges are soft shaded and others are hard shaded.

    SmoothingGroups-01.png

     

    This gets you most of the way there, but the edge between the two surfaces is perfectly sharp. On any surface, no matter how sharp the edge is, you’ll still see a highlight due to a bevel between the sides. Simply changing the smoothing groups doesn’t give you this. In the past, I’ve used an addon for Blender called TexTools to bake out a specially made normal map which would give me the bevel.

    NormalBevel-01.png

     

    As you can see, the edge around the top has a highlight on it conveying a bevel even though the model itself hasn’t changed. This works very well and requires very little setup but it is dependent on the texture resolution. If the texture is too low-res, then the bevel will appear pixelated and show some artifacts. For a ship as complex as the Hornet, this would’ve required an absurdly high-resolution texture to get a crisp bevel on the entire ship. Since most of the surface is flat, that means the normal map is mostly wasted space. I needed a new solution.

     

    Bevelled Edges and Custom Normals

    The solution I used was to create real bevels in the model. Normally, doing this by itself would result in shading artifacts as large faces are used to blend between vertex normals that are facing different directions. However, by adjusting the vertex normals manually, I can change the shading to be much cleaner. In Blender, I used an addon called Blend4Web which makes the adjustment of these normals very straightforward.

    BevelFaceNormals-01.png

     

    I went in and added these bevels to all the hard edges around the ship. Now, I don’t need smoothing groups as the entire model would be smooth shaded. I just needed to adjust the vertex normals. The results are edges that give crisp highlights and look much more solid and realistic.

     

    MechBeveledEdges-01.png

     

    Adding the Detail

    The Hornet is covered in panel seams, extrusions, markers, and lights. Before, I’d do all of this with the texture. I’d paint custom normal map details in Quixel nDo and then do the rest of the texturing in 3D-Coat but that strategy wouldn’t work here. Like with the normal map bevels mentioned earlier, the texture for the ship would need to be exceedingly high-res to capture all the detail I wanted to put on and have it be crisp and legible. The answer to this is to only create textures for the area where the detail needs to be. This is accomplished with decals.

    DecalExample-01.png

     

    The decals, in this case, are actually polygons that rest just above the surface of the model. They can affect the color, normal, and roughness maps of the surface underneath them. This means that they can add detail that blends seamlessly with the underlying textures and still adhere to all of the environmental lighting conditions.

    To create these, I use an addon for Blender called DecalMachine. It provides a wide assortment of tools for creating decal textures and applying them to your model. You can create panel lines based on mesh intersections, place decals directly on the surface, or project planes that will conform to the shape of your model if it’s curved.

     

    DecalProgression-01.png

     

    All of this makes the decal creation process fast, flexible, and fun. I can place the decals anywhere on the model and use Blenders modifiers like mirroring and creating arrays to easily populate the surface of the ship with detail.

     

    1544086579089.jpg

     

    Not only do the decals affect the normal map to create things like rivets or vents, but I can also create text and icons like the USF logo and place it wherever I want without having to erase texture layers or rebake any maps.

     

    WingInfoDecals-01.png

     

    Once I place all the decals that the ship needs, I’ll create a texture atlas. This is a single texture that has all of the decals that I used. This is the real power of using decals as this texture is independent of the rest of the ship. I can make the decals as small as I want and they won’t lose resolution.

     

    1544086578311.jpg

     

    On top of that, I can use this atlas for all of the ships in the game, which drastically reduces the number of textures that need to be stored in memory.

    For the XM-03 Hornet, every detail you see is done with decals. The panel seams, the vents, the warning labels, and even the lights are all separate polygons resting on the surface. This results in quite a few decals.

     

    1544086578855.jpg

     

    Texturing

    Since all of the unique detail on the ship is accomplished with the decals, this means that I can cover the rest of the surface with a set of tiling materials. These textures can tile independently of the decals which means I can scale them down and maintain a high level of detail even when the ship is viewed from very close up. Even though these textures are only 512x512, there is no pixelation.

     

    1544086578522.jpg

     

    One of the downsides of this approach though is that the surface of the ship becomes very homogeneous since everything is the same color. To break up the color and the roughness, I made a special shader that added a tiling dirt texture to the more occluded areas of the ship based on an ambient occlusion map.

     

    1544086578714.jpg

     

    Just like the rest of the textures for the paint, this dirt texture can be tiled independently from the decals or other textures. With that, the ship is finished! All that’s left is to set up some lights and the right post-processing effects to really show it off.

     

    XM-03.jpg

     

    We hope you enjoy gorgeous graphics as much as we do. While we still need to improve and optimize this new workflow, this is a huge step forward for us to be able to provide you with stunning models in Infinite Fleet.

    Stay tuned for more to come and feel free to reach us on our Discord if you have any questions.

     

    Note: This article was originally published on the Infinite Fleet blog, and is reproduced here with the kind permission of the author.  You can chat with the creators on their Discord or Twitter, or check out the trailer for the game on YouTube.



      Report Article


    User Feedback

    Create an account or sign in to leave a review

    You need to be a member in order to leave a review

    Create an account

    Sign up for a new account in our community. It's easy!

    Register a new account

    Sign in

    Already have an account? Sign in here.

    Sign In Now

    There are no reviews to display.


  • Advertisement
  • Game Developer Survey

    completed-task.png

    We are looking for qualified game developers to participate in a 10-minute online survey. Qualified participants will be offered a $15 incentive for your time and insights. Click here to start!

    Take me to the survey!

  • Advertisement
  • Latest Featured Articles

  • Featured Blogs

  • Advertisement
  • Popular Now

  • Similar Content

    • By Lewa
      So to give a bit of context as to what i'm trying to achieve and where i seem to be failing at:
      I'm currently implementing an SSAO approach which requires me to reconstruct the viewspace position from the depth buffer.
      The depth is encoded into an RGB (24 bit) texture. (As i can't access the depth buffer directly.)
      To prepare for depth reconstruction i inverse the projection matrix: (and i think herein lies the issue: )
      Now, i noticed that there is an issue with the reconstructed depth component in the shader.
      So in DirectX, +Z goes towards the screen while -Z goes into the distance (effectively reversed compared to OpenGL)
      However, after hours of debugging i simply tried to render the sign of the Z coordinate. And this is the result:

      For some reason, the Z coordinate is positive (up until a point) which is shown as the green coloring in the scene.
      And after that it becomes red (where z becomes negative).
      From my understanding it should be all red (as the Z component should start to be negative from the cameras origin point.)
      (The encoding/decoding of RGB values was tested and shouldn't be the culprit.) Has anyone an idea/direction as to what the issue could be? (I think that maybe the conversion process for the inversion call might be the cause of this?. Or maybe the reconstruction in the shader is wrong?)
    • By komires
      We are proud to announce the release of Matali Physics 5.0, the fifth major version of Matali Physics engine. The latest release moves Matali Physics engine to the group of solutions supporting the three main next-generation graphics APIs: DirectX 12, Vulkan and Metal on deskop and mobile platforms.
      What's new in version 5.0?
      Matali Render 5.0. The latest rendering module brings unified lighting, shading and fogging system ready to extend to ray tracing or combined with ray tracing as well as ready for production use, native, comprehensive support for Matal API. We would also like to point out that in the provided solution we use the Metal API directly without C++ wrappers or third-party libraries. Since Matali Render 5.0 support for Metal API fully replaces support for OpenGL ES 3.0 and OpenGL 3.3 on iOS and macOS respectively; Support for Android 10, iOS 13.x, iPadOS 13.x and macOS Catalina (version 10.15.x) as well as support for the latest IDEs; Other improvements and fixes which complete list is available on the History webpage.
      What is Matali Physics?
      Matali Physics is an advanced, multi-platform, high-performance 3d physics engine intended for games, virtual reality and physics-based simulations. Matali Physics with add-ons forms physics environment which provides complex physical simulation and physics-based modeling of objects both real and imagined.
      The engine is available across multiple platforms:
      Android *BSD iOS iPadOS Linux macOS SteamOS UWP (Desktop, Xbox One) Windows Main benefits of using Matali Physics:
      Stable, high-performance solution supplied together with the rich set of add-ons for all major mobile and desktop platforms (both 32 and 64 bit) Advanced samples ready to use in your own games New features on request Dedicated technical support Regular updates and fixes
      If you have questions related to the latest update or use of Matali Physics engine as a stable physics solution in your projects, please don't hesitate to contact us.

      View full story
    • By komires
      We are proud to announce the release of Matali Physics 5.0, the fifth major version of Matali Physics engine. The latest release moves Matali Physics engine to the group of solutions supporting the three main next-generation graphics APIs: DirectX 12, Vulkan and Metal on deskop and mobile platforms.
      What's new in version 5.0?
      Matali Render 5.0. The latest rendering module brings unified lighting, shading and fogging system ready to extend to ray tracing or combined with ray tracing as well as ready for production use, native, comprehensive support for Matal API. We would also like to point out that in the provided solution we use the Metal API directly without C++ wrappers or third-party libraries. Since Matali Render 5.0 support for Metal API fully replaces support for OpenGL ES 3.0 and OpenGL 3.3 on iOS and macOS respectively; Support for Android 10, iOS 13.x, iPadOS 13.x and macOS Catalina (version 10.15.x) as well as support for the latest IDEs; Other improvements and fixes which complete list is available on the History webpage.
      What is Matali Physics?
      Matali Physics is an advanced, multi-platform, high-performance 3d physics engine intended for games, virtual reality and physics-based simulations. Matali Physics with add-ons forms physics environment which provides complex physical simulation and physics-based modeling of objects both real and imagined.
      The engine is available across multiple platforms:
      Android *BSD iOS iPadOS Linux macOS SteamOS UWP (Desktop, Xbox One) Windows Main benefits of using Matali Physics:
      Stable, high-performance solution supplied together with the rich set of add-ons for all major mobile and desktop platforms (both 32 and 64 bit) Advanced samples ready to use in your own games New features on request Dedicated technical support Regular updates and fixes
      If you have questions related to the latest update or use of Matali Physics engine as a stable physics solution in your projects, please don't hesitate to contact us.
    • By horror_man
      Hello, I'm currently searching for additional talented and passionate members for our team that's creating a small horror game.
      Devil's Punishment Main Menu
      About the game: The game would be a small sci-fi/post-apocalyptic survival horror 3D game with FPS (First person shooter) mechanics and an original setting and story based in a book (which I'm writing) scene, where a group of prisoners are left behind in an abandoned underground facility. It would play similar to Dead Space combined with Penumbra and SCP: Secret Laboratory, with the option of playing solo or multiplayer.
      Engine that's being used to create the game: Unity
      About me: I'm a freelance music composer with more than 4 years of experience, have been part of a couple of game jams having the role not only of music composer but also as game designer and writer (Necroxeon and Solemn Pastures for the Ludum Dare) and have participated in a bunch of other projects. Now I'm currently leading the team that's creating this beautiful and horrifying game. I decided that making the book which I'm writing into a game would be really cool, and I got more motivated about doing so some time ago when I got a bunch of expensive Unity assets for a very low price. However, I researched about how to do things right in game development so I reduced the scope of it as much as I could, so that's why this game is really based in a scene of the book and not the entire thing. Also I'm currently learning how to use Unity and learning how to program. We're creating something new for the horror genre that's far from being your usual jump scare game.
      Our team right now consists of: Me (Game Designer, Creator, Music Composer, Writer), 3 3D Artists, 3 Game Programmers, 2 Concept Artists, 1 3D Animator, 1 Community Manager and 1 Writer.
      Who am I looking for: 
      -Programmer: We are looking for a talented and passionate gameplay programmer that is familiar with the horror genre and has experience with C# and Unity. Having knowledge with random map generation, FPS, UI, Networking, github, AI, Inventory System mechanics is a plus.
      -3D Environment Artist: We are looking for a talented and passionate 3D Artist that is familiar with the horror genre and has experience with hard surface and the modeling of realistic high poly underground/closed environments.
      Right now the game is in late development and you can see more information about it and follow our progress in our game jolt page here: https://gamejolt.com/games/devilspunishment/391190 . We expect to finish some sort of prototype/demo in 2 months from now.
      This is a contract rev-share position
      If you are interested in joining, contributing or have questions about the project then let's talk. You can message me in Discord: world_creator#9524
    • By yp3y5akh0v
      Hey guys, do you know how to fix this hexagon pattern on icosphere ? I'm sure that normals are calculated correctly per each faces. Is it because normals are not defined on edges ? See pic bellow for more details + source.
       

×

Important Information

By using GameDev.net, you agree to our community Guidelines, Terms of Use, and Privacy Policy.

GameDev.net is your game development community. Create an account for your GameDev Portfolio and participate in the largest developer community in the games industry.

Sign me up!