• Create Account

Banner advertising on our site currently available from just \$5!

### #Actualic0de

Posted 15 May 2013 - 05:49 PM

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?

### #4ic0de

Posted 15 May 2013 - 05:46 PM

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?

### #3ic0de

Posted 15 May 2013 - 03:49 PM

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?

### #2ic0de

Posted 15 May 2013 - 03:49 PM

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?

### #1ic0de

Posted 15 May 2013 - 03:48 PM

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?

PARTNERS