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


    Oh sweet ba-jeebers yes! Here we go.... I've always hated the 'slap a tile-able on it' but this is brilliant. Please come back :D

    Share this comment


    Link to comment
    Share on other sites


    Create an account or sign in to comment

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

    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

  • 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 Shadowsane
      My project started in 2014 but recently ended due to no funds.  AltarisNine was a Minecraft project based on RPG. The concept was nine islands that you explore at a time to follow an in depth lore based on our own production team. This is where the 'Nine' comes in. With skepticism of future success we hope to make this tale into chapters. Such as the first one introducing Nine islands at time.
      It wasn't always the same though, my world did evolve over time and now I have a better idea of what it is better than ever. In the first island, Main Isle, is themed around jungles and wilderness. There's lore that stretches throughout the chapter which will engage the player. There would also be kinds of characters you can be such as any other RPG which could be talked about (because i'm still  about what I have lol)
      My former team was designing a world players would get into interact with in various ways. Boss battles would be minigames and the RPG lore would be engaged in and something indie platforms would enjoy and talk about beyond platforms.
      In the minecraft varient I was a builder, the leader, and the story director which everyone respected. I led my own team of builders and story writers. While I chose certain individuals to be the head department of development and art design.
      The reason I am here is to find a new team to help take this away from minecraft and hope we can be successful about it. I'll happily commute each and every person that volunteers and will be accommodated down the line with promotions, wages, and definitely praised for helping start my dream up.

      Here are some questions that were frequently asked and that I can thoroughly answer:
      What is the goal of the game? If you've ever heard of Wizard101. I got inspired by that game a little. I like the concept of making yourself in this world of mystery and impressing people with new mechanics and events that they enjoy. I'd like for the game to be successful and be mostly on PC but if this keeps up we could reach out to other consoles. But for now, PC, one platform at a time lol. My goal personally is to give people the entertainment and enjoyment I think they'll deserve. Something thats not cheesy, not cliche, something new to keep evolving the gaming community Is this in first-person or third-person? This will be a third person game. We can play around with the camera angles but I kind of want it from a aerial pov I saw RPG in the post so can I assume that the game will have generic RPG elements, e.g. quests, npcs, story-line, items? Yes this will have generic RPG elements. But with a few surprises that make the game different. Such as making boss fights some type of minigame. I don't know how the audience will like or even if it'll flow with game play. But I'd still like to take the idea on for now. Will there be combats, e.g. vs. monsters, vs. players(?) ? There will be tons of concepts. As i've said before the 'Nine' comes in the Nine isles of this world we haven't named yet lol. Each nine islands we come up with will not only give players plenty of content to play, but something we break up into story chapters. Each island will have its on set monsters tied to the story or even monsters that are just natural in their environment. There will also be a PvP aspect which can't be brought up too much because its difficult to try to come up with a player style culture that isn't too predictable or generic or even cliche. I was wondering if it should be an initiated fight or a head on duel like world of warcraft. Is this a single player game or a multiplayer one? Definitely multiplayer. Will the game look like Minecraft? like a voxel/blocks game? I imagined it not looking like minecraft but maybe that can be a concept of its own down the line (like an island concept). I was thinking along the lines of a 3D style and not like minecraft. What are the core mechanics to be included, e.g. player movement, enemy movement, enemy AI? This question is more technical but there will be interactive things in the world, things to collect, natural occurring crafting supplies to make new loot and weapons with. There will be NPC's and thats a broad topic enough lol. I'd even a imagine a pet, housing, and gardening system. But thats for accessories in coding and to give more content in the game for later polishing. Is there a storyline already made? There is an indirect storyline. We've made a script for voice actors (and just what to make the NPC's say in general) in A9 v1. Are there goals already planned out? There are many goals to set out. One each at a time for separate upcoming departments The first 8 pictures were of our hub, the other 9 was our factions world. The factions world doesn't retain to this project I wanted you to see how dedicated I was to making this project. I built everything in the hub myself except for the giant pagodas. The last two photos were all the ones I could find of the RPG world
       




















    • By Octane_Test
      I want to render an ocean where players can change waves’ amplitude in real-time. Initially, I would render rolling waves (see picture). As the amplitude increases, I need to transition the rolling waves into breaking waves (see picture). For now, I am not going to show the shoreline onscreen so I don’t need to render breaking waves interacting with the shoreline; I only need breaking waves on the open ocean.

      I’ve tried three different approaches so far and I’ve only had success with rolling waves using approach 1. Breaking waves have been impossible so far with all three approaches.

      Approach 1: Mesh deformation

      a.     I can create smooth rolling waves using the Sine and Gerstner equations.

      b.     Since I can’t use these equations for breaking waves, I tried to implement them by using this free plugin whose output is similar to this paid mesh deformation plugin. But there are 2 problems with this plugin approach:

      ·      There is no smooth transition between rolling waves generated by approach 1a and the breaking waves generated by the Deform plugin

      ·      The output of the plugin does not look similar to real breaking ocean waves in three different ways:

                                                     i.     No smooth blending with the ocean surface

                                                    ii.     A large depression is created below the crest

                                                  iii.     The entire wave is the same height (rather than with more realistic variations)

      c.      I considered using vertex shaders but this approach seems similar to mesh deformation.

      Approach 2: Fluid dynamics + metaballs

      1.     To render an ocean I will need thousands of particles which will be too expensive in terms of performance (especially for mobile devices).

      Approach 3: Using mesh files

      1.     I can create breaking waves using some 3D software like in this post but then I can’t modify the ocean in real-time. It will be more like a pre-rendered simulation.

      To summarize, I am looking for an approach where I can vary ocean waves’ amplitude for a smooth transition between rolling waves and breaking waves. Please let me know if you have more questions.

    • By bandages
      So, in real life, incoming dot normal at the silhouette is always 0.  With smooth shaded meshes, it never is, not naturally, not outside of contrived situations.  (Not with flat shaded meshes either, I guess.)
      And incoming dot normal is one of the bedrocks of CG.  Probably the equal of 4x4 matrix multiplication.  Problems with silhouette normals show up in Fresnel, in diffuse lighting, in environment mapping....  everywhere.  But I can't really find anybody talking about it.  (Maybe I'm not Googling the right terms.)
      Obviously, the problem decreases as poly count goes up, eventually reaching a point where it's dwarfed by other silhouette problems (like translucency or micro-occlusion) that CG doesn't handle well either.  But, if I'm reasoning correctly, normal maps don't improve the problem-- they're as likely to exacerbate it as improve it, and the exacerbations are, aesthetically speaking, probably worse than the improvements are better.
      I've tried playing with crude fixes-- basically, rotating normals toward incoming by a percentage, or of course clamping incoming dot normal (like we all have to do) to prevent it from bending behind the mesh.  Nothing I've tried looks good.  I suppose the best option might be to rotate normals to perpendicular to incoming at the silhouette and then interpolate to the nearest inflection point  of something like screen space depth to preserve curvature, but the math for how to do that is beyond me, and I'm not sure it would look any better.  Or maybe, instead, somehow, adjust the drawn silhouette to match the silhouette defined by incoming dot normal?  Not even sure how that would work, not if the normal was pointing away from incoming.
      I don't know-- is this a solvable problem?  Has anyone tried other stuff and given up, pursued anything that was promising but too expensive, anything like that?  Are there any papers I'm missing?  It's really surprising to me that I can't find anyone else talking about this.
      (Apologies if I chose the wrong subforum for this.  I considered art forums, but I felt that people frequenting the programming forums would have more to say on the subject.)
    • By Pepsidog
      I'm wanting to create a hybrid game between turn based and action.  I'm looking to create a system where the player has a list of attack or move options on their turn, but I want to add a skill minigame in order to make the game more engaging for non-strategists.  I figured some sort of minigame or something.  Any ideas are welcome.  Thanks in advance!
    • By vinibiavatti
      Hi there! I have one issue for now. I'm creating a RayCasting application, and for my floor and ceiling I'm trying to use Mode7 for rendering (I think this is easier to understand). but, I cant align the RayCasting walls with the mode7 floor. I use a rotate matrix to make the rotation of floor. Do you know what a need to think in the implementation to fix that? Or do you know if there is some tutorial explaining about it? Thanks!!! (Check the image below for understand)

      Here is my mode7 code:
      function mode7() { let _x = 0; let _y = 0; let z = 0; let sin = Math.sin(degreeToRadians(data.player.angle)); let cos = Math.cos(degreeToRadians(data.player.angle)); for(let y = data.projection.halfHeight; y < data.projection.height; y++) { for(let x = 0; x < data.projection.width; x++) { _x = ((data.projection.width - x) * cos) - (x * sin); _y = ((data.projection.width - x) * sin) + (x * cos); _x /= z; _y /= z; if(_y < 0) _y *= -1; if(_x < 0) _x *= -1; _y *= 8.0; _x *= 8.0; _y %= data.floorTextures[0].height; _x %= data.floorTextures[0].width; screenContext.fillStyle = data.floorTextures[0].data[Math.floor(_x) + Math.floor(_y) * data.floorTextures[0].width]; screenContext.fillRect(x, y, 1, 1); } z += 1; } }  
×

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!