Jump to content

  • Log In with Google      Sign In   
  • Create Account

#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