Jump to content
  • Advertisement
Sign in to follow this  
AbhijitNandy

OpenGL Finding the co-ordinates with respect to another object

This topic is 2703 days old which is more than the 365 day threshold we allow for new replies. Please post a new topic.

If you intended to correct an error in the post then please contact us.

Recommended Posts

I am trying to render a car using OpenGL. The car has a chassis and 4 wheels. The chassis is simply a cuboid and the wheels are cylinders. I have their positions from the Bullet physics engine as openGL matrices. If I pass these matrices to glMultMatrixf() in turn and push and pop matrices correctly then I do get the car rendered correctly as it moves around.


//Render Ground Plane-------------------------------
float PLANE_EXTENT = 100.0f;
glBegin(GL_QUADS);
glTexCoord2f(0.0f, 1.0f); glVertex3f(-PLANE_EXTENT, 0.0f, -PLANE_EXTENT); // Top Left Of The Texture and Quad
glTexCoord2f(0.0f, 0.0f); glVertex3f(-PLANE_EXTENT, 0.0f, PLANE_EXTENT); // Bottom Left Of The Texture and Quad
glTexCoord2f(1.0f, 0.0f); glVertex3f( PLANE_EXTENT, 0.0f, PLANE_EXTENT); // Bottom Right Of The Texture and Quad
glTexCoord2f(1.0f, 1.0f); glVertex3f( PLANE_EXTENT, 0.0f, -PLANE_EXTENT); // Top Right Of The Texture and Quad
glEnd();

glColor3f(1.0,0,0);
//Render Chassis-----------------------------------
glPushMatrix();
glMultMatrixf(ptrShapes->m);
glMultMatrixf(ptrShapes->childMat);
drawBox(ptrShapes->halfExtent[0], ptrShapes->halfExtent[1], ptrShapes->halfExtent[2]);
glPopMatrix();

//Render the obstructing green box
glColor3f(0.0,1.0,0.0);
glPushMatrix();
glMultMatrixf(ptrShapes->m_box);
drawBox(ptrShapes->box_halfExtent[0], ptrShapes->box_halfExtent[1], ptrShapes->box_halfExtent[2]);
printf("\n box : %f, %f,%f", ptrShapes->box_halfExtent[0], ptrShapes->box_halfExtent[1], ptrShapes->box_halfExtent[2]);
glPopMatrix();


//Render the 4 wheels
glColor3f(1.0,1.0,0);

for (int i=0; i<4; i++){
glPushMatrix();
switch(i){
case 0 : glMultMatrixf(ptrShapes->m1);break;
case 1 : glMultMatrixf(ptrShapes->m2);break;
case 2 : glMultMatrixf(ptrShapes->m3);break;
case 3 : glMultMatrixf(ptrShapes->m4);break;
}

drawCylinder(ptrShapes->radius, ptrShapes->halfHeight, ptrShapes->upAxis);
printf("\n r : %f ht:%f", ptrShapes->radius, ptrShapes->halfHeight);
glPopMatrix();
}


//---------------Debug code : for pink wheel-----------------------
glColor3f(1.0,0.0,1.0);
glPushMatrix();
glMultMatrixf(ptrShapes->m);
glTranslatef(ptrShapes->m2[12] - ptrShapes->m[12],
ptrShapes->m2[13] - ptrShapes->m[13],
ptrShapes->m2[14] - ptrShapes->m[14]);
drawCylinder(ptrShapes->radius, ptrShapes->halfHeight, ptrShapes->upAxis);
glPopMatrix();




Now I am trying something different. I am trying to render one of the wheels without using glMultMatrixf(). So given the transformation matrix I am trying to simply translate the wheel into position(not bothered about orienting it at the moment). The code marked as //----debug code----- in the bottom shows this part.

So what I have is the wheel transformation matrices in the matrices m1, m2, m3, m4. I chose one of the wheels(forward left wheel) whose matrix is in m2 and tried to use the translation elements of the matrix to translate the wheel into position. But it does not work as expected and there is a difference in the mesh positions between the wheel rendered through glMultMatrixf() and that rendered through glTranslatef(). I used the following to understand the opengl matrix format :

gl_anglestoaxes01.png

The reason I subtract ptrShapes->m[...] from the respective x,y,z positions is because I have already translated to the position given by it using glMultMatrixf(). The postion given by m is the global position of the vehicle. Here is a video of the thing :

http://www.youtube.c...h?v=0iATE7MVTkE


Also if I dont subtract m and directly render the wheel using m2 then I get the desired effect. Here is the code

//---------Debug code------------
glColor3f(1.0,0.0,1.0);
glPushMatrix();
glTranslatef(ptrShapes->m2[12] ,
ptrShapes->m2[13],
ptrShapes->m2[14] );
drawCylinder(ptrShapes->radius, ptrShapes->halfHeight, ptrShapes->upAxis);
glPopMatrix();



Video :

http://www.youtube.c...h?v=E0hyQjclx58

Now I cannot understand why the 2 don't match. If I have already translated to the proper vehicle position using m then if I render the wheel at the translated position with respect to the vehicle(by subtracting the translation elements of m from the translation elements of m2) I should get the same position. Obviously the rotations around the axes do not make a difference here as then I would not have got the right position by rendering at m2 directly.

I need to render the wheels using their positions with respect to the main vehicle(whose co-ordinates are in m) due to some restrictions in the API of the Orbiter Space flight simulation software in which I am trying to integrate the vehicle.

Long story short...I can only render the wheel with respect to the vehicle(whose world space coordinates are in m). So I need to get the correct co-ordinates fo the wheel with respect to the vehicle after I have been given the world space co-ordinates of both the wheel(in m2) and the vehicle(in m)

Share this post


Link to post
Share on other sites
Advertisement
if I render the wheel at the translated position with respect to the vehicle(by subtracting the translation elements of m from the translation elements of m2) I should get the same position[/quote]


glMultMatrixf(ptrShapes->m);
glTranslatef(ptrShapes->m2[12] - ptrShapes->m[12],
ptrShapes->m2[13] - ptrShapes->m[13],
ptrShapes->m2[14] - ptrShapes->m[14]);


The problem with your logic is that glTranslatef does not just translate objects around in the global coordinate axis, it translates them along the local coordinate axis. When your car's body rotates, its axis are no longer aligned with the global axis, so these no longer mean the same thing.

You're taking the world space position of m, the world space position of m2, and subtracting them to get the world space delta. However you're applying this delta in the car's local space, which then is rotated by the car's rotation matrix. So even if you really mean "translate the difference between the car and the wheel", what you're getting is "translate the difference between the car and the wheel, and rotate that by the car's rotation matrix". You'll notice that the two line up when the car is flat on the ground, but once you tip the car's local axis away from the global one (like when it climbs the hill), your intended translation isn't going the same way anymore, because its translating along the wrong axis.

Share this post


Link to post
Share on other sites
Sign in to follow this  

  • Advertisement
×

Important Information

By using GameDev.net, you agree to our community Guidelines, Terms of Use, and Privacy Policy.

We are the game development community.

Whether you are an indie, hobbyist, AAA developer, or just trying to learn, GameDev.net is the place for you to learn, share, and connect with the games industry. Learn more About Us or sign up!

Sign me up!