在我的鼠标回调中,我需要找出相对于原点点击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;
}
}
}
答案 0 :(得分:1)
鼠标单击缺少一个重要信息:您点击的深度。您拥有的只是屏幕上的2D点。但是,这会将 ray 映射到场景中。您可以做的最好的事情是确定鼠标点击的光线。为此,您需要从视口中取消投影到该光线上的某个点。
为此你需要:
反转视口映射,即将视口中的鼠标单击坐标映射回任一坐标中的范围[-1,1](这给你NDC),我们默默地假设深度为1。 / p>
取消项目,即通过乘以逆投影矩阵将NDC与深度1相乘
un-modelview,即将未投影点乘以逆模型视图矩阵。
如果投影或模型视图矩阵是单数,即不可逆,则不起作用。
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分别是屏幕宽度和高度。这将使鼠标坐标正常化。