`
xuela_net
  • 浏览: 494379 次
文章分类
社区版块
存档分类
最新评论

OPENGL 点击与选取的基础---坐标变换

 
阅读更多

刚学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值做比较,即可判定出鼠标是否移动到该按钮上。

通过

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics