| Обсуждение «Координаты мыши GL» |

|
| Опубликовано 29.07.2009 10:41 (16 лет назад) # |
Как получить координаты мыши после glTranslatef( 0, 0, -0.1f );
void TransMouseCordsGL( GLdouble &GLX, GLdouble &GLY )
{
GLdouble Xb = MouseX, Yb; // = Y;
GLint viewport[4];
GLdouble modelview[16];
GLdouble projection[16];
glGetDoublev( GL_MODELVIEW_MATRIX, modelview );
glGetDoublev( GL_PROJECTION_MATRIX, projection );
glGetIntegerv( GL_VIEWPORT, viewport );
Yb = (float)viewport[3] - (float)MouseY;
gluUnProject( Xb, Yb, 0, modelview, projection, viewport, &GLX, &GLY, &modelview[0] );
}
работает ТОЛЬКО ДО glTranslatef
после выполнения Трансляции... координаты выдаються с погрешностью, плз дополните функцию так чтобы погрешности не было |
|
|
|
Администратор

|
| Опубликовано 29.07.2009 13:07 (16 лет назад) # |
| А где translate? |
|
|
|

|
| Опубликовано 30.07.2009 01:23 (16 лет назад) # |
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); // Clear Screen And Depth Buffer
glMatrixMode( GL_MODELVIEW );
glLoadIdentity();
glTranslatef( 0, 0, -4.1f );
TransMouseCordsGL( GLMouseCoordX, GLMouseCoordY ); //КОСЯК, КОСЯК, КОСЯК :)
glBegin( GL_LINES );
glColor3f( 1, 0, 0 );
glVertex2f( GLMouseCoordX - 0.01f, GLMouseCoordY - 0.01f);
glVertex2f( GLMouseCoordX + 0.01f, GLMouseCoordY + 0.01f);
glVertex2f( GLMouseCoordX - 0.01f, GLMouseCoordY + 0.01f);
glVertex2f( GLMouseCoordX + 0.01f, GLMouseCoordY - 0.01f);
glEnd(); |
|
|
|

|
| Опубликовано 30.07.2009 07:08 (16 лет назад) # |
из руд бука пример.
#include <glut.h>
#include <stdlib.h>
#include <stdio.h>
//Изменение размеров окна
void reshape(int w, int h)
{
glViewport(0,0,(GLsizei) w, (GLsizei) h);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluPerspective(45.0,(GLfloat) w/ (GLfloat) h,1.0,100.0);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
}
//Отображение
void display(void)
{
glClear(GL_COLOR_BUFFER_BIT);
glFlush();
}
//Реакция на мышь
void mouse(int button,int state,int x, int y)
{
GLint viewport[4];
GLdouble mvmatrix[16], projmatrix[16];
//y – координата в OpenGL
GLint realy;
//Возвращаемые объектные x, y, z координаты
GLdouble wx,wy,wz;
switch(button)
{
case GLUT_LEFT_BUTTON:
if (state==GLUT_DOWN)
{
glGetIntegerv(GL_VIEWPORT,viewport);
glGetDoublev(GL_MODELVIEW_MATRIX,mvmatrix);
glGetDoublev(GL_PROJECTION_MATRIX,projmatrix);
//viewport[3] - высоте окна в пикселях
realy=viewport[3]-(GLint)y-1;
printf("Координаты в позиции курсора (%4d,%4d)\n",x,realy);
gluUnProject((GLdouble)x,(GLdouble)realy,0.0,mvmatrix,projmatrix,viewport,&wx,&wy,&wz);
printf("Объектные координаты при z=0 (%f,%f,%f)\n",wx,wy,wz);
gluUnProject((GLdouble)x,(GLdouble)realy,1.0,mvmatrix,projmatrix,viewport,&wx,&wy,&wz);
printf("Объектные координатыпри z=1 (%f,%f,%f)\n",wx,wy,wz);
}
break;
case GLUT_RIGHT_BUTTON:
if (state==GLUT_DOWN)
exit(0);
break;
}
}
int main(int argc, char **argv)
{
glutInit(&argc,argv);
glutInitDisplayMode(GLUT_SINGLE|GLUT_RGB);
glutInitWindowSize(500,500);
glutInitWindowPosition(100,100);
glutCreateWindow("Reversing the Geometric Processing Pipeline");
glutDisplayFunc(display);
glutReshapeFunc(reshape);
glutMouseFunc(mouse);
glutMainLoop();
return 0;
}
надо
realy=viewport[3]-(GLint)y-1;
а у тебя
Yb = (float)viewport[3] - (float)MouseY;
и ещё ты Z координату выкинул...
gluUnProject( Xb, Yb, 0, modelview, projection, viewport, &GLX, &GLY, &modelview[0] );
|
|
|
|
Администратор

|
| Опубликовано 30.07.2009 07:49 (16 лет назад) # |
| Demilivor, если второе - функция отрисовки курсора, то всё правильно - он смещён на -4.1f |
|
|
|

|
| Опубликовано 30.07.2009 08:36 (16 лет назад) # |
Adler
z. координата мне не нужна.
realy=viewport[3]-(GLint)y-1; без нее тоже самое.
grouzdev
Да это функция отрисовки курсора
так вот, как избавиться от этой зависимости( от смещения ) я хочу чтобы функция работала независимо от любых преобразований, выдавала OpenGL позицию курсора. А моя функция после преобразований выдает с погрешностью. в данном случае -4.1f. |
|
|
|
Администратор

|
| Опубликовано 30.07.2009 08:53 (16 лет назад) # |
Demilivor, ты сначала выполняешь смещение (для рисования?), а потом находишь координаты мыши, должно быть наоборот. Т.е. нужно поменять glTranslatef и TransMouseCordsGL местами.
И ещё, когда что-то делаешь с матрицей, лучше бы её сохранять, а после рисования возвращать (см. glPushMatrix/glPopMatrix). |
|
|
|

|
| Опубликовано 30.07.2009 09:01 (16 лет назад) # |
| да смещение для рисования иначе просто не будет видно( если поменять glTranslatef с TransMouseCordsGL ) |
|
|
|
Администратор

|
| Опубликовано 30.07.2009 11:59 (16 лет назад) # |
| Demilivor, какую-то ты странную матрицу вида выставляешь, если ничего не видно. Сделай как в примере :) |
|
|
|

|
| Опубликовано 30.07.2009 12:12 (16 лет назад) # |
gluPerspective()
мешало :(( все заработало!!
но все же!! если кто нить сможет написать функцию которой будет по барабану любые преобразования в том числе gluPerspective() буду очень рад ))) |
|
|
|
Перейти на форум:
|
|
|