как получить относительную x и y позицию от щелчка мышью - PullRequest
2 голосов
/ 16 октября 2011

В моем обратном вызове мыши мне нужно выяснить, где кнопка mosue была нажата относительно источника (поэтому мне нужно значение от -1 до 1). В обратном вызове mosue GLint возвращает значение 400 или любую другую позицию xявляется.Как я могу получить относительную позицию x или как я могу преобразовать значение x?

void mouseClicked(GLint button,GLint state,GLint x,GLint y)
{
    if(button==GLUT_LEFT_BUTTON && state==GLUT_DOWN)
    {
        //get x of square clicked
        if(x<0.0)
        {
            cout<<"left side of the screen"<<endl;
        }
    }
}

Ответы [ 2 ]

1 голос
/ 16 октября 2011

При щелчке мыши отсутствует одна важная информация: глубина нажатия. Все, что у вас есть, это 2D точка на экране. Однако это соответствует лучу в сцене. Лучшее, что вы можете сделать, - это определить луч по щелчку мыши. Для этого вам необходимо отменить проецирование из области просмотра в некоторую точку на этом луче.

Для этого вам необходимо:

  1. инвертировать отображение области просмотра, т.е. отобразить координаты щелчка мыши в области просмотра обратно в диапазон [-1,1] по любой координате (это дает вам NDC), мы молча предполагаем, что глубина будет равна 1.

  2. не проектировать, то есть умножить NDC на глубину 1 путем умножения на матрицу обратной проекции

  3. просмотр не модели, т.е. умножить непроецированную точку путем умножения на матрицу обратного просмотра модели.

Если либо матрица проекции, либо матрица вида единичны, то есть не являются обратимыми, это не будет работать.

Библиотека GLU предлагает это, включая обращение матрицы в функции gluUnproject .

Результат - a точка на луче. Сам луч задается уравнением луча r (\ tau) = r_0 * tau, где r_0 - это та точка, которую вы получили.

0 голосов
/ 16 октября 2011

быстрый ответ на ваш вопрос будет выглядеть так:

void mouseClicked(GLint button,GLint state,GLint x,GLint y)
{
    // Convert x & y
    GLfloat fX = ((x/g_cxScreen) - 0.5) * 2;
    GLfloat fY = ((y/g_cyScreen) - 0.5) * 2;

    if(button==GLUT_LEFT_BUTTON && state==GLUT_DOWN)
    {
        //get x of square clicked
        if(x<0.0)
        {
            cout<<"left side of the screen"<<endl;
        }
    }
}

Это предполагает, что g_cxScreen и g_cyScreen - ширина и высота экрана соответственно. Это нормализует ваши координаты мыши.

...