繁体   English   中英

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

[英]how to get relative x and y position from mouse click

在我的鼠标回调中,我需要找出相对于原点单击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;
        }
    }
}

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

为此,您需要:

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

  2. 非投影,即通过与逆投影矩阵相乘将NDC与深度1相乘

  3. 非模型视图,即通过与反模型视图矩阵相乘来相乘非投影点。

如果投影矩阵或模型视图矩阵是奇异的,即不可逆,则将无法使用。

GLU库提供了此功能,包括在函数gluUnproject中进行矩阵求逆。

其结果是在光线点。 射线本身由射线方程r(\\ tau)= r_0 * tau给出,其中r_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分别是屏幕的宽度和高度。 这将使您的鼠标坐标正常化。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM