Vector3D playerPos(x, y, z);// = mainPlayer->getObjectPosition();
std::cout << playerPos.x << " | " << playerPos.y << " | " << playerPos.z << std::endl;
Vector3D nPlayerPos = this->WorldToScreen(&playerPos);
std::cout << nPlayerPos.x << " | " << nPlayerPos.y << " | " << nPlayerPos.z << std::endl; // INVALID RESULT
This is an invalid result from WorldToScreen - and not the vector assignment itself - from what you're implying with this code. It could be the vector but from this context it appears to almost certainly be a problem in your function there. Especially with you explicitly passing a pointer to it (why?) I'm thinking you may doing some kind of illegal aliasing violation in that code.
Vector3D playerPos = mainPlayer->getObjectPosition(); // Doesn't do anything in release mode (playerPos remains as garbage)
Depending on a few things, this is probably going to invoke your copy constructor operator, not your copy assignment operator.
Vector3D& GameObject::getObjectPosition()
It's not common for get*() functions to return a non-const (lvalue) reference. Are you sure this is the behavior you want? It's not likely the cause of the bug, but depending on various overloads you have defined, it may be suspect. Prefer to return a value or a const reference and have a separate set*() function. It's common to think that a const reference is the safest choice, but check how well your compilers handle returning by value. Compilers are getting better at it and in some cases will handle return-by-value more efficiently than return-by-const-reference.
my Vector3D object
Why are you writing your own in the first place? Even on the AAA space I want to whack people who write their own (I do understand the draw - I've done it myself far more often than I should). These kinds of bugs just don't exist in well-tested third-party libraries. Plus, it's almost guaranteed that they'll be better optimized and more featureful. Math libraries are a commodity; don't write your own.
If in doubt,
http://glm.g-truc.net/0.9.5/index.html is a perfectly valid choice, even if using D3D. DirectXMath is also a good choice, even if using OpenGL. vectormath works (in Bullet) and many other 3D middlewares include their own.
I can't help but wonder now if the release mode is shifting my matrices around for some reason, I'm not sure tho, I don't think they would be nor how. I'll print those out to see if they are for some reason.
This is very possible depending on what kinds of tricks you're pulling in your matrices. I've seen a lot of "fancy" math code that abuses aliasing rules and can lead to all kinds of perfectly valid but unintended output after optimization.
I've been wondering if it has something to do with not having a operator=, except the default one given by the compiler, but I'm not sure.
Rule of Zero. You _want_ to use the compiler-generated copy/move constructors/operators (and default constructor and destructor) if at all possible, since they'll be correct more often (pretty much always) than your own (easily buggy due to subtle requirements on those constructors/operators).
There's absolutely no good reason to write a custom copy operator for something like a Vector3d. Maybe you can justify a default constructor if you want to ensure that Vectors are zero-initialized. In that case you should still strongly prefer prefer
NSDMI (non-static data member initializers) and a compiler-generated default constructor.