刚学OPENGL没多久,如果大家也跟我一样的话,开发小程序的时候,可能面临着需要去点击某个按钮或某个区域。
这时候我们的处理方法一般是确认鼠标的当前位置,是否被这个区域所覆盖。例如鼠标放在某按钮上,该按钮会有颜色的变化,点击某按钮,激活某项功能。
网上搜很多的资料都有相关内容,不过我的功能是在WINDOS下的OPENGL环境中实现的,包括裁剪区域的坐标变换,窗口与视口的坐标变换,裁剪区域坐标与物理模型坐标的对应关系。
废话说了很多,上正文,该部分是在学习制作俄罗斯方块中加入按钮时搞的。
已知信息:
ASPECTRATIO 标准宽高比,根据自己的需要去定义。
wndWidth,wndHeight 窗口的宽度和高度
leftOrtho,rightOrtho,bottomOrtho,topOrtho 裁剪区域的左、右、底、顶
推导信息:
1. aspectRatio:当前窗口的宽高比
2. 符合标准宽高比,且最大程度适应当前窗口的视口信息:
a) 宽度和高度
if(aspectRatio >= ASPECTRATIO)
{
viewHeight = int(Wndheight);
viewWidth = int(Wndheight*(ASPECTRATIO));
}
else
{
viewWidth = int(Wndwidth);
viewHeight = int(Wndwidth/(ASPECTRATIO));
}
b) 原点信息(让视口显示区域居中)
viewPosX = int((wndWidth-viewWidth)/2);
viewPosY = int((wndHeight-viewHeight)/2);
3. 取得当前窗口鼠标的坐标
LPPOINT curpos = new POINT; //定义指向LPPOING类型数据的指针
HWND oWnd;
oWnd = GetActiveWindow(); //获取当前活动窗口的句柄
GetCursorPos(curpos); //获取鼠标相对整个屏幕的坐标(原点左上,XY向下向右)
ScreenToClient(oWnd,curpos); //获取鼠标相对当前窗口的坐标
4. 将当前窗口鼠标的坐标位置转换成模型矩阵坐标体系的位置(物理模型矩阵默认居中)
a) 获取当前鼠标坐标信息
int x,y;
x = curpos->x;
y = curpos->y;
b) 将当前坐标变换成原点在窗口左下角的坐标系坐标
x = x;
y = wndHeight – y;
c) 变换成view中的坐标(view中设左下为原点,XY向上向右)
x -= viewPosX;
y -= viewPosY;
d) 将view体系坐标转换成裁剪区域的坐标(裁剪区域依然是左下为原点,XY向上向右)
x = OrthoWidth * x / viewWidth;
y = OrthoHeight * y / viewHeight;
e) 将裁剪区域与物体模型坐标同步
x += leftOrtho;
y += bottomOrth;
完工!
将最后的xy与按钮的边界的xy值做比较,即可判定出鼠标是否移动到该按钮上。
通过