如何通过鼠标单击获取相对x和y位置

时间:2011-10-16 17:58:01

标签: c++ opengl glut

在我的鼠标回调中,我需要找出相对于原点点击mosuebutton的位置(所以我需要-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 个答案:

答案 0 :(得分:1)

鼠标单击缺少一个重要信息:您点击的深度。您拥有的只是屏幕上的2D点。但是,这会将 ray 映射到场景中。您可以做的最好的事情是确定鼠标点击的光线。为此,您需要从视口中取消投影到该光线上的某个点。

为此你需要:

  1. 反转视口映射,即将视口中的鼠标单击坐标映射回任一坐标中的范围[-1,1](这给你NDC),我们默默地假设深度为1。 / p>

  2. 取消项目,即通过乘以逆投影矩阵将NDC与深度1相乘

  3. un-modelview,即将未投影点乘以逆模型视图矩阵。

  4. 如果投影或模型视图矩阵是单数,即不可逆,则不起作用。

    GLU库提供此功能,包括函数 gluUnproject 中的矩阵求逆。

    结果是光线上的 a 点。光线本身由光线方程r(\ tau)= r_0 * tau给出,其中r_0是你得到的一个点。

答案 1 :(得分:0)

快速回答你的问题就像这样:

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分别是屏幕宽度和高度。这将使鼠标坐标正常化。