• Advertisement
Sign in to follow this  

Mouse picking and tile maps

This topic is 4671 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

Hi, I'm currently working on a new game which will be isometric turn based strategy. I'm looking around for some effective code to help me determine what tile has been clicked on. My tiles are the usual quad based type. I've had a look at gluUnProject but I'm not too sure of how to deal with the data that is returned. Does anyone have effective code I could look at or borrow..? Cheers

Share this post


Link to post
Share on other sites
Advertisement
Quote:

I've had a look at gluUnProject but I'm not too sure of how to deal with the data that is returned.


Could you elaborate a bit more on what you are having trouble with. Is it using gluUnProject or is it what to do with the object coordinates once you have them? If it is the former then this is an example of how to use gluUnProject to get some obect coordinates. It uses GLUT and gets the object coordinates on the near viewing plane of a mouse click.


void mouse(int button, int state, int x, int y)
{
if (button == GLUT_LEFT_BUTTON && state == GLUT_DOWN) {
GLdouble modelviewMatrix[16];
GLdouble projectionMatrix[16];
GLint viewport[4];
GLdouble objX, objY, objZ;

glGetDoublev(GL_MODELVIEW_MATRIX, modelviewMatrix);
glGetDoublev(GL_PROJECTION_MATRIX, projectionMatrix);
glGetIntegerv(GL_VIEWPORT, viewport);


gluUnProject((GLdouble) x, (GLdouble)y , 0.0, modelviewMatrix, projectionMatrix,
viewport, &objX, &objY, &objZ);

printf("Left click at windows coordinates: %i, %i\n", x, y);
printf("Object coordnates %lf, %lf, %lf\n", objX, objY, objZ);
}
}




If it is the latter then here are some pointers. Assuming that your game is a fully 3D tilebased game then one of the methods to find the clicked tile is as follows:

1. Find the object coordinates of the mouse click on the near plane (point A).
2. Find the object coordinates on the far plane (point B).
3. Use A and B to calculate a vector V.
4. Point A (or B) together with V constitute a line L.
5. For each tile T calculate where L intersects the plane that T lies upon. Call this point P
6. Test whether P is within T. If it is then T has been clicked on


  • This method assumes a level of generality that your tilemap may not have. There are simpler methods if you have a camera that cannot be rotated at all, if your tiles are all of one height or if you have no zoom facility.

  • This assumes that you have restricted the viewing options so that it is not possible for one tile to be hidden behind another. If you haven't then you need to find the closest tile (that intersects with L) to the camera.

    Share this post


    Link to post
    Share on other sites
    Cheers, that's very clear.

    Right now the camera cannot be rotated but you can change the angle of the map a certain amount (not so much so you can hide tiles though).

    I've read about grabbing the Z depth using glReadPixels which I'm thinking may help with determining tiles and other items.

    Thanks for the point about the lines and vectors, this seems like the best route to take for my project. :)

    Share this post


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

    • Advertisement