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 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
  • Advertisement
  • What is your GameDev Story?

    In 2019 we are celebrating 20 years of GameDev.net! Share your GameDev Story with us.

    (You must login to your GameDev.net account.)

  • Latest Featured Articles

  • Featured Blogs

  • Advertisement
  • Popular Now

  • Similar Content

    • By DividedByZero
      Hi Guys,
      I am playing with projective texturing which I now have working well.
      However, I am having troubles figuring out how to blend the original texture with the projective texture. I am trying to make it so the projective texture is painted on top of the original texture.
      I have come close with this
      textureColor = TextureStandard.Sample(SamplerWrap, input.textureCoord); float4 texMixed = (projectionColor * projectionColor.a + textureColor * (1 - projectionColor.a)); color *= texMixed;  
      But this is giving me the following output;

      The skull should be a solid black, and the greens are a bit washed out outside of the projected area.
      Any advice on how to cleanly project the skull on to the body would be truly appreciated.
      Thanks in advance
    • By muttsang
      Hello everyone,
      I am a Games Tech and Design student in my second year and I have made a game on the side for mobile. I want to publish the game in the Play Store for Android and I do not want to make money out of it. I just want to have a free game on the play store because I want to experience publishing games on platforms accessible to majority of people and enjoy what I have done. The problem is i do not know anything about copyright laws and legal stuff and I have used some assets from the internet where they have said the asset can only be used for personal use.
      I want to know if I could get in trouble for using those stuff for a free game (no monetization). and if i have to refer the original creator, how would I do it? 
      Sorry if it is a common and silly question but I have no idea whatsoever on the legal stuff. I looked it up on the internet and have found out that if the game does not make money i can publish it and some said that i could get into legal trouble if i am not careful about it. 
       
      Thanks,
      muttsang
    • By Transcendent
      So this is the problem that I have :- https://youtu.be/kU8Dm5bDJXg
      This is the code i am using:-
      using System.Collections; using System.Collections.Generic; using UnityEngine; namespace SA { public class AnimatorHook : MonoBehaviour { Animator anim; StateManager states; public void Init(StateManager st) { states = st; anim = st.anim; } void OnAnimatorMove() { if (!states.canMove) anim.ApplyBuiltinRootMotion(); states.rigid.drag = 0; float multiplier = 1; Vector3 delta = anim.deltaPosition; delta.y = 0; Vector3 v = (delta * multiplier) / states.delta; states.rigid.velocity = v; } } } For additional reference see the following code
      using System.Collections; using System.Collections.Generic; using UnityEngine; namespace SA { public class StateManager : MonoBehaviour { [Header("Init")] public GameObject activeModel; [Header("Inputs")] public float vertical; public float horizontal; public float moveAmount; public Vector3 moveDir; public bool rt, rb, lt, lb; [Header("Stats")] public float moveSpeed = 5f; public float runSpeed = 8f; public float rotateSpeed = 20; public float toGround = 0.5f; [Header("States")] public bool onGround; public bool run; public bool lockOn; public bool inAction; public bool canMove; [Header("Other")] public EnemyTarget lockOnTarget; [HideInInspector] public Animator anim; [HideInInspector] public Rigidbody rigid; [HideInInspector] public AnimatorHook a_hook; [HideInInspector] public float delta; [HideInInspector] public LayerMask ignoreLayers; float _actionDelay; public void Init() { SetupAnimator(); rigid = GetComponent<Rigidbody>(); rigid.angularDrag = 999; rigid.drag = 4; rigid.constraints = RigidbodyConstraints.FreezeRotationX | RigidbodyConstraints.FreezeRotationZ; a_hook = activeModel.AddComponent<AnimatorHook>(); a_hook.Init(this); gameObject.layer = 8; ignoreLayers = ~(1 << 9); anim.SetBool("onGround",true); } void SetupAnimator() { if(activeModel == null) { anim = GetComponentInChildren<Animator>(); if(anim == null) { Debug.Log("no model found"); } else { activeModel = anim.gameObject; } } if(anim == null) { anim = activeModel.GetComponent<Animator>(); } //anim.applyRootMotion = false; } public void FixedTick(float d) { delta = d; rigid.drag = (moveAmount > 0 || !onGround) ? 0 : 4; DetectAction(); if (inAction) { // anim.applyRootMotion = true; _actionDelay += delta; if(_actionDelay > 0.3f) { inAction = false; _actionDelay = 0; } else { return; } } canMove = anim.GetBool("canMove"); if (!canMove) { return; } //anim.applyRootMotion = false; float targetSpeed = moveSpeed; if (run) targetSpeed = runSpeed; if(onGround) rigid.velocity = moveDir * (targetSpeed * moveAmount); /* if (run) lockOn = false; */ Vector3 targetDir = (lockOn == false) ? moveDir : lockOnTarget.transform.position - transform.position; targetDir.y = 0; if (targetDir == Vector3.zero) targetDir = transform.forward; Quaternion tr = Quaternion.LookRotation(targetDir); Quaternion targetRotation = Quaternion.Slerp(transform.rotation, tr, delta * moveAmount * rotateSpeed); transform.rotation = targetRotation; anim.SetBool("lockon", lockOn); if (lockOn == false) HandleMovementAnimations(); else HandleLockOnAnimations(moveDir); } public void DetectAction() { if (canMove == false) return; if (rb == false && rt == false && lt == false && lb == false) return; string targetAnim = null; if (rb) targetAnim = "Sword And Shield Attack"; if (rt) targetAnim = "Stable Sword Outward Slash"; if (lb) targetAnim = "Standing Melee Attack Horizontal"; if (lt) targetAnim = "Sword And Shield Slash (1)"; if (string.IsNullOrEmpty(targetAnim)) return; canMove = false; inAction = true; anim.CrossFade(targetAnim,0.2f); //rigid.velocity = Vector3.zero; } public void Tick(float d) { delta = d; onGround = OnGround(); anim.SetBool("onGround", onGround); } void HandleMovementAnimations() { anim.SetBool("run", run); anim.SetFloat("Vertical", moveAmount ,0.4f,delta); } void HandleLockOnAnimations(Vector3 moveDir) { Vector3 relativeDir = transform.InverseTransformDirection(moveDir); float h = relativeDir.x; float v = relativeDir.z; anim.SetFloat("Vertical", v, 0.2f, delta); anim.SetFloat("Horizontal", h, 0.2f, delta); } public bool OnGround() { bool r = false; Vector3 origin = transform.position + (Vector3.up * toGround); Vector3 dir = -Vector3.up; float dis = toGround + 0.3f; RaycastHit hit; if(Physics.Raycast(origin,dir,out hit,dis)) { r = true; Vector3 targetPosition = hit.point; transform.position = targetPosition; } return r; } } } I've been stuck on this for too long, any help will be highly appreciated
    • By GameDev.net
      Note: This article was originally posted to GameDev.net in 2003, and although the "shareware" terminology is now dated, the advice remains relevant and meaningful.
       
      Why is it that some shareware developers seem to be hugely successful in financial terms, growing their sales from scratch to generate tens of thousands of dollars in income, while the vast majority struggle to generate even a handful of sales? The answer can be found by exploring the difference in mindsets between both groups. For convenience, we'll label them as the professional and the amateur.
      First, let's examine the...
       
      Product Development Cycle
      Amateur
      Get inspired by an idea for a product. Create the product, regardless of whether there's a market for it. Release the product. Promote the product sporadically until bored with marketing. Note dismal results. Ask disempowering questions like, "Why do my sales suck?" Sulk for a while. Network mostly with others who are also getting dismal results, taking comfort in the fact that you aren't alone. Make a few sporadic changes to product or web site (maybe). Abandon the product (aside from continuing to process orders and handle support), and move on to the next product with step 1. Professional
      Do basic market research to determine the best opportunities for new products. Design a product that inspires you and that can exploit the market opportunities you identified. Create the product along with the system for selling the product and the marketing plan. Release the product. Promote the product systematically according to the marketing plan. Measure results and gather feedback. Study and learn from the top industry performers (companies and products). Ask empowering questions like, "How can I increase sales by 20% or more?" Update the product, the sales system, and the marketing plan based on lessons learned. Repeat from step 5.  
      After the first pass through this cycle, the initial results for the amateur and the professional may be virtually identical. But whereas the amateur typically stops after the first pass, the professional understands that this is just the beginning. Let's say they each release products that initially generate $100 per month in sales. The amateur will often conclude that the product is a failure, perhaps make a few minor revisions that don't help much, and then move onto the next product. But the professional says, "How can I get to $200 per month?" By iterating through this cycle of refinement and re-release many times (often more than ten times over a period of several years), the professional may ultimately end up with a hit that generates thousands of dollars in monthly income. To the amateur that initial $100 per month is seen as a flop. To the professional, however, it is seen as a seed. The professional understands that the initial launch is only the first step in a long stream of future updates and refinements, not just to the product but also to the sales system and the marketing plan. Here's why this works:
      In order to make a single shareware sale, there are an enormous number of factors that must all come together synergistically. The chance of getting all these factors correct on the initial release is slim to none. Let's say there are only ten critical factors in making a shareware sale (the quality of the product, the market demand for the product, the effectiveness of your registration incentives, the effectiveness of your ordering system, the file size of your shareware demo, and so on). And let's say that for each factor there is a range of effectiveness from 0% to 100%. Understand this: these factors don't add -- they multiply! If all of your critical factors are at 100%, but just one is at 0%, that means you could be getting zero sales, even though you did most things perfectly. For instance, you could have a truly brilliant product, but if people don't feel secure using your order form, that single flaw could cost you most of your potential sales.
      What if each of these 10 factors was at 60% effectiveness? Do you realize that this means you're only getting 0.610 = 0.6% of the sales you could be getting? Even if each factor is at 90% effectiveness, that's still only 35% of optimal. Obviously, this model is oversimplified. My goal is to dispel the prevailing myth that if each part of your ordering pathway is "good but not great," that your final sales will be good too -- the reality is that lots of good factors multiply together to create "utterly dismal." Here's the formula: (Good but not great)N = Utterly dismal (for a sufficiently large N). If everything about your product is just good (say 60% of optimal), this doesn't mean you'll be getting 60% of the potential sales. It means you're more likely getting less than 1% of the sales you could be getting. Refining the critical success factors and making each part of your product, your sales system, and your marketing just a little bit better with each consecutive release is how you grow your sales massively over time. It isn't out of the question that you can double or triple your sales in a day by doing this. See this article for some ideas on that.
      Now the truth of the matter is that most initial releases are nowhere near averaging 60% effectiveness for all critical success factors. Especially for first-time developers, there are probably many factors that are at 10% or less. The headline on your product web page, for instance, may be nonexistent or poorly written. Your product may have bugs or compatibility problems that prevent many people from running it. Your web site may look unprofessional and scare potential customers away. You may not have even scratched the surface of all the marketing you should be doing. Perhaps you only have one product and aren't experiencing the benefits of cross-selling other products. It's entirely possible that when all these factors come together, you may be generating something like 0.01% of the potential results that your product is capable of if you continued to nurture its development.
      Selling software through shareware channels is very different than selling software at retail. With try-before-you-buy, there are a huge number of steps each potential customer can go through before buying, any one of which can kill the sale. Just one suboptimal factor can cost you most of your potential sales, and when combined, multiple suboptimal factors may be tossing out potential customers left and right. Picture a ball rolling down a pipe with ten holes. If the ball passes all the way through the pipe without falling through any holes, you make a sale. But if the ball falls through even one of those ten holes, the sale is lost. The way you get your product from dismal sales to outstanding sales is by systematically identifying and plugging those holes.
      Having been in this industry for many years, I've seen this cycle repeat itself again and again. You would be absolutely amazed at how many of the greatest shareware hits experienced dismal sales after their initial release... sometimes even no sales at all in the entire first year. But the developers turned them into hits by continuously improving those critical success factors over a period of years.
      So which is the better approach? To release five products in five years, each at 0.01% effectiveness, or to raise a single product from 0.01% to 2%? If 0.01% makes you an average of $100 per month, the first scenario will get you to $500 per month, and this is exactly what amateur developers do. But the second scenario will get you to $20,000 per month with just one product, and it requires less work too.
      There are three good reasons why experienced professional shareware developers are often able to release more consistent hits than less experienced amateurs. First, the pros have already plugged many of the holes in their system that are shared by all products, such as optimizing their web sites to sell, refining the ordering process, implementing a money-back guarantee, crafting a solid marketing plan, gaining excellent search engine placement, etc. So when a new product is released, it inherits the benefits of prior system-wide optimization work. Secondly, the pros can apply the wisdom gained from refining each previous product to any new release, so when they release a new product, they've already eliminated all the obvious sale-killers that still plague amateur developers. And thirdly, the pros have already internalized the attitude that the first release is just the beginning; thus, they expect to continue to refine the product and immediately start listening to user feedback to help them locate new holes that need to be plugged.
      It is rare in the extreme that a developer's initial release will be anywhere near its full potential, even if the developer has vast experience. If you release a new shareware product, I guarantee it's going to be riddled with flaws, and it's probably earning less than 1% of its potential. If you raise each of ten critical success factors by just 5%, you'll increase your sales by 60%. And if you do this over and over again, you'll see your monthly sales gradually climb: $100... $160... $250... $400... $650... $1000... $1700... $2700... $4300... $6900... $11,000... $18,000... and so on. Note that you don't even reach $1000 per month until the 5th iteration!!!
      In order to improve these critical success factors, you have to confront the brutal, objective facts. Invite others to evaluate your product, your web site, and your ordering system. This requires putting your ego aside and being as open-minded as possible. Find out how others are marketing their products. Listen to what others have to say; don't delude yourself by trying to persuade them you're right and they're wrong. Don't worry about trying to make everything perfect all at once. But see if you can increase several critical success factors by a small amount with each successive release. For instance, you might try to make your product page just 20% more effective, your registration incentives 10% more enticing, your product interface 30% more intuitive, and so on.
      As a personal example, shortly after I released Dweep in mid-1999, I began getting requests for an expansion pack of more levels. So I released an expansion pack. Players also complained that Dweep moved too slow and needed a speed control. So I added a speed control. Then players wanted another expansion pack, so I released that. Then players wanted a level editor, so I added that. Then players wanted to be able to post their own levels, so I added a free levels archive. That turned out to be too much work to maintain, so I eventually took it down and replaced it with a forum where players can post their own levels, which has been working out wonderfully. During this time I also made major revisions to the web site, the marketing process, the ordering system, cross-promotions with others games, and the price (raising it from $9.95 to $24.95 while increasing the number of levels from 30 to 152). Most of Dweep's sales were a result of these later refinements, not the initial release.
      The amateur mindset leaves most of the potential rewards forever untapped, wallowing below 1% of the true potential. But professionals keep going... treating that shareware product as a tree that must be patiently watered before it bears a full harvest of fruit. I suppose you could say that the amateur sees the glass as 99.99% empty, while the professional sees it at 0.01% full.
      Now let's explore the differences between shareware amateurs and professionals in terms of...
       
      Personal Development
      Amateur
      Myopically focus personal development efforts on the areas you enjoy most (such as design or programming) as opposed to the areas where improvement would yield the greatest results (such as marketing or self-discipline). Gain knowledge sporadically through just one or two primary sources (i.e. reading books and articles, but not live seminars or audio programs). Apply your new knowledge to make your strengths even stronger (i.e. product development), while falling further behind in your weakest areas (i.e. marketing and sales). Guard the best of what you've learned as a treasured secret. Maintain a competitive scarcity mentality. Repeat from step 1.  
      Professional
      Take personal inventory of strengths as well as weaknesses that specifically detract from those strengths (ex. poor goal-setting habits result in unfocused marketing plan). Identify key knowledge/skills that must be mastered (marketing, selling, programming, etc) as well as key character traits that need improvement (organization, self-discipline, focus, motivation, etc). Identify multiple sources where above knowledge/skills/traits can be improved (mentors, business associates, books to read, organizations to join, conferences/seminars to attend). Take action by diving into these sources. Read the books, join and become active in the organizations, attend the conferences/seminars, and learn from the key individuals. Patiently apply the new knowledge to your business and life, realizing that even small gains will compound exponentially as you continue running this cycle year after year. Pass on your new wisdom to others by sharing advice, writing, volunteering, mentoring others, etc. Maintain a noncompetitive abundance mentality. Repeat from step 1.  
      The amateur sees personal development in narrow, monodimensional terms -- i.e. becoming a better developer. Efforts are focused on acquiring more knowledge within this limited field. A shareware amateur's bookshelf will be dominated by books within a narrow field, such as software development, virtually ignoring other crucial parts of the business like marketing and sales.
      By contrast, the professional takes a holistic approach. The professional understands that all areas of one's life are intertwined and that a weakness in one area (such as financial management) can detract from strengths in other areas (such as programming). The professional's bookshelf will likely be filled with a varied mix of books on topics such as business, marketing, sales, finance, technology, psychology, philosophy, health, and relationships. The professional keeps an open mind to acquiring knowledge through a variety of media, perhaps reading a book on software development, having a discussion with peers about marketing, listening to an audio program on time management, and attending a seminar on sales techniques. The professional seeks to advance on multiple fronts, understanding that a 10% improvement in five different areas will yield better results than a 50% improvement in just one.
      The amateur guards knowledge as a scarce resource... a competitive edge. Thus, the amateur rarely becomes known in professional circles, thus missing out on scores of lucrative opportunities that professionals frequently share with each other. This attitude constricts the flow of new knowledge back to the amateur, and the result is that the amateur is cut-off and isolated from the "inner circle" of the highly successful within his/her industry. Few bother to help the amateur directly because the amateur has never done anything for them and is relatively unknown. The amateur is stuck in a downward spiral of scarcity where growing the business feels like climbing a mountain.
      Conversely, the professional understands the importance of information flow and that passing on knowledge to others only deepens his/her own understanding. This sharing of knowledge plants seeds of abundance that benefit the professional for years to come. By giving openly and generously, the professional develops a positive reputation that attracts other professionals. An abundance of new opportunities flow to the professional through this network, seemingly without effort. This creates an upward spiral where the professional is able to leverage this network to grow his/her business with relative ease.
      Finally, let's dive into the...
       
      Psychological Factors
      Amateur
      Nonexistent or foggy goals ("Make more money") Sporadic motivation coming from irregular outside influences (inspiring book/movie, great conversation, flash of insight, etc) Focus on making money and getting customers to buy Seeks to blame poor results on outside factors (poor economy, competition, lack of luck, unfairness, shortfallings of shareware model, etc) Expends effort on the most enjoyable actions Scarcity mentality based on zero-sum thinking ("I'm not going to give anything away unless I get something in return") Short-range time perspective used in planning, often limited to the timeline of a single product cycle Sees problems as obstacles Persistent self-doubt ("Success is elusive") Unbalanced approach improving major strengths while letting other areas slide Believes that success comes from doing (work), then having (results), then being (successful) "Once I achieve this (foggy) goal, then I'll be successful" Weak commitment ("I'll try this and see what happens") Avoids facing brutal facts, stays within comfort zone ("I don't enjoy/understand marketing, so I'll just keep programming for now") Believes that risk-taking and luck are necessary for big breakthroughs ("Releasing a new product is like betting on a spin of the roulette wheel") Success stories from others increase feelings of anxiety, inadequacy, or resentment Associates most frequently with other amateurs who are equally confused, having less frequent contact with professionals (group griping and pity parties outweigh true learning experiences) Negative attitude rips many new ideas to shreds before they pass the incubation stage Negative associations to building business (customers are headaches, too many responsibilities, being overextended, burning out, a risky gamble, can't make money and do what I love)  
      Professional
      Crystal-clear goals, committed to writing ("Increase sales by 20% within 3 months") Deliberate cultivation of burning desire Focus on filling customer needs and providing value Accepts responsibility for poor results, seeks to understand causes and learn from them (registration incentives need improvement, product descriptions need rewriting, etc) Seeks to understand causes of poor results and learn from them Expends efforts on the most important actions (in terms of achieving goals) and finds ways to enjoy the process Abundance mentality based on law of sowing and reaping ("Givers get") Long-range time perspective used in planning, often thinking 5+ years ahead Sees problems as opportunities Persistent confidence and faith ("Success is inevitable") Balanced approach to improving multiple weak areas that detract from strengths Understands that success comes from first being (sucessful in one's thoughts), then doing (actions consistent with those thoughts), then having (results consistent with those actions) "Once I believe I'm successful, the external results will naturally follow" Strong commitment ("I will find a way or make one") Confronts brutal facts head-on ("Marketing is crucial to my business, so I must become a master marketer") Avoids unnecessary risks and bets on opportunities with the strongest chance of success while seeking to minimize the potential downside ("Releasing a new product isn't a gamble; I'll just keep refining it over time until it ultimately becomes a hit") Success stories from others are mined for new ideas and insights Networks with focused and successful professionals, learning by osmosis Associates most frequently with other focused and successful professionals, less frequent contact with amateurs (continuous flow of knowledge and ideas) Positive attitude lets new ideas incubate in imagination before putting them to the test in the real world Positive associations to building business (financial abundance, good life for family, early retirement, freedom, making people happy, fulfilling one's dreams, giving to charity, creating jobs) When results are weak, the amateur seeks security, comfort, and consolation. Amateurs want to know they aren't alone, so they find safety in numbers by holding group griping sessions in forums that attract other amateurs. Their inner insecurity makes it very hard for them to accept failure, so they're looking to put the blame elsewhere... on the failure of the shareware system, on the economy, etc. Amateurs look for validation of their position, seeking out "experts" who agree that success in their field is hopeless and that only the really lucky can succeed. When hearing of dismal sales from others, they feel more secure. Success stories are unnerving to the amateur, often making them feel anxious, envious, or resentful.
      The professional, on the other hand, is emotionally secure. The professional seeks understanding and knowledge. The professional accepts personal responsibility for his/her results and is always looking to improve. When the professional suffers a setback, s/he wants to understand the causes, assuming that the reason for failure was a lack of understanding or skill that led to mistakes. The professional will suffer failures at least as big as the amateur, if not bigger, but the professional will learn from each experience and move forward with an even stronger plan.
      You can't tell an early professional from an amateur purely by looking at a one-time snapshot of their results. The key differences are internal. Professionals and amateurs who start from scratch may begin on the same footing. After the first year their initial results may appear similar. But fast forward ten years.... Most likely the amateur will have given up and left the business or is still barely eeking out a living. Meanwhile the professional has become an established leader with a strong, sustainable income.
      So what is the essential difference between the shareware amateur and the shareware professional? It can be summarized in just one word: fear. The amateur feels vulnerable, believing that certain things might happen which s/he will be unable to handle. The amateur doesn't want to deal with products that aren't selling well, avoids facing his/her deepest inadequacies, and seeks to manage fear by clinging to the familiar and the comfortable. Instead of pursuing the greatest opportunities, the amateur pursues the safest and most comfortable paths. For instance, an amateur who feels more comfortable programming than marketing will heavily favor programming projects, whether or not that's what the business needs most. The amateur ties much of his/her sense of self-worth to external factors, and when those factors are threatened, the amateur feels a strong urge to return to the safety of the comfort zone.
      The professional, on the other hand, has internalized thoughts of security and abundance. The professional believes that no matter what happens, s/he'll be able to handle it. The professional doesn't cling to a comfort zone. When faced with change, s/he embraces it, seeks out the hidden opportunities, and charges boldly ahead. This isn't to say that professionals never feel fear; they do. The difference is that professionals turn and face their fears instead of shrinking from them.
      Amateurs will normally not be consciously aware of their fears. Such fears will be hidden behind rationalizations such as, "I simply don't like marketing," "I'm genetically disadvantaged when it comes to planning," or "I feel like a scam artist when I write sales copy." Thinking about such tasks and projects will typically make the amateur feel a sense of discomfort, anxiety, or even dread, but they often won't consciously know why. When confronted about these shortcomings, the amateur will often become emotional, sarcastic, and defensive. But whereas the amateur addresses this problem by getting defensive and shrinking back into the comfort zone, the professional lets go of his/her ego and strives to become consciously aware of his/her fears, driving them into the open where they readily dissolve. A professional says, "I probably feel uncomfortable marketing right now because of my lack of experience, but I know other people who happen to love marketing. I'll talk to them to see what they like about it, get some book recommendations, and within a few years, I'll be outstanding at marketing as well." Alternatively, a professional might hire or partner with someone else who has the skills s/he lacks, but the decision will be made out of awareness of this deficiency, not from fear and denial.
      These models of the amateur and the professional are abstractions of course. Between them lies a continuum where real people can be found. Hopefully you'll find the contrasts between these two poles helpful in continuing your own professional development.
       
      Steve Pavlina is the CEO and founder of Dexterity Software and writes and speaks on software and computer gaming industry topics regularly. This article is Copyright © 2002 by Steve Pavlina.
    • By Tomtheseadog
      Hey guys,
      I'm having a little trouble with my point light. My light is working but the light source moves when I move my camera. I've been trying all week to fix it but at my wits end. Maybe I haven't converted it to the proper space.
      **VERTEX SHADER**
      in vec3 positions;
      in vec2 texCoords;
      in vec3 normals;
      out vec2 pass_texCoords;
      out vec3 mvVertexNormal;
      out vec3 mvVertexPosition;
      uniform mat4 projectionMatrix;
      uniform mat4 modelViewMatrix;
      uniform mat4 normalMatrix;
      void main()
      {
      pass_texCoords = texCoords;
      vec4 mvPos = modelViewMatrix * vec4(positions, 1.0);
      mvVertexNormal = mat3(normalMatrix) * normals;
      mvVertexPosition = vec3(modelViewMatrix * vec4(positions, 1.0));
      gl_Position = projectionMatrix * mvPos;
      }
      **FRAGMENT SHADER**
      in vec2 pass_texCoords;
      in vec3 mvVertexPosition;
      in vec3 mvVertexNormal;
      out vec4 out_colour;
      struct Material
      {
          int hasNormalMap;
          int hasTexture;
          vec3 diffuse;
          vec3 ambient;
          vec3 specular;
          float reflectivity;
      };
      struct PointLight
      {
          vec3 position;
          vec3 colour;
          float intensity;
      };    
      uniform sampler2D our_texture;
      uniform Material material;
      uniform vec3 ambientLight;
      uniform float specularPower;
      uniform PointLight pointLight;
      uniform vec3 viewer_position;
      vec4 calculateLight(PointLight light, Material material, vec3 position, vec3 normal)
      {
      // AMBIENT
      vec3 ambient = ambientLight * light.colour;
      // DIFFUSE
      vec3 norm = normalize(normal);
      vec3 lightDir = normalize(light.position - position);
      float diff = max(dot(norm, lightDir), 0.0);
      vec3 diffuse = diff * light.colour;  
      // SPECULAR
      vec3 viewDir = normalize(viewer_position - position);
      vec3 reflectDir = reflect(-lightDir, norm);
      float spec = pow(max(dot(viewDir, reflectDir), 0.0), 32);
      vec3 specular = specularPower * spec * light.colour;
      vec3 result = (ambient + diffuse + specular);
      return vec4(result, 1.0);
      }
      void main()
      {
      vec4 lightResult = calculateLight(pointLight, material, mvVertexPosition, mvVertexNormal);
      out_colour = texture(our_texture, pass_texCoords) * lightResult;
      }
       
      The light source is coming from the cube in the red circle. Even the first picture the light isnt directly under the cube. If I don't move my camera and have the cube light source move around automatically the the light will stay with it. It's only if I move the camera that I get problems. The second picture i've moved my camera to the left and the light is moving with me and moving away from the cube light 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!