Jump to content
  • Advertisement
Sign in to follow this  
yosh-summer

OpenGL Mouse Control

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

Can somebody help me please. I don't know how to use the wm_message with the mouse. I have the problem when using it with the OpenGl Cordinates. I don't know how to change into the system of OpenGL from the Pixelsystem. What float value has the pixelcordinates as example 245, 318. PLease help me. thx Yosh

Share this post


Link to post
Share on other sites
Advertisement
This depends on what you are trying to acheive with the mouse :) If you are attempting to navigate around a 3d world i.e. rotate etc - you just need to rotate your model view matrix by the delta x/ y value of the mouse. If you are trying to select objects then you need to unproject the mouse coordinates (see gluUnproject and google "opengl selection").

Post back what you are trying to acheive and i'll try to help if I get time

Chris

Share this post


Link to post
Share on other sites
Ok i want to make a menue where i defrine a space with an picture in it. If my mouse cords are in this space which i defined something should happen. but i dont know how to compare the Opengl cords like 1.0f and the pixel cords 315 integer. please help me.

thx

yosh

Share this post


Link to post
Share on other sites
Quote:
yosh-summer
Opengl cords like 1.0f and the pixel cords 315 integer.


It depends on how you set up you projection matrix. Please post more details.

Share this post


Link to post
Share on other sites
Hi yosh,

I'm not sure if this is exactly the right way, but I have worked out this methodology to catch mouse movement, the coordinates, and convert the current 2D Windows mouse position to OpenGL 2D screen coordinates:


// Convert screen coordinates to OpenGL coordinates
void ConvertMousePos(MouseState &mouseState)
{
GLint viewport[4];
GLdouble mvmatrix[16], projmatrix[16];
GLint realy; // OpenGL y coordinate position
GLdouble glx,gly,glz;

// obtain viewport, modelview, and projection matrix
glGetIntegerv(GL_VIEWPORT, viewport);
glGetDoublev(GL_MODELVIEW_MATRIX, mvmatrix);
glGetDoublev(GL_PROJECTION_MATRIX, projmatrix);
// calculate OpenGL Y position from height of window (viewport[3] is window height in pixels)
realy = (viewport[3] - (GLint) mouseState.y) - 1;
gluUnProject((GLdouble)mouseState.x, (GLdouble)realy, (GLdouble)mouseState.z, mvmatrix, projmatrix, viewport, &glx, &gly, &glz);
mouseState.glx = (GLint)glx; mouseState.gly = (GLint)gly; mouseState.glz = (GLint)glz;
}






As nefhty says, the viewport orientation determines the realy calculation. Windows has (0,0) top left, whereas I have my OpenGL viewport with (0,0) lower left. This requires me to subtract the OpenGL viewport height (viewport[3]) and subtract the current windows Y location. Draw it on paper and you will get it :-)

I also use a generic struct for storing my mouse state:

// structure for holding current state of the mouse
struct MouseState
{
int leftButDown; // left mouse button control
int rightButDown; // right mouse button control
int middleButDown; // middle mouse button control
int leftButDblClick; // left mouse button double click control
int rightButDblClick; // right mouse button double click control
int middleButDblClick; // middle mouse button double click control
int x; // mouse position on screen
int y;
int z;
int lastx; // previous mouse position on screen
int lasty;
int lastz;
GLint glx; // OpenGL position in world space
GLint gly;
GLint glz;
GLint lastglx; // Previous OpenGL position in world space
GLint lastgly;
GLint lastglz;
int deltax; // Change in position from last to current
int deltay;
int deltaz;
int deltaglx; // Change in position from last to current in world space
int deltagly;
int deltaglz;

// constructor for mouse state
MouseState()
{
// initialise member variables
leftButDown = 0; rightButDown = 0; middleButDown = 0;
x = 0; y = 0; z = 0; glz = 0; gly = 0; glz = 0;
}
};



and in my WndProc routine I capture the mouse movement messages like this:


static POINT mousePos; // Store mouse coordinates

// detect mouse messages
case WM_LBUTTONDBLCLK: // Left button double click
{
SetCapture(hWnd);
mouseState.leftButDblClick = true;
// not interested in processing leftButton event for double click
mouseState.leftButDown = false;
return 0;
}
case WM_RBUTTONDBLCLK: // Right button double click
{
SetCapture(hWnd);
mouseState.rightButDblClick = true;
// not interested in processing leftButton event for double click
mouseState.rightButDown = false;
return 0;
}
case WM_LBUTTONDOWN: // Left button down
{
SetCapture(hWnd);
mouseState.leftButDown = true;
return 0;
}
case WM_RBUTTONDOWN: // Right button double click
{
SetCapture(hWnd);
mouseState.rightButDown = true;
return 0;
}
case WM_MBUTTONDOWN: // Middle button double click
{
SetCapture(hWnd);
mouseState.middleButDown = true;
return 0;
}
case WM_LBUTTONUP: // Left button released
{
mouseState.leftButDown = false;
mouseState.leftButDblClick = false;
ReleaseCapture();
return 0;
}
case WM_RBUTTONUP: // Right button released
{
mouseState.rightButDown = false;
mouseState.rightButDblClick = false;
ReleaseCapture();
return 0;
}
case WM_MBUTTONUP: // Middle button released
{
mouseState.middleButDown = false;
ReleaseCapture();
return 0;
}
case WM_MOUSEMOVE: // Mouse movement
{
// preserve mouse position before new query
mouseState.lastx = mouseState.x; mouseState.lastglx = mouseState.glx;
mouseState.lasty = mouseState.y; mouseState.lastgly = mouseState.gly;
mouseState.lastz = mouseState.z; mouseState.lastglz = mouseState.glz;
// query mouse position and state
GetCursorPos(&mousePos);
ScreenToClient(hWnd, &mousePos);
mouseState.x = mousePos.x;
mouseState.y = mousePos.y;
// get OpenGL coords from current Windows mouse position
ConvertMousePos(mouseState);
// update delta
mouseState.deltax = mouseState.lastx - mouseState.x; mouseState.deltaglx = mouseState.lastglx - mouseState.glx;
mouseState.deltay = mouseState.lasty - mouseState.y; mouseState.deltagly = mouseState.lastgly - mouseState.gly;
mouseState.deltaz = mouseState.lastz - mouseState.z; mouseState.deltaglz = mouseState.lastglz - mouseState.glz;
}





hth
F451

Share this post


Link to post
Share on other sites
Hi, i am having problems to understand the opengl coordinates, i am programing a billiard, and i would like to move the stick aoroud the cue ball.

I have already the equations to do that, but i don't get the rigth coordinates:

glGetDoublev(GL_MODELVIEW_MATRIX, modelMatrix);
glGetDoublev(GL_PROJECTION_MATRIX, projMatrix);
glGetIntegerv(GL_VIEWPORT, viewport);

gluUnProject((float)point.x, (float)point.y, 0.0,
modelMatrix, projMatrix, viewport,
&objx, &objy, &objz);

gluUnProject((float)point.x, (float)point.y, 1,
modelMatrix, projMatrix, viewport,
&objx2, &objy2, &objz2);

If i debug just that, in obj2, or obj1 i get strange results.
What's wrong? And there is not another way to rotate the cuestick without
using gluUnProject with opengl?

Thank you very much

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!