Ten Things to Achieve When Starting 3D Programming

Introduction

Starting 3D programming is not an easy task to accomplish. There are a lot of new things that come into play, and they vary from choosing a programming language to selecting the correct 3D modeling software.

These are the things that when they are done, no matter in what language and with what rendering engine, you can consider yourself a semi-expert on this matter.

Build your own custom graphic initialization function

Today with the great variety of 3D engines and platforms, this task is always delegated to those. I still remember the times when you had to initialize openGL with all the windows functions, and how you had to manage windows handles and resource loading yourself. This is useful to understand how things are managed internally and will give you more comprehension of what you are doing. My advice is to start looking at NEHE tutorials, it has a graphic initialization function written in C and with windows APIs in chapter one. If this is a lot for you to handle, you should look at C++ equivalent functions or try to port them to managed languages like C#, Java or Python. There are plenty of examples on the internet.

Implement your own camera

You can copy and paste a camera code from the internet, and use it without major problems, but it is not until you make your own camera from scratch that you will fully understand some concepts like vector handling, translation matrices, angle conversion, etc. You should start by coding a FPS (First Person Shooter) camera; it has everything it needs to get you ready. Later if you want to make your own game and you can’t use it, I recommend you to read this article to find out the type of camera that best suits your needs.

Understand primary 3D concepts

When I started, I began to hear a lot of new words like, anti-aliasing, anisotropic filtering, occlusion testing, z-buffer, alpha testing, shader language, bump mapping, etc. Maybe if you are a gamer, you have seen some of them while configuring the graphic settings of your game. Make sure you spent some time reading about this, because it will give an overview of what 3D programming is.

Learn everything you can about vectors and matrices

This is always underestimated, I strongly recommend that in order to correctly manage things like cameras, terrain following, ray tracing; you should know everything about this. You should also learn minimum trigonometry basis. Now I understand how easy my life would have been if I would had spent only a few hours studying this matter.

Code yourself a 3D model loader

I recommend to begin with a .OBJ file or a .STL file because they have an ASCII format representation. Later, you can move to other more complex formats like .3DS. With this, you not only will understand more how 3D models are saved, you will have to draw it in its raw manner: triangles, and then you will understand how everything is drawn in a graphics engine.

Successfully make your own collision algorithm

It is one thing to draw a world and another thing to manage its geometry. In a 3D world, there are no physics laws, you have to create them. If you want an object not to go through a wall, then you have to create an internal geometric representation of the wall and make all the calculations yourself. There are several approaches to handle collisions; I recommend starting with binary collisions with a labyrinth project. Try this link for more information.

Implement a small particle engine

I was disappointed when I found out that fire, smoke, some lighting and other stunning effects that you see in 3D games are made by particles and that particles are in essence planes with textures facing the camera. The more particles you add, the more realistic the effect looks but the performance is more compromised. The first particle engine I made was a rocket smoke and I did it without looking at a particle engine tutorial. Later I realized I had reinvented the wheel but I was really into this. By carrying out this, you will understand concepts like particle emitters, particle behavior and bill boarding techniques, among others.

Learn the basics in a 3D modeling software

In order to make changes to the 3D models you want to use in your application, you should at least know operations like translating, scaling, rotating, texturing, exporting to other formats and making simple models. If you don’t do that, you will suffer from depending on other people to do your first game. I’ve worked with a few modeling software and I strongly recommend 3D Max or Maya.

Load and play an animation

Loading and correctly playing an animation was the most difficult thing in 3D that I've ever did. I had to do reverse engineering to a 3D max .XAF file. I had to also learn stuff like bone hierarchy, matrix interpolation, among others. At the end, it was very gratifying to look at your own models to move by themselves. I recommend starting animating a robot since models like animals and people require another technique called skinning.

Code a 2D custom Graphic User Interface (GUI)

When I began programming in XNA; I was forced to build my own GUI because XNA does not have implemented any windows controls. This gave me two things, the first one was the ability to make my custom GUI controls and the other one was the understanding of concepts like event handling and event capturing. It is not easy, the most difficult control I have made is a listbox, but once it is made you can use it everywhere.

I am sure when you manage to achieve these ten things, you can say you have the basic knowledge of 3D programming. I wrote this because I spent a lot of work to achieve them and because I would like everyone to have a small guideline when starting in this world. My advice is to start making a small game and to try to adapt them on the go. I think this is the best way because trying to learn all this without the possibility to see it in action is not very motivating. If you liked this small article, you can visit my blog for more stuff like this.

Share

About the Author

Born on 86, had my first computer at the age of 8, wrote my first code at the age of 15(pascal), began to study software engineering at 2005 and graduated in 2010. Now I am currently developing software for ERP systems in "Michell Consulting, LLC" . I have a dev blog www.vasilydev.blogspot.com. My real passion is 3D game programming and playing guitar. I've programmed stuff in C#, python, Delphi, PHP, C++, JS, QT and others...

Comments and Discussions

Nice article but what I think is you should have done this article little elaborately by adding references to each point. For example, in the point "Implement your own camera", you should have added some links to web pages related to the point. That may be helpful.

Then next thing I feel is you have mentioned the "reader" is just starting 3D programming(title). Why the "reader" has to do many of these steps when he/she is just starting 3D programming. That is not a correct method. Take for an example, why the beginner has to code a model loader while he/she can use easier alternatives such as Irrlicht or OGRE3D which has a built-in model loader. The "reader" is not a large game development company to create a custom game engine. If the beginner want really a large game engine use Unreal Engine or CryEngine. Why the "reader" should code a animation loader when it is a built-in feature in Irrlicht or OGRE3D. "Don't reinvent the wheel". All the points are useful but some points are not for a beginner.

Nice critic I also think I could have done better. I just today I was trying to write the second part. About a model loader I have to disagree I coded myself a simple OBJ loader in one night just by looking at the file structure, very simple also STL files are very simple. Also I have to recognize that other file formats are nearly impossible to code by a single person, 3DS file for example. I think it was fun at least by me to “reinvent” the wheel, it gave me a perspective I could not ever have if I just used it.
Best regards

1) Since you've mentioned XNA, you might want to mention that XNA already has support for mesh animation throught the .obj importer. It's a good place to start, and you can probably do so for free using Blender. Personally, I feel XNA is cheating a little bit-- I'm trying to wean myself off it.

2) Skinned animation is, to me, the holy grail of all 3D programming. It absolutely needs to be on your list IMO.

Other than that, as a newish 3D programmer, I think you've laid out a pretty good list of steps to follow. I would have liked very much to have a list like this about three years ago. Good job.

I agree with you, skinned animation is the holy grail of 3D programming, but it is so difficult to do it by yourself that i didn't place that on my list. It is difficult even to understand a code that works. See yourself in the DX SDK a code that loads a .X file and see what i am talking about.

Just because of this issue, I've switched over to XNA and C#. It was still pretty hard for me, but I was able after a couple days' hair-pulling to get some skinned models from a couple different games, mod them in Maya, and import them with animations into my XNA program. This after about 3 years of beating my head against DirectX samples, like you mentioned.

FYI, I have reported this article as "wrong type". Hopefully the site admins can move it to a tip/trick. With no attached code, screenshots, or inline code and considering it is so short, this is much better suited to be a tip/trick rather than an article.

Martin Fowler wrote:

Any fool can write code that a computer can understand. Good programmers write code that humans can understand.

I see some people giving critics about how this article is lacking in content.
But it's really just a useful guidance to the people wanting to learn.

People might take 1-2 years to get through all the materials listed here, so expanding on the topics would be beyond the scope of this article. Using this as the basis for some more in depth tutorials which builds a complete engine would be cool though. After finishing it could the be bestselling game programming book on amazon, because no book really ties all the knots together.

I agree. I'm surprised that there isn't a complete DirectX / C++ walkthrough for building a basic animated 3D engine.

I'm not that great at any one step, but I can now follow the whole process from designing and texturing 3D models in Maya and Photoshop, animating them, and importing them into XNA for use in a game (using C#, not C++). I'm always afraid to make a "tutorial," though, because someone is going to come along and tell me I'm an amateur (which is true). Do you think it's worth putting it all together anyway?

If anyone is interested, let me know. I'll be happy to give it a shot.

I think 99% of people that are in 3D programming are amateurs. This is because 3d is a field that people that aren't informatics can see actually see what you are doing and so to manage 3D programming give you a reputation among others of your kind. If you want to give it a shot I gladly will lend you my blog to publish those tutorials

I never post. I'm posting on this occasion because I like and think the article has a lot of potential. It started great, and is very easy to read but would like to see some references to things like "Binary Collision".

I haven't done 3D programming in years, but this article got my attention going. Hopefully, this article can expand on more things. Perhaps it can turn into a series of articles.

Firstly, congratulations on putting up your first article. Posting an article is easy, posting a good article is the hard bit

Secondly, unfortunately, I don't know what to make of it really. I think it would be a bit of understatement to say it is a bit lacking as an article. To really give this article some life, you should have expanded on each of your ten topics, maybe give so reference material or examples of how to do it.......

Think it needs an overhaul to get it going......

Have you read the article FAQ[^]? You should maybe take this article offline until you beef it up a bit, or I think you will find it will be rated poorly by some of the others.