Nice job. I didn't build the project, but I read over what you have so far and took a look at some code.
This is all low-hanging fruit, but here are some comments.
Obviously having someone formally proofread and edit the tutorial would be good, but meanwhile I think you could probably clean up quite a few things with a careful pass over the text. Things I noticed were punctuation issues (missing periods and so on), spelling errors that spellcheck might not catch (e.g. bellow vs below), other possible spelling errors (I assume you have spellcheck available), your/you're errors, extra or misplaced words, and so on. I think with a careful pass you could probably fix a lot of the issues, leaving an easier task for other proofreaders (and having others proofread is definitely a good idea).
Regarding code formatting, it looks like you're using hard tabs rather than soft tabs (spaces). I'll refrain from offering an opinion on this as I know it's a contentious issue, but I'll just point out that using hard tabs can result in code displaying differently in different contexts. For example, in the setting in which I'm viewing the tutorial and code at the moment, the indentation seems excessive and makes the code a little hard to read. Again though, opinions differ on this, so I'm just making an observation here, not offering any sort of suggestion.
I looked at one source file pair, player.h/cpp. I realize C++-related best practices and idioms may not be your focus here, but given that people sometimes pick up habits from tutorials, it might be worth taking a look at some things.
With that in mind, here are some things I noticed. (Again, this is all low-hanging fruit - these are just standard things that often come up in the context of C++ code reviews.)
- You're using a preprocessor macro for the 'player depth' value, but in C++ it's typically preferred to use constants. There are various reasons for this (try searching for 'c++ const vs define' for more info).
- It's typical to pass arguments of non-primitive types (like glm::vec3) by constant reference to avoid unnecessary copying. In this context it probably doesn't really matter either way, but passing by constant reference is arguably more idiomatic.
- It looks like you're returning some values by non-constant reference (e.g. GetMoveSpeed()). I didn't look at the rest of the code to see how these functions are used, but I'm wondering what the purpose of the references is.
- In Render() you're using references, but they're non-constant. It would be atypical for a render function to modify matrices that are passed in, so I'm wondering if you meant for these to be constant. You have a similar non-constant reference in DoMove().
- You might also look into 'constant correctness' in C++ in general. Opinions differ on how broadly 'const' should be used, but it would certainly be idiomatic to use it more than you are currently.
- 'using namespace std;' in a source file isn't necessarily a problem, but it does dump a lot of stuff into (in this case) the global namespace. And, it looks like you're qualifying with std:: explicitly in some places anyway. Personally I'd drop the 'using' and just qualify explicitly.
- You might look into 'NULL' vs 'nullptr' in C++.
- Does 'Player' need an explicit non-default destructor?
- I don't think you need the '!m_projectileBalls.empty()' check.
I see some other minor things, but I'll stop there. Looks good - I hope this feedback will be helpful.