使用c ++单击OpenGL窗口时如何获取世界坐标

时间:2013-09-15 07:47:42

标签: visual-studio-2010 opengl mfc coordinates coordinate-systems

这是COpenGl Control类,到目前为止我用它来在MFC中完成我的项目。
我已经在这个类上编写了许多导航功能,如panzoom toolfixed zoom infixed zoom out等等,我也设法在其上渲染图像。 /> 在所有这些导航任务中,我都使用鼠标事件和opengl窗口坐标来实现 现在在项目的一部分(处理在shapefile的帮助下注册tiff图像)我需要使用世界坐标:
例如,假设我放大图像并单击一个点,我需要知道我缩放的图像的哪个像素而不是opengl窗口的像素。
或者假设,我放大在opengl中渲染的shapefile,然后单击一个点,我需要知道我点击的点的坐标是什么(例如65696.5577,43995.3245)米。

如何在opengl中实现这样的效果?

  • 当我点击时,如何获得渲染形状的世界坐标 opengl窗口没有窗口坐标?

1 个答案:

答案 0 :(得分:0)

我见过很多方法。

  • 如果您只对单击的WHICH对象感兴趣,则会有一些渲染过程,其中每个对象都呈现一种独特的颜色,并且单击鼠标下的像素。不能推荐,因为这可能不可靠,抗锯齿之类的东西会破坏它。如果每帧完成,性能不是那么热,因为GPU驱动程序必须等到完成绘图,停止将图像传回,然后继续。
  • 如果你有变换矩阵,你可以将鼠标光标位置转换为标准化设备坐标(-1:左/底,0:屏幕中间,1:右/顶 - 虽然我可能有顶部/底部混合在一起)并用Z为-1和1反转变换,让你可以进行碰撞的射线的开始和结束。如果你使用一些统一的网格类或者有办法迭代场景中的所有三角形,这很容易。
  • 作为上述两种方法的混合,从深度缓冲区获取深度,并且(您需要将其线性化)使用它在光线上的近点和远点之间进行插值。
  • 遍历场景中的每个三角形,将它们转换为规范化的设备坐标,然后将屏幕空间转换为(加一个,乘以屏幕宽度/高度,除以2),然后对三角形中的三角形进行三角形检查。屏幕空间。如果你在找到被碾过的三角形时保留了世界空间坐标,找到重心坐标并乘以每个顶点的位置。