   3D Engines - Where to start?
  I'm a programmer who is currently in University, studying both Computer Science and Math. I have several years of experience programming in several languages (C, C++, Java, Scheme, etc.), and I enjoy math. At first, I thought I wanted to create games themselves - but I've come to realize my true interest (seems) to be in actually creating 3D game engines to handle 3D rendering, physics, and the like. It seems I am more interested in creating the 'toolkits' that one might use to create a game, or any sort of 3D virtual environment (even artwork) than games themselves. Whether or not I'll lean more towards the gaming aspect is yet to be decided.What I'm very lost about, is how I should start working toward the goal of working professionally in such a field. At the moment I plan to focus on the following topics in University:Linear AlgebraDiscrete MathOS Programming / CompilersHuman-Computer Interaction (rather vague.. but I'd say it sounds relevant)Graphics RenderingBasic PhysicsAII imagine to start, I should worry about doing all of the things a 3D game engine does.. but in 2D. My biggest problem is in coming up with practical projects (ie. ones I can actually finish on my own), and finding open source projects to join. Aside from that, I'm simply asking for any sort of guidelines, resources, or other suggestions anyone might have to help me reach (or even further realize) my goals. For example, any subjects to focus on beyond those I've included (and what their application is) would be appreciated. Thanks.   
  Perhaps you can focus on one area rather than all the functionality found in a complete engine. If you start your own project, you have the chance to start (and learn) from scratch. If you decide to join an existing project, you will be confronted with a code base already in place, programming rules and guidelines you have to adhere to and you'd be concentrating on the missing/incomplete/improvable parts of the library/engine. The choice is up to you, but perhaps it's a good idea to gain some knowledge and experience on your own before submersing yourself into an established project.Projects that may or may not need your help.Linear Algebra and Discrete MathThey're typically part of any project, but there are some general purpose math libraries out there.OS ProgrammingLinux and its various distros of course.Human-Computer InteractionI'm afraid I'm not sure what you're hinting at here.Graphics RenderingTake a look at open source rendering libraries, both 2D and 3D. Ogre for instance allows for plugins to be created, perhaps that's an opportunity to program something useful. They also have a fairly active community. You can also focus on image processing or 3D modeling applications like Blender and (the) Gimp.Basic PhysicsCheck out Newton, Bullet and ODE. They're all open source.AII'm not very knowledgeable when it comes to AI, so I'll leave that open. Perhaps you can check the AI forum on GameDev.Besides these, there's a wide range of projects that need some help in a particular area, say the networking part of a multiplayer game, the AI of a RTS, the physics in a FPS.   ;  So, making the engine that handles creation of the game, and the tools to create content is about 80% of what game programming is. The making the game part is up to the artists, game designer and the gameplay programmer to do. That said, as has been stated: making an entire engine is a tough prospect, not saying it can't be done but its pretty difficult. Try making small sample games (I'd advise not going 3D for your first game) to see what particular area you are interested in (AI, Graphics, Physics etc.) and see if you can get a team together of people willing to make a game. I am currently on a game team myself, and with 3 of us focusing on graphics, physics, and architecture it has taken almost a year to get the infastructure together for a real 3D game. If you are working alone, or even if you're not making a 2D game from scratch allows you to figure out a lot of small problems and difficulties involved in making a game engine, these difficulties get amplified ten fold when you move from 2D to 3D.As for what to study:Being a graphics programmer, for graphics focus heavily on math, especially linear algebra. Your graphics specific classes should bridge the gap, but the better you understand the transformations going on the better off you'll be.For physics, you need a decent amount of the same linear algebra stuff, but there's some additional problems in there due to the fact that you have to integrate on a machine which can only discretely evaluate equations. Take a numerical analysis class to get a better idea on how computers do calculus.For AI, I don't know too much about but I know some friends who do, fuzzy logic seems to be applicable, Probabilities are pretty good there, and there should be some CS AI classes you can take.As far as CS goes, learn everything you can. You need to know what is available for you to use, then your math training will tell you how to use it.   ;  Thanks for the quick replies. That definitely gives me some things to think about. Can anyone give any other suggestions for math courses? Being that a lot of the more advanced math courses introduce entirely new topics, I do not know if they have any applications in game programming. ie. I have no idea if "Differential Equations" would have any use.. Should my main focuses basically consist of Linear Algebra, basic Calculus (differentiation and integration of elementary functions), and Numerical Analysis? As far as computer science goes, I believe I already have a good idea of what to (and not to) bother with.Also, can anyone give me any opinions on the the education offered at http://gamedev.gameinstitute.com/? It appears to be very in-depth, and teach just the things I want to learn. In my case it would be a matter of finding the time to actually do it, as I am currently taking an online summer courses, in addition to working.. and after that comes a full course load from University. Thus, I'm thinking of perhaps trying the first 3D engine course next summer. It looks like it would take a lot of my university-acquired knowledge and sort of 'glue it together' into the realm of 3D engine programming. The only thing I don't like about the course is that it focuses on DX9, which makes me worry it's more a DX9 course than a more general course, though I'm sure I could apply much of the knowledge to any similar API.   ;  Any math will be useful in programming, for getting stuff to display on the screen however, linear algebra is a good place to start, I've seen plenty of calculus, (Even some partial differential equations stuff pop up, but that was in a fluid sim paper) statistics, really all fields of math pop up when I read whitepapers just within the field of graphics. It isn't mandatory that you know all of math inside and out, but in general the more you know the better you will be able to understand what is actually going on. That is the important part.   