I've been working on a big game project for a while now and I've found a bunch of "hacks" that I did a while ago just to make things work. One of the biggest of these has been the conversion between co-ordinate systems. As far as I know I should be able to grab positions from my physics engine (bullet) and use those to render things (in OpenGL) In practice I found that I inverted a bunch of axes when moving things between graphics and physics, this is bad because I don't always do the same conversion each time but somehow it works which leads me to believe that somehow I'm interpreting the positions wrong when I render them. I set up my matrices using GLM like so:
ProjectionMatrix = glm::perspective(60.0f, ratio, viewNear, viewFar);
viewMatrix = glm::lookAt(glm::vec3(0.0, 0.0, 0.0), glm::vec3(0.0, 0.0, -1.0), glm::vec3(0.0, 1.0, 0.0));
When I render something I first set the view like so:
inline void reApplyTransform(vec viewer, float yaw, float pitch)
{
modelMatrix = glm::mat4(1.0f);
modelMatrix = glm::rotate(modelMatrix, pitch, glm::vec3(1.0, 0.0, 0.0));
modelMatrix = glm::rotate(modelMatrix, yaw, glm::vec3(0.0, 1.0, 0.0));
glm::translate(modelMatrix, glm::vec3(viewer.x, viewer.y, viewer.z));
}
When I render my landscape there's no problem but my landscape is always at (0.0, 0.0, 0.0). When I render an object that moves I need to then multiply the matrix by one that I grabbed from my physics engine like so:
btTransform trans;
body->getMotionState()->getWorldTransform(trans);
btQuaternion rot = trans.getRotation();
rot.setX(-rot.getX()); //mirror the x-rotation axis so it shows up right when we render it
rot.setZ(-rot.getZ()); //mirror the z-rotation axis so it shows up right when we render it
pos.x = -trans.getOrigin().getX();
pos.y = trans.getOrigin().getY();
pos.z = -trans.getOrigin().getZ();
trans.setRotation(rot);
trans.getOpenGLMatrix(matrix);
matrix[14] = -matrix[14]; //mirror the z-translation axis so it shows up right when we render it
matrix[12] = -matrix[12]; //mirror the x-translation axis so it shows up right when we render it
reApplyTransform(vec(player->renderPos.x, player->renderPos.y, player->renderPos.z), cameraYaw, cameraPitch);
modelMatrix *= glm::make_mat4(matrix);
The problem here is that in order to make the movable objects show up properly I need to invert the x and z axis. But when I convert the player's (camera) position I need to Invert the y-axis and nothing else:
void Playerchar::updateTransform()
{
btVector3 Ppos = charCon->getPosition();
//update the player's rendering position
renderPos.x = Ppos.getX();
renderPos.y = -Ppos.getY();
renderPos.z = Ppos.getZ();
}
The obvious question troubling me is whats up with that, why do I even need to convert? I must have done the transforms part wrong but I did that two years ago. Anybody see anything obvious that they want to point out?