Mouse Control

Started by
4 comments, last by zandarina 17 years, 11 months ago
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
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
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
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.
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 coordinatesvoid 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 mousestruct 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
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

This topic is closed to new replies.

Advertisement